PDO rowCount() Не работает на PHP 5.2.6+
Итак, я использую PHP PDO в качестве своего базового класса goto некоторое время, к сожалению, сегодня после отладки на клиентском сервере (с установленным PHP 5.2.6) я обнаружил this. Мы попытались перейти на новую стабильную версию (5.2.9), но проблема не устранена.
Кто-нибудь нашел обходное решение?
Ответы
Ответ 1
Единственный способ, которым базы данных могут подсчитать количество строк, - это запустить запрос и подсчитать количество строк.
Расширение mysql по умолчанию использует режим буферизованного запроса, который заставляет весь набор данных извлекаться в память до того, как элемент управления возвращается PHP, и он может начать обрабатывать строки.
PDO использует небуферизованный режим по умолчанию, что приводит к снижению времени ожидания загрузки страницы и, как правило, того, что вы хотите. Компромисс заключается в том, что rowCount() не будет возвращать достоверную информацию до тех пор, пока весь набор данных не будет извлечен.
Итак, как вы получаете этот счет?
Легко:
$q = $db->query("SELECT ...");
$rows = $q->fetchAll();
$rowCount = count($rows);
echo "There are $rowCount rows\n";
foreach ($rows as $row) {
print_r($row);
}
Но это отстой, потому что он запрашивает все строки вверх и делает загрузку страницы медленнее, у старого расширения mysql не было этой проблемы!?
Но именно то, что на самом деле делает старое расширение mysql под обложками; это единственный способ получить этот счет.
Ответ 2
Вы можете сделать это через MySQL самостоятельно, используя функцию FOUND_ROWS()
, не уверен, есть ли какие-то лучшие альтернативы.
Изменить: Кажется, что единственная причина, по которой это возможно в MySQL, - это то, что она внутренне извлекала все строки результатов и буферировала их, чтобы предоставить вам эту информацию. См. mysql_unbuffered_query()
. Если вы используете эту функцию вместо mysql_query()
, функция mysql_num_rows()
не будет работать. Если вам действительно нужно знать количество строк при использовании PDO, вы можете извлечь все строки из PDO в массив, а затем использовать count()
.
Ответ 3
Обратите внимание, что вы не должны использовать rowCount() для запросов SELECT, поскольку PDOStatement- > rowCount() возвращает количество строк, на которые повлиял последний оператор DELETE, INSERT или UPDATE, выполняемый соответствующим объектом PDOStatement.
Вместо этого вы можете использовать fetchAll() в массиве, а затем count().