Возможно ли опросить PDO, чтобы узнать, активны ли запросы? [Дубликат]

Причины, почему селекторы на основе id не работают

  1. Элемент / DOM с указанным идентификатором еще не существует.
  2. Элемент существует, но он не является зарегистрированный в DOM [в случае, если HTML-узлы динамически добавляются из ответов Ajax].
  3. Присутствует более одного элемента с тем же идентификатором, который вызывает конфликт.

Решения

  1. Попробуйте получить доступ к элементу после его объявления или, альтернативно, использовать такие вещи, как $(document).ready();
  2. . Для элементов, исходящих из ответов Ajax, используйте метод .bind() для jQuery. В старых версиях jQuery для этого было .live().
  3. Используйте инструменты [например, плагин webdeveloper для браузеров], чтобы найти дубликаты идентификаторов и удалить их.
28
задан user1032531 10 July 2013 в 17:07
поделиться

4 ответа

Клиентский протокол MySQL не позволяет выполнять более одного запроса. То есть вы выполнили запрос, и вы получили некоторые результаты, но не все, - тогда вы попытаетесь выполнить второй запрос. Если в первом запросе все еще есть строки для возврата, второй запрос получает ошибку.

Библиотеки клиентов обходятся этим путем выборки всех строк первого запроса неявно при первой выборке, а затем последующие выборки просто перебирают результаты внутри кэширования. Это дает им возможность закрыть курсор (насколько это касается сервера MySQL). Это «буферизованный запрос». Это работает так же, как и с использованием fetchAll (), поскольку оба случая должны выделять достаточно памяти в PHP-клиенте для хранения полного набора результатов.

Разница в том, что буферизованный запрос содержит результат в клиенте MySQL библиотеки, поэтому PHP не может получить доступ к строкам, пока вы не выберете () каждую строку последовательно. В то время как fetchAll () немедленно заполняет массив PHP для всех результатов, позволяя вам получить доступ к любой случайной строке.

Основная причина not использовать fetchAll () заключается в том, что результат может быть слишком большой, чтобы вписаться в ваш PHP memory_limit. Но кажется, что ваши результаты запроса имеют только одну строку, так что это не должно быть проблемой.

Вы можете закрытьCursor (), чтобы «отказаться» от результата, прежде чем вы выберете последнюю строку. Сервер MySQL получает уведомление о том, что он может отменить этот результат на стороне сервера, а затем вы можете выполнить другой запрос. Вы не должны закрыватьCursor (), пока не закончите заданный результирующий набор.

Также: я замечаю, что вы выполняете свой $ stmt2 снова и снова внутри цикла, но он вернет тот же результат каждый раз. По принципу перемещения цикла-инвариантного кода из цикла вы должны выполнить это один раз перед запуском цикла и сохранить результат в переменной PHP. Поэтому, независимо от использования буферизованных запросов или fetchAll (), вам не нужно вставлять ваши запросы.

Поэтому я бы рекомендовал написать ваш код таким образом:

$sql ='SELECT temp_id FROM temp1';
$stmt2 = db::db()->prepare($sql);
$stmt2->execute();
$rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
$stmt2->closeCursor();

$sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes 
      WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id';
$stmt1 = db::db()->prepare($sql);

foreach($data AS $row)
{
    try
    {
        $stmt1->execute($row);
        $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
        $stmt1->closeCursor();
        syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand());
        syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand());
    }
    catch(PDOException $e){echo(sql_error($e));}            
}

Примечание I также используют именованные параметры вместо позиционных параметров, что упрощает передачу $ row в качестве массива значений параметров. Если ключи массива соответствуют именам параметров, вы можете просто передать массив. В старых версиях PHP вам нужно было включить префикс : в ключи массива, но вам это больше не нужно.

В любом случае вы должны использовать mysqlnd. Он имеет больше возможностей, он более эффективен с точки зрения памяти, а его лицензия совместима с PHP.

47
ответ дан Bill Karwin 19 August 2018 в 14:42
поделиться

У меня почти такая же проблема. Мой первый запрос после подключения к db возвращает пустой результат и отбрасывает эту ошибку.

Мой код подключения:

try { 
    $DBH = new PDO("mysql:host=$hostname;dbname=$db_name", $username, $password, 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8; SET NAMES utf8",
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_NUM));
} 
catch(PDOException $e) { echo $e->getMessage(); }

Решение по-моему было удалить исходную команду:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8; SET NAMES utf8"

Здесь является правильным кодом:

try { 
    $DBH = new PDO("mysql:host=$hostname;dbname=$db_name", $username, $password, 
    array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_NUM));
} 
catch(PDOException $e) { echo $e->getMessage(); }

И MYSQL_ATTR_USE_BUFFERED_QUERY не принудительно соответствует true. Он установлен по умолчанию.

4
ответ дан oleg 19 August 2018 в 14:42
поделиться

У меня была та же проблема, я отправлял результаты в другую функцию mid loop. Быстрое исправление было, сохраните все результаты в массиве (например, Билл заявил, что если он слишком велик, у вас есть другие проблемы, о которых нужно беспокоиться), после сбора данных я запустил отдельный цикл для вызова функции по одному.

Кроме того, PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY не работал для меня.

1
ответ дан tand3m 19 August 2018 в 14:42
поделиться

Я надеюсь получить лучший ответ, чем следующее. Хотя некоторые из этих решений могут «исправить» проблему, они не отвечают на исходный вопрос о том, что вызывает эту ошибку.

  1. Установите PDO::ATTR_EMULATE_PREPARES=>true (я не хочу этого делать)
  2. Установите PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (не работает для меня)
  3. Используйте PDOStatement::fetchAll() (не всегда желательно)
  4. Используйте $stmt->closeCursor() после каждого $stmt->fetch() ] (это в основном работало, однако у меня все еще было несколько случаев, когда это не было)
  5. Измените PHP-библиотеку PHP с php-mysql на php-mysqlnd (возможно, что я буду делать, если не будет лучшего ответа) / g4]
7
ответ дан user1032531 19 August 2018 в 14:42
поделиться
  • 1
  • 2
    @rustyx благодарит за этот комментарий, именно это и вызывало мою проблему! Я выполнял обновления базы данных в цикле с помощью exec (), потому что мне не нужны возвращаемые данные (и для большинства запросов их не было нигде), но были фиктивные запросы, такие как SELECT DATABASE (), которые бросали исключение при выполнении следующий запрос, что очень затрудняет поиск и устранение этой проблемы. – jurchiks 14 September 2015 в 17:34
  • 3
    Используйте $ stmt- & gt; closeCursor () после каждого $ stmt- & gt; fetch () для меня. – Jam 31 May 2017 в 12:04
Другие вопросы по тегам:

Похожие вопросы: