【问题标题】:How to view db queries generated by TableGateway in Zend Framework 2如何在 Zend Framework 2 中查看 TableGateway 生成的 db 查询
【发布时间】:2012-11-07 18:09:20
【问题描述】:

我是 ZF2 的新手,我正在尝试使用 tableGateway 来管理和更新数据库中的条目。我可以毫无问题地选择和更新项目,但插入时出现错误。由于 tableGateway 类动态创建查询,我如何查看查询本身?

$this->tableGateway->insert($data);

执行过程中发生错误;请稍后再试。 附加信息: Zend\Db\Adapter\Exception\InvalidQueryException

文件:

/[redacted]/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Statement.php:220

消息:

Statement could not be executed

【问题讨论】:

    标签: zend-framework2


    【解决方案1】:

    只是一些通知@zdenek-machek 回答:

    1) 要分析数据库查询,还应安装BjyProfiler 模块。

    2) (如果你使用 PDO 则跳过)当我上次使用 BjyProfiler 时,mysqli 连接出现问题(buffer_results 选项未传递给 ProfilingStatement 类)。可能现在修好了,或者我设置的方式不对,但是我的补丁是在BjyProfiler/src/BjyProfiler/Db/Adapter/ProfilingAdapter.php中手动传递这个参数:

    case 'Zend\Db\Adapter\Driver\Mysqli\Mysqli':
        $statementPrototype = new Driver\Mysqli\ProfilingStatement($this->options['buffer_results']);
        break;
    

    3) ZendDeveloperTools 显示查询计数,但不列出它们。为了在页面底部列出,我通过以下方式修改了 view/zend-developer-tools/toolbar/toolbar.phtml:

    <!-- END Zend Developer Toolbar -->
    <?php
    $queryProfiles = $this->getHelperPluginManager()->getServiceLocator()
        ->get('Zend\Db\Adapter\Adapter')->getProfiler()->getQueryProfiles();
    
    echo '<ol>';
    foreach($queryProfiles as $queryObj)
    {
        $query = $queryObj->toArray();
        echo '<li>';
        echo '<b>' . ($query['elapsed']*1000) . '</b> ms<br/>';
        echo $query['sql'];
        if(count($query['parameters']))
        {
            echo '<br/><i>Parameters:</i> ';
            $list = array();
            foreach($query['parameters'] as $key => $value)
                $list[] = '?'. $this->escapeHtml($key)
                          ."='". $this->escapeHtml($value) ."'";
            echo implode(', ', $list);
        }
        echo '</li>';
    }
    echo '</ol>';
    

    【讨论】:

      【解决方案2】:

      就我而言,我只是在 try catch 中介绍了这一点:$e->__toString() 是关键

      try {
          this->tableGateway->insert($data);
      } catch (\Exception $e) {
          \Zend\Debug\Debug::dump($e->__toString()); exit;
      }
      

      【讨论】:

        【解决方案3】:

        查看数据库查询的非常优雅的方法是使用 zend-developer-tools。

        最简单的使用方法是通过将模块添加到composer.json文件中来安装模块

        ..... "repositories": [ { "type": "composer", "url": "http://packages.zendframework.com/" } ], "require": { "php": ">=5.3.3", "zendframework/zend-developer-tools": "dev-master" }

        see documentation

        【讨论】:

          【解决方案4】:

          对于我想要在 Dev 中做的事情,即确切知道哪些查询与我的流程中的每个步骤相关联,这就是我所做的(将 PDO 与 MySQL / MariaDB 一起使用):

          1. 我去了Statement课(vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Statement.php

          2. 我去了execute方法,就在它执行之前我放了:

            ...
            error_log("DebugQ: ".print_r($this->getSql(),1).", ".print_r($this->getParameterContainer()->getNamedArray(),1));
            try {
                $this->resource->execute();
            }
            ...
            

          我想要一个快速且一次性的解决方案,将查询记录在错误日志中。我能够获得所有查询及其条件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-15
            • 2013-03-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多