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);
}
4 ответа
Вам необходимо освободить ваше соединение, используя метод PDOStatement::closeCursor()
http://www.php.net/manual/en/pdostatement.closecursor.php
я верю
foreach($phones as $phone)
{
$stmt = db::getInstance()->prepare("CALL phones(:phone)");
$stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
$stmt->execute();
$stmt->closeCursor()
$result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}
должен сделать это для вас
Я столкнулся с этой проблемой из-за ошибки в моем предложении подключения PDO. Я пытался изменить часовой пояс при подключении:
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET time_zone = '$timezone';"
Я изменил это на:
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, time_zone = '$timezone';"
И это работало нормально.
Я сам столкнулся с этой проблемой, и проблема оказалась в использовании стековых запросов. Вышеуказанное решение не решило проблему.
Мы выполняли этот запрос прямо перед тем, который вызвал ошибку:
return $this->fquery('
SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value;
INSERT INTO sync_delete_value (...)
VALUES (%d, @follow_id, %d, "%s")',
$val1, $val2, $val3
);
Все возобновилось как обычно, когда я изменил это на:
$followId = $this->fquery('
SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value'
);
return $this->fquery('
INSERT INTO sync_delete_value (...)
VALUES (%d, %d, %d, "%s")',
$val1, $followId, $val2, $val3
);
Это своего рода псевдокод, но вы понимаете.
Если $stmt->closeCursor() не работает для вас (это не для меня), вы можете просто сбросить переменную $ stmt, чтобы освободить курсор, например так:
foreach($phones as $phone)
{
$stmt = db::getInstance()->prepare("CALL phones(:phone)");
$stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
$stmt->execute();
unset($stmt);
$result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}