Причины, почему селекторы на основе id не работают
Решения
$(document).ready();
.bind()
для jQuery. В старых версиях jQuery для этого было .live()
. Клиентский протокол 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.
У меня почти такая же проблема. Мой первый запрос после подключения к 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. Он установлен по умолчанию.
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8, NAMES utf8"
. Запятая как разделитель и не повторяя SET. установленный statement.html
– user
15 March 2016 в 09:41
У меня была та же проблема, я отправлял результаты в другую функцию mid loop. Быстрое исправление было, сохраните все результаты в массиве (например, Билл заявил, что если он слишком велик, у вас есть другие проблемы, о которых нужно беспокоиться), после сбора данных я запустил отдельный цикл для вызова функции по одному.
Кроме того, PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY не работал для меня.
Я надеюсь получить лучший ответ, чем следующее. Хотя некоторые из этих решений могут «исправить» проблему, они не отвечают на исходный вопрос о том, что вызывает эту ошибку.
PDO::ATTR_EMULATE_PREPARES=>true
(я не хочу этого делать) PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
(не работает для меня) PDOStatement::fetchAll()
(не всегда желательно) $stmt->closeCursor()
после каждого $stmt->fetch()
] (это в основном работало, однако у меня все еще было несколько случаев, когда это не было)
$stmt1->closeCursor();
и$stmt2->closeCursor();
избыточным, так как вы используетеfetchAll()
? – user1032531 12 July 2013 в 14:20