PDO «Неопределенное исключение« PDOException ». Невозможно выполнить запросы, пока другие небуферизованные запросы активны. Попробуйте использовать PDOStatement :: fetchAll (). »
Я знаю, что этот вопрос задавался много раз, но я прочитал ответы на многие вопросы и до сих пор не могу понять, почему я получаю эту ошибку:
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
решает проблему, но просто не делает, потому что яknow что все возвращенные строки читаются. Когда я использовалfetchAll
для запроса (он выполняется в цикле) я распечатал массив каждого цикла, и только один элемент был в массиве для каждого запроса в цикле.
Еще один кусок информации. Это не тот запрос, на который я изменилfetchAll
(которая устраняет ошибку), которая выдает ошибку PDO, есть другой запрос позже в моем php-файле, который выдает ошибку. Мой файл в основном так:
... code ...
query 1
... code ...
loop
query 2
end loop
... code ...
query 3
Если я закомментирую запрос 3, ошибки не будет. Если я закомментирую или поменяю наfetchAll
запрос 2, ошибки нет. запрос 1 не имеет никакого влияния.
Я также хотел бы добавить, что я пытался добавитьLIMIT 1
вall запросов на странице (в то же время), и ошибка все еще там. Я думаю, это доказывает, что в буфере нет непрочитанных данных, верно?
Я действительно запутался, поэтому буду признателен за ваш совет. Прежде чем кто-то спросит, я не могу опубликовать полный код для этого, но вот упрощенная версия моего кода:
$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?