私はこの問題をライブWebアプリケーションの1つで実行しました。 PHP PDOを介してMySQLに複数のステートメントクエリーを発行し、最初のステートメントがinsertステートメントで、2番目のステートメントがupdateステートメントである場合、PDO :: nextRowset()関数は正しい番号を返しません。結果セットの(PDOはおそらくPHP 5.3以降のMySQLのクエリごとに複数の文をサポートしていることに注意してください。)ここで 複数ステートメントクエリでPHP PDOエラーが発生しました
は例です: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
\ PDO –
を使用する必要があります。最初のクエリ呼び出しで複数のクエリを実行しないでください。 PDOが使用するPHP用のmysqlクライアントライブラリは、SQLインジェクション防止の防御としてこれをサポートしていません。 –
@LawrenceCherone – Phil