2009-04-20 4 views
5

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

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

+0

Я не уверен, что вы ищете, вы вызываете affected_rows() и возвращаете ноль для оператора select? Выбор не влияет на какие-либо строки. –

+0

Я искал эквивалент PDO mysql_num_rows() –

+0

в прошлом году, как вы решили? – Strae

ответ

6

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

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

+2

+1 Даже API MySQL C может сообщить вам количество строк, прежде чем извлекать их все. –

+0

well rowCount() запускается только ПОСЛЕ того, как вы получили результаты, поэтому я считаю, что они уже будут получены –

1

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

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

8

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

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

+1

У меня такая же проблема и «решена» с помощью 'fetchAll ... count()' trick. – Strae

+0

Я работаю над приложением и хочу полагаться на 'rowCount()', но не был уверен, почему он был ненадежным. Собирался задать вопрос, но ваш ответ более чем адекватно покрыл его. +1 к вам, сэр –

Смежные вопросы