首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ResultSet zend中缓冲未缓冲的ZF2?

如何在ResultSet zend中缓冲未缓冲的ZF2?
EN

Stack Overflow用户
提问于 2017-02-15 07:39:44
回答 1查看 834关注 0票数 0

我的Atlas类在col1值的非连续但连续的集合中执行递归数据探索,从MySQL table1$startingVal开始读取。极限$totalVal是任何给定会话期间工作单元的节流阀。在每个递归中,Atlas将从不同的表中检索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\Adapter\Driver\Mysqli\Result->count() #1 /path/vendor/Zend/zend-db/src/Adapter/Adapter.php(195): Zend\Db\ResultSet\吸入结果集-> initialize(Object(Zend\Db\Adapter\Driver\Mysqli\Result)) #2 /path/modules/Flightplan/src/Flightplan/Atlas.php(110):Zend\Db\Adapter\>查询(‘选择Col1.’,数组) #3 /path/utility.php(46): 飞行计划\阿特拉斯--肩部路线(‘30000001’,'1') #4 {main}抛入/path/vendor/Zend/zend-db/src/Adapter/Driver/Mysqli/Result.php 第316行

如果我正确地读取了错误和Zend源,Adapter将使用Mysqli\Result资源(默认情况下为非缓冲)初始化AbstractResultSet (默认情况下为缓冲),然后立即尝试对其进行计数,从而引发错误。这是在我通过Adapter进行第一次查询时,在递归之前发生的。

AbstractResultSet.php

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中指定这一点,例如:

$this->adapter = new Adapter( $this->configArray,null,new MyMysqliResult() );

编辑:将ResultInterface作为参数提供给Adapter,会抛出一个错误,因为Adapter需要一个ResultSet。但是,可以扩展AbstractResultSet,以便it在调用$ ResultSet ->count()之前调用$result>buffer(),然后从Adaper\Mysqli传递给它.

  1. (我想)我读到Zend\Adapter PDO_Mysql驱动程序/平台/结果在默认情况下是缓冲的。是否有理由不改用PDO?

编辑:切换到PDO_Mysql适配器\驱动程序会导致以下错误,我认为如果准备驱动程序提供的语句,这个错误可能会得到解决。

带有消息‘PDOException:语法错误或访问冲突: 1064您的SQL语法中有一个错误;检查与您的MySQL服务器版本对应的手册,以获得在第1行使用“1”的正确语法

  1. 我在这个答案中也看到过,result->getResource()->fetchAll();可能会在稍后的Atlas中提供帮助,但是在我获得这个机会之前,错误再次发生。

我遗漏了什么?谢谢-

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-09 07:19:42

在经历了几个月的问题和项目之后,我偶然发现了一个答案这里,它让我找到了同样的答案这里

代码语言:javascript
复制
    $config => array(
       ...
      'options' => array(
        'buffer_results' => true,
    ),

我在寻找这样的答案,显然我盯得太紧了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42243287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档