Сбой метода подготовки PDO в PHP во время цикла - PullRequest
0 голосов
/ 21 апреля 2009

С учетом следующего кода:

// Connect to MySQL up here

$example_query = $database->prepare('SELECT * FROM table2');
if ($example_query === false) die('prepare failed');

$query = $database->prepare('SELECT * FROM table1');
$query->execute();
while ($results = $query->fetch())
{
    $example_query = $database->prepare('SELECT * FROM table2');
    if ($example_query === false) die('prepare failed'); //it will die here
}

Я, очевидно, пытаюсь подготовить операторы для SELET все из таблицы 2 дважды. Второй (тот, что в цикле WHILE) всегда дает сбой и вызывает ошибку.

Это только на моем производственном сервере, локально развиваясь, у меня нет проблем, поэтому это должно быть где-то какая-то настройка.

Я сразу подумал, что в MySQL есть какая-то настройка max_connections, которая установлена ​​в 1, и соединение остается открытым до завершения цикла WHILE, поэтому, когда я пытаюсь подготовить новый запрос, он говорит: «Нет, слишком много подключено уже» и гадит.

Есть идеи?

РЕДАКТИРОВАТЬ: Да, я знаю, что нет необходимости делать это дважды, в моем реальном коде он готовится только в цикле WHILE, но, как я уже говорил, это не работает на моем рабочем сервере, поэтому после некоторого тестирования я обнаружил, что простой запрос SELECT * не выполняется в цикле WHILE, но не выходит из него. Код примера, который я привел, очевидно, очень упрощен, чтобы проиллюстрировать проблему.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2009

Проблема заключалась в том, что я не мог что-то сделать, пока выполнялся небуферизованный запрос (что было в цикле WHILE)

Было решено добавить следующую строку, чтобы гарантировать использование буферизованных запросов:

$database->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
0 голосов
/ 21 апреля 2009

Не должно быть необходимости готовить $ example_query более одного раза. Просто выполните запрос внутри вашего цикла.

РЕДАКТИРОВАТЬ: Если вы должны подготовить новый запрос в каждой итерации цикла, явное $ example_query-> closeCursor () в конце цикла должно освободить все ресурсы, связанные с объектом оператора. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...