Таким образом, я использую PHP PDO в качестве своего базового класса goto некоторое время, к сожалению, сегодня после отладки на сервере клиента (с установленным PHP 5.2.6) я это обнаружил. Мы попытались перейти на новейшую стабильную версию (5.2.9), но проблема не устранена.
Кто-нибудь нашел обходное решение?
Единственный способ, которым базы данных могут подсчитать количество строк, – это запустить запрос и подсчитать количество строк.
Расширение 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 под обложками; это единственный способ получить этот счет.
Вы можете сделать это через MySQL самостоятельно, используя FOUND_ROWS()
, не уверен, есть ли какие-то лучшие альтернативы.
Изменить. Кажется, единственная причина, по которой это возможно в MySQL, – это то, что она внутренне извлекала все строки результатов и буферизовала их, чтобы предоставить вам эту информацию. См. mysql_unbuffered_query()
. Если вы используете эту функцию вместо mysql_query()
, функция mysql_num_rows()
не будет работать. Если вам действительно нужно знать количество строк при использовании PDO, вы можете получить все строки из PDO в массив, а затем использовать count()
.
Обратите внимание: вы не должны использовать rowCount () для запросов SELECT, поскольку PDOStatement-> rowCount () возвращает количество строк, затронутых последним оператором DELETE, INSERT или UPDATE, выполняемым соответствующим объектом PDOStatement.
Вместо этого вы можете использовать fetchAll () в массив, а затем count ().