Я знаю, что этот вопрос задавали много раз, но я прочитал ответы на многие вопросы и до сих пор не могу понять, почему я получаю эту ошибку:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.'
Первое, что странно, это то, что я не получаю ошибку на моем локальном хосте (wampserver ), но я получаю ее на своем веб-сервере. Версия php на моем локальном хосте — 5.3.10, а на моем веб-сервере — 5.3.13.
Я читал, что источником этой ошибки является выполнение запроса, когда данные остались в буфере из предыдущего запроса.Это не относится ко мне --Я вывел все данные и точно знаю, что каждая строка, возвращаемая в запросе, извлекается.
С учетом сказанного я обнаружил, что изменение одного из моих запросов на fetchAll
вместо fetch
устраняет проблему, но это просто не делает, поскольку я знаю , что все возвращаемые строки читаются. Когда я использовал fetchAll
для запроса (, он выполняется в цикле ), я распечатывал массив в каждом цикле, и только один элемент был в массиве для каждого запроса в цикле.
Еще одна информация. Это не тот запрос, который я изменил наfetchAll
(что устраняет ошибку ), которая выдает ошибку PDO, позже в моем php-файле есть еще один запрос, который выдает ошибку. Мой файл в основном такой:
... code...
query 1
... code...
loop
query 2
end loop
... code...
query 3
Если я закомментирую запрос 3, ошибки не будет. Если я закомментирую или перейду на fetchAll
, запрос 2, ошибки не будет. запрос 1 ни на что не влияет.
Я также хотел бы добавить, что я пытался добавить LIMIT 1
к всем запросам на странице (одновременно ), и ошибка все еще там. Я думаю, это доказывает, что в буфере нет непрочитанных данных, верно?
Я действительно запутался, поэтому я был бы признателен за ваш совет. Прежде чем кто-то спросит, я не могу опубликовать полный код для этого, но вот упрощенная версия моего кода:
$stmt = $this->db->prepare('SELECT... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt = $this->db->prepare('SELECT... :par LIMIT 1');
for loop
makeQuery($stmt, array(':par' => $var));
$row2 = $stmt->fetch(PDO::FETCH_ASSOC);
... [use row2]...
end for loop
$stmt = $this->db->prepare('SELECT... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row3 = $stmt->fetch(PDO::FETCH_ASSOC);
Вот makeQuery()
.
/**************************************************************************************************************
* Function: makeQuery *
* Desc: Makes a PDO query. *
* Pre conditions: The statement/query and an array of named parameters (may be empty) must be passed. *
* Post conditions: The PDO query is executed. Exceptions are caught, displayed, and page execution stopped. *
**************************************************************************************************************/
function makeQuery($stmt, $array, $errMsg = '')
{
try
{
$stmt->execute($array);
}
catch (PDOException $e)
{
print $errMsg != ''?$errMsg:"Error!: ". $e->getMessage(). "<br/>";
die();
}
}
Спасибо за вашу помощь!
РЕДАКТИРОВАТЬ :Я также пытался сделать следующее после запроса 2 (, так как это кажется источником проблемы:
$row2 = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($row2);
Результат был:
bool(false)
Я наткнулся на ошибку PDO?