如何在ZF2 zend-db中缓冲无缓冲的ResultSet?

时间:2017-02-15 07:39:44

标签: zend-framework2 zend-db

我的Atlas类执行递归数据探索,给定一组非连续但连续的col1值,从table1开始从MySQL $startingVal读取。限制$totalVal是任何给定会话期间工作单位的限制。在每次递归时,Atlas将从不同的表中检索0到8(0-8)行。

  

致命错误:未捕获异常'Zend \ Db \ Adapter \ Exception \ RuntimeException'
       带有消息'无计数结果集中没有行计数。'        在/path/vendor/Zend/zend-db/src/Adapter/Driver/Mysqli/Result.php:316
      堆栈跟踪:
      #0 /path/vendor/Zend/zend-db/src/ResultSet/AbstractResultSet.php(65):
       的Zend \ DB \适配器\驱动\ mysqli的\ Result->计数()
      #1 /path/vendor/Zend/zend-db/src/Adapter/Adapter.php(195):
       的Zend \ DB \结果集\ AbstractResultSet->
       初始化(对象(的Zend \ DB \适配器\驱动\的mysqli \结果))
      #2 /path/modules/Flightplan/src/Flightplan/Atlas.php(110):        Zend \ Db \ Adapter \ Adapter->查询('SELECT col1 ...',Array)
      #3 /path/utility.php(46):
  Flightplan \ Atlas-> shoulder_routes('30000001','1')
      #4 {main}抛出/path/vendor/Zend/zend-db/src/Adapter/Driver/Mysqli/Result.php
       在第316行

如果我正在正确读取错误和Zend源,Adapter正在使用AbstractResultSet资源初始化Mysqli\Result(默认情况下缓冲)(默认情况下不缓冲),并且紧接着,试图计算它,这会引发错误。这是在我第一次通过适配器查询期间发生的,在递归之前。

AbstractResultSet.php

public function initialize($dataSource)
{
    // reset buffering
    if (is_array($this->buffer)) {
        $this->buffer = array();
    }

    if ($dataSource instanceof ResultInterface) {
        $this->count = $dataSource->count();         // line 65

Atlas.php:

use Zend\Db\Adapter\Adapter;

public function __construct( array $configArray = null ){
    ...
    $this->configArray = $configArray;
    $this->adapter = new Adapter( $this->configArray );
}
public function shoulder_routes( $startingVal, $totalVal ){
    ...
    $result = $this->adapter->query( 'SELECT col1 FROM table1 
        WHERE col1 >= ? LIMIT ?', array( $startingVal, $totalVal ));  // line 110
    $result->buffer(); // ADDED AFTER 1st error occurrence 
    ...
}

我添加了$result->buffer();,遗憾的是,因为错误发生在执行返回Atlas之前,这是无用的。

我该如何纠正这个?

  1. Mysqli\Result可以在初始化时设置为缓冲区。默认情况下,我是否使用缓存扩展Result,我是否会在Atlas中指定,例如:
  2. $this->adapter = new Adapter( $this->configArray,null,new MyMysqliResult() );

    编辑:提供ResultInterface作为适配器的参数引发错误,因为Adapter期望ResultSet。但是,有可能扩展AbstractResultSet,以便IT在从Adaper \ Driver \ Mysqli传递给它的ResultSet上调用$ result-> count()之前调用$ result-> buffer()...

    1. (我想)我在默认情况下读到了Zend \ Adapter PDO_Mysql驱动程序/平台/结果DOES缓冲区。有没有理由不改用PDO?
    2. 编辑:切换到PDO_Mysql Adapter \ Driver导致以下错误,如果我准备驱动程序提供的语句,我想这可能会解决

        

      带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在/path/vendor/Zend/zend-db/src/Adapter/Driver/Pdo/Statement.php的第1行''''附近使用正确的语法: 239

      1. 我也在this answer中看到result->getResource()->fetchAll();可能会在Atlas稍后提供帮助,但在我获得这个机会之前,错误再次发生。
      2. 我错过了什么?谢谢 -

1 个答案:

答案 0 :(得分:0)

在这个问题和项目进行了几个月之后,我偶然发现了一个回答here,它引出了我同样的答案here

    $config => array(
       ...
      'options' => array(
        'buffer_results' => true,
    ),

我一直在寻找这种答案,显然很难看。