2012-02-22 9 views
5

私はこの問題をライブ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

+0

\ PDO –

+3

を使用する必要があります。最初のクエリ呼び出しで複数のクエリを実行しないでください。 PDOが使用するPHP用のmysqlクライアントライブラリは、SQLインジェクション防止の防御としてこれをサポートしていません。 –

+2

@LawrenceCherone – Phil

答えて

4

私はこの問題についてPHP bug reportを提出し、可能なパッチが提出されました。だから、これはPHPのバグだったようです。

0
  1. まず、あなたは非選択動作について何でしょうnextRowset()が復帰を把握する必要があります。私は、更新後にそれをのvar_dumpしようとしている、と私はあなただけで1つの出力を取得する理由を説明することができますブール値(false)を、得た:

    $handle = $link->prepare('insert into testtable(id) values(1); 
            update testtable set id = 2 where id = ?; 
            select * from testtable where id = ?;'); 
    
  2. 第二に、私は以下のコードを置き換える:

    var_dump($h->nextRowset()); 
    var_dump($h->nextRowset()); 
    

    あなたのdo-whileセグメントでは、私はbool(false)bool(true)を取得しました。

    あなたの質問を上記のように説明するのが正しいかどうかわかりませんが、あなたに役立つかもしれません。

関連する問題