Ошибка PHP PDO в запросе с несколькими операторами - PullRequest
5 голосов
/ 22 февраля 2012

Я столкнулся с этой проблемой в одном из моих живых веб-приложений. Кажется, что если вы выполняете запрос с несколькими операторами в MySQL через PHP PDO, и первый оператор является оператором вставки, а второй оператор является оператором обновления, функция PDO :: nextRowset () не возвращает правильное число наборов результатов. (Обратите внимание, что PDO предположительно поддерживает несколько операторов на запрос MySQL начиная с PHP 5.3.)

Вот пример:

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());
?>

Кто-нибудь имеет представление о том, что я делаю неправильно? Почему я не могу поставить свой выбор в конце?

PHP 5.3.5

MySQL 5.1.54

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Я отправил сообщение об ошибке PHP об этой проблеме, и был отправлен возможный патч.Похоже, это была ошибка PHP.

0 голосов
/ 26 февраля 2012
  1. Сначала вы должны выяснить, что будет возвращать 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 = ?;');
    
  2. Во-вторых, я заменил следующеекоды:

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

    с вашим сегментом do-while, я получил bool (false) bool (true), ведьма означает, что он просто идет один раз в цикле.

    Я незнать, правильно ли объяснять ваш вопрос, как указано выше, может, он вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...