4

我是 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
4

4 回答 4

5

只是对@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>';
于 2012-11-19T07:11:35.830 回答
3

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

try {
    this->tableGateway->insert($data);
} catch (\Exception $e) {
    \Zend\Debug\Debug::dump($e->__toString()); exit;
}
于 2013-10-29T17:30:10.903 回答
2

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

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

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

见文档

于 2012-11-08T23:20:28.673 回答
0

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

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

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

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

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

于 2018-08-21T19:21:30.047 回答