如何在Zend Framework 2中查看TableGateway生成的数据库查询

时间:2012-11-07 18:09:21

标签: zend-framework2

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

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

执行期间发生错误;请稍后再试。 附加信息: 的Zend \ DB \适配器\异常\ InvalidQueryException

文件:

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

消息:

Statement could not be executed

4 个答案:

答案 0 :(得分: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>';

答案 1 :(得分:3)

在我的情况下,我刚刚在try catch中介绍了这个:$ e-&gt; __ toString()是关键

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

答案 2 :(得分: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" }

see documentation

答案 3 :(得分:-1)

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

  1. 我去了Statement类(library(dplyr) # option 1 df %>% group_by(id, torre) %>% mutate(n = n()) %>% group_by(id) %>% mutate(f = rank(n, ties.method = "first")) %>% filter(f == max(f)) %>% select(-n, -f) # option 2 df %>% group_by(id, torre) %>% mutate(n = n()) %>% distinct() %>% arrange(n) %>% group_by(id) %>% slice(n()) %>% select(-n)

  2. 我进入了execute方法,在执行该方法之前我放了:

    vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Statement.php

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