Zend framework2 如何在Zend Framework 2中查看TableGateway生成的db查询

Zend framework2 如何在Zend Framework 2中查看TableGateway生成的db查询,zend-framework2,Zend Framework2,我是ZF2的新手,正在尝试使用tableGateway来管理和更新数据库中的条目。我可以毫无问题地选择和更新项目,但插入时会出错。既然tableGateway类在运行中创建了查询,那么如何查看查询本身呢 $this->tableGateway->insert($data); 执行过程中发生错误;请稍后再试。 其他信息: Zend\Db\Adapter\Exception\InvalidQueryException 文件: 信息: Statement could not be exe

我是ZF2的新手,正在尝试使用tableGateway来管理和更新数据库中的条目。我可以毫无问题地选择和更新项目,但插入时会出错。既然tableGateway类在运行中创建了查询,那么如何查看查询本身呢

$this->tableGateway->insert($data);
执行过程中发生错误;请稍后再试。 其他信息: Zend\Db\Adapter\Exception\InvalidQueryException

文件:

信息:

Statement could not be executed

查看db查询的非常优雅的方法是使用zend developer工具

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


.....
“存储库”:[
{
“类型”:“作曲家”,
“url”:”http://packages.zendframework.com/"
}
],
“要求”:{
“php”:“>=5.3.3”,
“zendframework/zend开发工具”:“开发主机”
}


只是@zdenek machek的一些注意事项回答:

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

2) (如果使用PDO,请跳过)上次我使用
bjprofiler
时,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>';


在我的例子中,我刚刚在try-catch中介绍了这一点:$e->\uu-toString()是关键

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

在Dev中,我想做的是确切地知道哪些查询是与流程流中的每个步骤相关联的,这就是我所做的(使用PDO和MySQL/MariaDB):

  • 我转到Statement类(
    vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Statement.php

  • 我转到execute方法,在执行之前,我将:

    ...
    error_log("DebugQ: ".print_r($this->getSql(),1).", ".print_r($this->getParameterContainer()->getNamedArray(),1));
    try {
        $this->resource->execute();
    }
    ...
    
  • 我想要一个快速的一次性解决方案,将查询记录在错误日志中。我能够得到所有的查询及其条件

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