#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);
}