我的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
public function initialize($dataSource)
{
// reset buffering
if (is_array($this->buffer)) {
$this->buffer = array();
}
if ($dataSource instanceof ResultInterface) {
$this->count = $dataSource->count(); // line 65Atlas.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之前。
我该怎么纠正呢?
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传递给它.
编辑:切换到PDO_Mysql适配器\驱动程序会导致以下错误,我认为如果准备驱动程序提供的语句,这个错误可能会得到解决。
带有消息‘PDOException:语法错误或访问冲突: 1064您的SQL语法中有一个错误;检查与您的MySQL服务器版本对应的手册,以获得在第1行使用“1”的正确语法
result->getResource()->fetchAll();可能会在稍后的Atlas中提供帮助,但是在我获得这个机会之前,错误再次发生。我遗漏了什么?谢谢-
发布于 2017-05-09 07:19:42
在经历了几个月的问题和项目之后,我偶然发现了一个答案这里,它让我找到了同样的答案这里。
$config => array(
...
'options' => array(
'buffer_results' => true,
),我在寻找这样的答案,显然我盯得太紧了。
https://stackoverflow.com/questions/42243287
复制相似问题