Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDOStatement::nextRowSet()在Windows上的MySQL 5.6.16中被破坏_Php_Mysql_Windows_Pdo - Fatal编程技术网

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

Php PDOStatement::nextRowSet()在Windows上的MySQL 5.6.16中被破坏,php,mysql,windows,pdo,Php,Mysql,Windows,Pdo,在Windows上的MySQL版本5.6.16上以修改后的形式出现了MySQL的灾难性问题 这个问题很容易重复:我将其包括在这里(复制自上述链接问题,但修改适用于我的代码): 以下是存储过程测试的定义: DELIMITER $$ DROP PROCEDURE IF EXISTS `test`$$ CREATE PROCEDURE `test`() BEGIN SELECT 1; SELECT 2; SELECT 3; SELECT 4; END$$ DELIMITER ; 我的

在Windows上的MySQL版本5.6.16上以修改后的形式出现了MySQL的灾难性问题

这个问题很容易重复:我将其包括在这里(复制自上述链接问题,但修改适用于我的代码):

以下是存储过程测试的定义:

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]:常规错误

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

我发现两个链接似乎表明了这个问题,如下所示: 及


如果能确认这确实是Windows上MySQL版本5.6.16的一个bug,我将不胜感激。更重要的是,我希望有一个解决办法。谢谢。

如果问题是由多个结果集引起的,那么最好的解决方法可能是找到在一个查询中避免多个结果集的方法

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

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

否则,可以对每个选择执行单独的查询,并将结果交给函数进行处理

我对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();
}

“可以”()在结果集之间切换,但这需要将整个应用程序移动到另一个数据库交互层。为什么不能将所有这些字符串作为4个单独的查询运行?@silkfire我已更新了我的问题以添加重要的细节(很抱歉在我第一次发布问题时没有这样做)。现在的代码与我运行的代码完全相同。事实上,SQL是嵌入在存储过程中的。对于我的实际应用程序,查询要复杂得多,也不容易重构。@DanNissenbaum实际上我刚刚在我的WAMP安装上用MySQL 5.6.17尝试了你的代码,只要我使用
$pdo->setAttribute启用模拟的prepares(pdo::ATTR_EMULATE_prepares,true)
while ($objQuery->columnCount()) {
    $tab[] = $objQuery->fetchAll(\PDO::FETCH_ASSOC);
    $objQuery->nextRowset();
}