我在我的一个实时网络应用中遇到了这个问题。看来如果你通过PHP PDO向MySQL发出一个多语句查询,并且第一个语句是一个insert语句,而第二个语句是一个update语句,那么PDO :: nextRowset()函数不会返回正确的数字结果集(请注意,自PHP 5.3起,PDO应该支持每个MySQL查询的多个语句。)
以下是一个例子:
SQL:
create database `test`character set utf8 collate utf8_general_ci;
create table `test`.`testtable`( `id` int );
PHP:
<?php
$link = new \PDO('mysql:host=localhost;dbname=test', 'username', 'password');
//Run one of the 4 $handle assignments at a time (comment out all but one).
//Run #4 on an empty table to compare the results of #1 and #4.
//WORKS: INSERT, followed by SELECT, followed UPDATE
//Output:
//Rowset 1
//Rowset 2
//Results detected
$handle = $link->prepare(' insert into testtable(id) values(1);
select * from testtable where id = ?;
update testtable set id = 2 where id = ?;');
//WORKS: SELECT, followed by UPDATE
//Output:
//Rowset 1
//Results detected
$handle = $link->prepare('select * from testtable where id = ?;
update testtable set id = 2 where id = ?;');
//WORKS: UPDATE, followed by SELECT
//Output:
//Rowset 1
//Rowset 2
//Results detected
$handle = $link->prepare('select * from testtable where id = ?;
update testtable set id = 2 where id = ?;');
//DOESN'T WORK: INSERT, followed by UPDATE, followed by SELECT
//Output:
//Rowset 1
//Expected output: same as examples 1 and 3
$handle = $link->prepare('insert into testtable(id) values(1);
update testtable set id = 2 where id = ?;
select * from testtable where id = ?;');
$handle->bindValue('1', '1');
$handle->bindValue('2', '2');
$handle->execute();
$i = 1;
do{
print('Rowset ' . $i++ . "\n");
if($handle->columnCount() > 0)
print("Results detected\n");
}while($handle->nextRowset());
?>
有没有人知道我做错了什么?为什么我不能把我的select语句放在最后?
PHP 5.3.5
MySQL 5.1.54
答案 0 :(得分:4)
我提交了关于此问题的PHP bug report,并且已提交了可能的补丁。所以看起来这是一个PHP错误。
答案 1 :(得分:0)
首先,您必须弄清楚nextRowset()将返回非选择操作的内容。我在更新后尝试过var_dump,我得到了bool(false),这可以解释为什么你只得到一个输出:
$handle = $link->prepare('insert into testtable(id) values(1);
update testtable set id = 2 where id = ?;
select * from testtable where id = ?;');
其次,我更换了以下代码:
var_dump($h->nextRowset());
var_dump($h->nextRowset());
你的do-while段,我得到bool(假)bool(true),女巫意味着它只是在循环中进行一次。
我不知道如上所述解释你的问题是否正确,可能对你有帮助。