PDO Не может выполнять запросы, пока активны другие небуферизованные запросы

Я знаю, что это должно быть простое исправление, и я частично понимаю, почему я получаю эту ошибку, но не знаю, как ее исправить. Я просмотрел документы, но не могу найти решения, кроме использования опции буферизованных запросов. Я тоже пробовал это, но это не работает.

Ошибка: PDO не может выполнять запросы, пока активны другие небуферизованные запросы.

Ошибка исходит из строки, где я строю массив $result.

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

person Jim    schedule 14.01.2010    source источник
comment
Есть ли причина, по которой вы не используете параметр OUT?   -  person VolkerK    schedule 14.01.2010
comment
Да, потому что выходные параметры предназначены только для вывода одной строки. В моем случае мне нужно несколько строк.   -  person Jim    schedule 14.01.2010
comment
Вы можете вернуть наборы результатов из процедуры.   -  person VolkerK    schedule 14.01.2010
comment
Хм.. У вас случайно нет ссылки на это? Вчера я прочитал на сайте MySQL, что параметры out будут выводить только одну строку. Если, конечно, я говорю о чем-то совсем другом. Не могли бы вы иметь под рукой процедуру, чтобы показать, что это будет делать? Спасибо.   -  person Jim    schedule 14.01.2010
comment
да... в данном случае это не выходной параметр. Смотрите мой ответ. Не совсем то, что вы просили ... но, возможно, то, что вы хотите =)   -  person VolkerK    schedule 14.01.2010


Ответы (1)


Возьмем пример таблицы

CREATE TABLE foo (
  id int auto_increment,  
  phone int,  
  primary key(id),  
  unique key(phone)  
)

пример процедуры

delimiter //
CREATE PROCEDURE phones(in p INT)
BEGIN
  SELECT phone FROM foo WHERE phone > p;
END//
delimiter ;

и некоторые примерные данные

INSERT INTO foo (phone) VALUES (1),(2),(3),(4),(5)

Используя PDOStatement, можно получить набор результатов из хранимой процедуры.

$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $pdo->prepare("CALL phones(:phone)");
$stmt->bindParam(':phone', $phone);
$phone = 1;
$stmt->execute();
do {
  echo "\nresult set: ";
  while($row=$stmt->fetch()) {
    echo $row['phone'], " | ";
  }
} while($stmt->nextRowset());

печатает result set: 2 | 3 | 4 | 5 |

(тестовая среда: php 5.3.1/winxp, mysql 5.1.37)

Цикл do { } while($stmt->nextRowset());, вероятно, также решает вашу «исходную» проблему.

person VolkerK    schedule 14.01.2010
comment
Вплоть до тестовой среды. :) Какой парень. Спасибо за усилия, Волкер. Все, что я делаю, определенно ошибочно. Я попробовал ваш пример, и он работает. Это именно то, что мне нужно, поэтому мне нужно сравнить мой код с вашим, чтобы увидеть, где я ошибаюсь. Я чувствую, что моя проблема в моей процедуре, а не обязательно в PHP. Большое спасибо за ваши усилия, это действительно помогло мне! - person Jim; 14.01.2010
comment
Если проблема остается, другие небуферизованные запросы активны, попробуйте while($stmt->nextRowset()) {} сразу после $stmt->execute(). Он должен очищать/очищать/освобождать любой активный набор результатов. - person VolkerK; 14.01.2010
comment
Я попытался запустить тот же оператор «do-while» в паре с моим кодом, но я получаю сообщение об ошибке на своем компьютере XAMPP, говорящее, что эта функция недоступна. Какие-либо предложения? - person JM4; 09.02.2011
comment
@ JM4 - Пожалуйста, опубликуйте точное (полное) сообщение, которое вы получаете вместе с версией + php, которую вы используете, в качестве нового вопроса. - person VolkerK; 09.02.2011
comment
@VolkerK - всего на пару лет опоздал, увидев это. Ха. Я даже не могу вспомнить, в чем здесь была проблема, но похоже, что новые запросы не могут выполняться в цикле результатов из хранимой процедуры (использование буферизованного запроса не помогает). Жаль, что мне не нужно было получать все результаты - person JM4; 03.10.2013