как устранить общую ошибку: 2014 не удается выполнить запросы, пока активны другие небуферизованные запросы. использование PDO-соединения

#php #mysql #pdo

#mysql #pdo

Вопрос:

Пока я выполняю вторую хранимую процедуру с тем же оператором подключения (используя PDO), получаю приведенную ниже ошибку.

=================================================

SQLSTATE[HY000]: Общая ошибка: 2014 не удается выполнить запросы, пока активны другие небуферизованные запросы. Рассмотрите возможность использования PDOStatement::fetchAll(). В качестве альтернативы, если ваш код будет выполняться только с mysql, вы можете включить буферизацию запросов, установив атрибут PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.

=======================================================

Это мой код в drupal

 $conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

$statement = $conn->prepare("CALL Odd_Get_Sport()");
$exec_result = $statement->execute();
while ($row = $statement->fetchObject()) {   
  print_r($row);
}


$statement ->closeCursor();

$statement1 = $conn->prepare("CALL Odd_Get_Sport()");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}
  

Помогите мне в этом.

Комментарии:

1. Иногда ошибка подзапроса или подзапрос, возвращающий более 1 строки, может вызвать эту ошибку

Ответ №1:

Это немного плохая функция PDO, которая плохо документирована. Метод closeCursor не работает, когда оператор выполнил хранимую процедуру. Вам нужно использовать метод nextRowSet. Вот что я использую

             while($sth->nextRowSet())
        {
            $sth->fetchAll();
        }
        $sth->closeCursor();
  

Ответ №2:

Просто установите для него значение null перед каждой подготовкой

 $statement1=null;
$statement1 = $conn->prepare("CALL Odd_Get_Sport()");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}

$statement1=null;
$statement1 = $conn->prepare("CALL Another()");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}

$statement1=null;
$statement1 = $conn->prepare("SELECT * FROM test");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}