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().