Подтвердить что ты не робот

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);
}
4b9b3361

Ответ 1

Вам нужно освободить свое соединение, используя метод 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);
}

должен сделать это за вас

Ответ 2

Я столкнулся с этой проблемой из-за ошибки в моем предложении PDO connection. Я пытался изменить часовой пояс при подключении:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET time_zone = '$timezone';"

Я изменил его на:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, time_zone = '$timezone';"

И он отлично работал.

Ответ 3

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

У нас был этот запрос, запущенный прямо перед тем, который вызвал ошибку:

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

);

Он сортирует псевдокод, но вы получаете точку.

Ответ 4

Если $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);
}