RowCount () PDO не работает на PHP 5.2.6+ - PullRequest
5 голосов
/ 20 апреля 2009

Так что я уже некоторое время использую PDO PHP в качестве своего класса перехода к базе данных, к сожалению сегодня, после некоторой отладки на сервере клиента (с установленным PHP 5.2.6), я обнаружил это . Мы попытались перейти на последнюю стабильную версию (5.2.9), но проблема сохраняется.

Кто-нибудь нашел обходной путь?

Ответы [ 3 ]

10 голосов
/ 22 августа 2009

Единственный способ, которым базы данных могут подсчитать количество строк, - выполнить запрос и подсчитать количество строк.

Расширение mysql по умолчанию использует режим буферизованного запроса, который заставляет весь набор данных извлекаться в память до того, как элемент управления возвращается в PHP, и он может начать обрабатывать строки.

PDO по умолчанию использует небуферизованный режим, что приводит к снижению задержки при загрузке страницы и обычно является тем, что вам нужно. Компромисс в том, что rowCount () не будет возвращать достоверную информацию, пока не будет получен весь набор данных.

Так как вы можете получить этот счет?

Easy:

$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 под прикрытием; это единственный способ получить этот счет.

6 голосов
/ 21 апреля 2009

Вы можете сделать это через сам MySQL, используя функцию FOUND_ROWS() , не зная, есть ли лучшие альтернативы.

Редактировать: Кажется, что единственная причина, по которой это было возможно с MySQL, заключается в том, что он извлекал все строки результатов и буферизовал их внутри, чтобы иметь возможность предоставить вам эту информацию. См. mysql_unbuffered_query(). Если вы используете эту функцию вместо mysql_query(), функция mysql_num_rows() не будет работать. Если вам действительно нужно знать количество строк при использовании PDO, вы можете извлечь все строки из PDO в массив и затем использовать count().

1 голос
/ 22 мая 2009

Обратите внимание, что вы не должны использовать rowCount () для запросов SELECT, поскольку PDOStatement-> rowCount () возвращает количество строк, затронутых последним оператором DELETE, INSERT или UPDATE, выполненным соответствующим объектом PDOStatement.

Вместо этого вы можете использовать fetchAll () в массиве, а затем count ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...