【问题标题】:php zend framework log mysql queriesphp zend 框架日志 mysql 查询
【发布时间】:2011-09-06 15:04:10
【问题描述】:

我正在尝试在脚本运行时记录 sql 查询。我正在使用 zend 框架,并且我已经检查了 zend db profiler,这没有用,因为它显示“?”对于插入查询中的值..我需要实际值本身,以便可以将其记录在文件中。我对更新查询使用 getAdapter()->update 方法,所以我不知道是否有办法获取查询并记录它。如果有办法记录查询,请告诉我。

问候

【问题讨论】:

    标签: php mysql zend-framework


    【解决方案1】:

    来自http://framework.zend.com/manual/en/zend.db.profiler.html

    getLastQueryProfile() 的返回值和getQueryProfiles() 的各个元素是Zend_Db_Profiler_Query 对象,它们提供了检查各个查询本身的能力:

    • getQuery() 返回查询的 SQL 文本。带参数的预处理语句的 SQL 文本是查询准备时的文本,因此它包含参数占位符,而不是执行语句时使用的值。

    • getQueryParams() 返回执行准备好的查询时使用的参数值数组。这包括绑定参数和语句的 execute() 方法的参数。数组的键是位置(基于 1)或命名(字符串)参数索引。

    当您使用 Zend_Db_Profiler_Firebug 时,它还会在 Firebug 控制台中向您显示返回页面上的查询以及任何绑定参数。

    【讨论】:

    • 感谢@Gordon,但我要从命令行运行它,所以我在 firebug 中看不到它……还有其他方式吗?
    • @Jay 是的,使用 getQueryParams() 就像引用中所说的那样。
    • 我使用了这个,但是当我运行脚本时它只显示数组..但是当我使用 getQuery() 时,我看到了 sql 语句
    • 对不起,我应该很清楚,我使用了 print_r,但我看到数组的值像 Array([1]=>test [2]=>name....)..它没有显示查询中的值,以便我可以复制查询..使用 getQuery() 它显示为 INSERT INTO....
    • @Jay 是的,你必须手动完成。绑定参数在执行之前不会插入到查询中。这只会发生在您的数据库系统内部。
    【解决方案2】:

    我知道您已经得到了答案,但仅供参考... 我已经浏览了数百页,搜索了很多,但我没有找到任何确切的解决方案。 最后这对我有用。无论您在控制器或模型中的哪个位置。这段代码在任何地方都对我有用。就用这个

    //Before executing your query
    $db = Zend_Db_Table_Abstract::getDefaultAdapter();
    $db->getProfiler()->setEnabled(true);
    $profiler = $db->getProfiler();
    
    // Execute your any of database query here like select, update, insert
    //The code below must be after query execution
    $query  = $profiler->getLastQueryProfile();
    $params = $query->getQueryParams();
    $querystr  = $query->getQuery();
    
    foreach ($params as $par) {
        $querystr = preg_replace('/\\?/', "'" . $par . "'", $querystr, 1);
    }
    echo $querystr;
    

    最后这件事对我有用。

    【讨论】:

      【解决方案3】:

      MySQL 保留了一些日志。

      最值得注意的是:

      二进制日志(所有查询)
      慢查询日志(执行时间超过 x 时间的查询)

      见:http://dev.mysql.com/doc/refman/5.0/en/server-logs.html

      【讨论】:

      • +1 我也更喜欢这种方式,但如果使用准备好的语句,我认为它不会显示实际值。
      • @Adrian,二进制日志包含所有更新和插入语句的所有值。它正确处理准备好的语句,并在最终执行时将它们存储在二进制日志中。
      猜你喜欢
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多