在Windows上的MySQL 5.6.16中,PDOStatement :: nextRowSet()被破坏

没有被接受的答案这个问题提出了一个MySQL的灾难性的问题,我正在经历一个修改后的forms在Windows上的MySQL版本5.6.16。

这个问题很容易重现:我把它包含在这里(从上面链接的问题中复制,但适用于我的代码的更改):

$pdo = /* connection stuff here */ $sql = "call test();"; // call stored procedure - see below $statement = $connection->query($sql); do { $rowset = $statement->fetchAll(PDO::FETCH_ASSOC); if($rowset) { // Do stuff with $rowset } } while($statement->nextRowset()); 

这里是存储过程test的定义:

 DELIMITER $$ DROP PROCEDURE IF EXISTS `test`$$ CREATE PROCEDURE `test`() BEGIN SELECT 1; SELECT 2; SELECT 3; SELECT 4; END$$ DELIMITER ; 

我的代码和上面链接的代码之间的唯一区别是我将SQL查询打包到存储过程中。

在我的情况下, while语句返回true四次,而不是三次(应该只是三次)。 在第四次之后, fetchAll(...)会抛出一个SQLSTATE[HY000]: General error错误。

不幸的是,这个问题是灾难性的。 除了使用nextRowSet()函数之外,PDO没有其他方式可以迭代到以下行集。 因此,为了解决这个问题,我可以回到以前的MySQL版本。

我发现两个链接似乎表明这个问题,列在这里: https : //bugs.php.net/bug.php? id =67130和http://permalink.gmane.org/gmane.comp.php.devel / 81518

我将不胜感激,确认这确实是Windows上MySQL 5.6.16版本的错误。 更多的,我将不胜感激一个解决方法。 谢谢。

Solutions Collecting From Web of "在Windows上的MySQL 5.6.16中,PDOStatement :: nextRowSet()被破坏"

我与PDO :: nextRowset()有同样的问题,因为即使没有更多的行集可用,它也会返回true,因此当调用fetchAll()时,会引发异常HY000。 (在PHP 5.5.12 windows,Mysql 5.5.17 linux上测试)

解决此问题的方法是在提取行集之前使用方法PDO :: columnCount()检查列的数量。 如果它是非零的,你有一个有效的行集,因此你可以调用PDO :: fetchAll()。

即使PDO :: nextRowset()报告为true,columnCount()也会在移动到下一个行集之前报告列数。

例:

 while ($objQuery->columnCount()) { $tab[] = $objQuery->fetchAll(\PDO::FETCH_ASSOC); $objQuery->nextRowset(); } 

如果问题是由多个结果集引起的,那么也许最好的解决方法就是找到在单个查询中避免多个结果集的方法。

例如,如果预期的结果是相同的格式(我期望它们可能是因为你打算使用相同的代码来处理所有这些),那么你可以使用UNION来将这四个查询合并在一起。

 SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4; 

如果不这样做,您可以为每个SELECT执行一个单独的查询,并将结果交给一个函数来处理。