2012-08-23 3 views
0

Я пытаюсь получить количество элементов с PDO (в таблице MySql). Я где-то читал, что rowCount не работает на MySql. Это верно?PHP, PDO Count on mysql

До сих пор я определенно не могу заставить его работать, поскольку я продолжаю получать count = 0.

Может ли кто-нибудь дать мне представление, чтобы я не мог каждый раз возвращаться к db? У меня есть несколько запросов, которые выглядят подобно этому:

$items = $con -> prepare("SELECT * FROM item_descr ORDER BY $sortBy DESC"); 
    $count = $items -> rowCount(); 
    $items -> execute(); 
while($info = $items->fetch(PDO::FETCH_ASSOC)) { ... } 

Я хочу, чтобы попытаться избежать дополнительного запроса с SELECT COUNT (*)

Спасибо!

ответ

7

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

1

rowCount только работает после execute. У меня никогда не было проблемы с rowCount в MySQL.

Использование rowCount приятно, но вы также можете использовать свою собственную переменную счетчика, если вы все равно собираетесь перебирать результаты.

2

Как, @deceze указано,

$items = $con -> prepare("SELECT * FROM item_descr ORDER BY $sortBy DESC"); 
$items -> execute(); 
$count = $items -> rowCount(); 
while($info = $items->fetch(PDO::FETCH_ASSOC)) { ... } 
0

Вы можете упростить код так много, если вы используете PDO, такие как:

$items = $conn->query("SELECT * FROM item_descr ORDER BY $sortBy DESC")->fetchAll(PDO::FETCH_ASSOC); 

if(count($items)) 
{ 
    // You can count the array to see how many records you got and you can iterate trough it using foreach/for loops 
} 
else 
{ 
    // 0 records returned 
} 

Там нет необходимости для подготовленных заявлений в данном конкретном или проверили, получили ли вы какие-либо строки с помощью rowCount. Это правда, что rowCount МОЖЕТ сбой даже в MySQL, все зависит от того, используете ли вы небуферизованные запросы или нет.

+0

Использование одного слоя, например, означает, что вы немедленно перекачиваете все данные в массив PHP и, следовательно, в память сразу. Это может быть огромная проблема с производительностью, в зависимости от объема данных. – deceze

+0

Я не сказал, что это хорошо или плохо, это основано на том, что ОП спросил - конечно, это определенно ** IS ** потенциальная дыра, однако это связано с самим запросом, а не с базовым кодом PHP. –

1

Просто, чтобы добавить все это, пожалуйста, обратитесь к документации PHP:

http://www.php.net/manual/en/pdostatement.rowcount.php

В частности:

Для большинства баз данных, PDOStatement :: ROWCOUNT() делает не возвращать количество строк, на которые влияет инструкция SELECT. Вместо этого используйте PDO :: query() для выдачи оператора SELECT COUNT (*) с теми же предикатами, что и ваш запрошенный оператор SELECT, а затем используйте PDOStatement :: fetchColumn(), чтобы получить количество строк, которое будет возвращено. Затем ваше приложение может выполнить правильное действие.

И пример из указанной страницы:

<?php 
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100"; 
if ($res = $conn->query($sql)) { 

    /* Check the number of rows that match the SELECT statement */ 
    if ($res->fetchColumn() > 0) { 

     /* Issue the real SELECT statement and work with the results */ 
     $sql = "SELECT name FROM fruit WHERE calories > 100"; 
     foreach ($conn->query($sql) as $row) { 
      print "Name: " . $row['NAME'] . "\n"; 
     } 
    } 
    /* No rows matched -- do something else */ 
    else { 
     print "No rows matched the query."; 
    } 
} 

$res = null; 
$conn = null; 
?> 
-1

Это работает для меня:

$my_query = $db->query('SELECT COUNT(*) AS Count FROM the_table'); 
$c = $my_query->fetch(PDO::FETCH_OBJ); 

return $c->Count; 
-1

PDOStatement :: ROWCOUNT() возвращает количество строк, только пострадавших от DELETE, INSERT , или UPDATE.

Для большинства баз данных PDOStatement :: rowCount() не возвращает количество строк, на которые влияет инструкция SELECT. Вместо этого используйте PDO :: query() для выдачи оператора SELECT COUNT (*) с теми же предикатами, что и ваш запрошенный оператор SELECT, а затем используйте PDOStatement :: fetchColumn(), чтобы получить количество строк, которое будет возвращено. Затем ваше приложение может выполнить правильное действие.