Количество строк с PDO

Существует много противоречивых утверждений. Каков наилучший способ подсчета строк с использованием PDO в PHP? Перед использованием PDO я просто использовал mysql_num_rows.

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

Есть ли у вас какие-либо предложения?

+161
источник поделиться
22 ответа
$sql = "SELECT count(*) FROM `table` WHERE foo = bar"; 
$result = $con->prepare($sql); 
$result->execute(); 
$number_of_rows = $result->fetchColumn(); 

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

PDO имеет PDOStatement::rowCount(), который, по-видимому, работает не в MySql. Какая боль.

Из документа PDO:

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

EDIT: приведенный выше пример кода использует подготовленный оператор, который во многих случаях, вероятно, не нужен для подсчета строк, поэтому:

$nRows = $pdo->query('select count(*) from blah')->fetchColumn(); 
echo $nRows;
+230
источник

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

Итак, в PDO ваши варианты:

  • Используйте функцию MySQL FOUND_ROWS().
  • Используйте функцию PDO fetchAll() для извлечения всех строк в массив, а затем используйте count() на ней.
  • Сделайте дополнительный запрос к SELECT COUNT(*), как предположил karim79.
+78
источник
другие ответы

Связанные вопросы


Похожие вопросы

Это очень поздно, но я столкнулся с проблемой, и я это делаю:

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

Это действительно просто и легко.:)

+19
источник

Перед использованием PDO я просто использовал mysql_num_rows().

Вы не должны были использовать его.

mysql_num_rows(), а также PDOStatement::rowCount() подразумевает, что вы уже выбрали свои данные. В этом случае для такой функции возможны только два возможных варианта использования:

  • Вы выбрали свои данные, чтобы получить счет.
  • Вы хотите знать, возвращал ли ваш запрос любые строки.

И первый никогда не должен использоваться вообще. Никогда не следует выбирать строки для их подсчета, так как ваш сервер действительно может задохнуться из-за возврата большого набора данных.

Кроме того, выбор строк только для их подсчета просто не имеет смысла. Вместо этого должен выполняться запрос count(*), с возвратом только одной строки.

Второй вариант использования менее пагубный, но не бессмысленный: в случае, если вам нужно знать, вернул ли ваш запрос какие-либо данные, у вас всегда есть данные!

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

$stmt->execute();
$row = $stmt->fetch();
if ($row) { // here! as simple as that
}

Если вам нужно получить много строк, вы можете использовать fetchAll().

fetchAll() - это то, чего я не хочу, поскольку иногда я могу иметь дело с большими наборами данных

Обратите внимание, что в веб-приложении вы никогда не должны выбирать огромное количество строк. Должны быть выбраны только строки, которые будут фактически использоваться на веб-странице. Для чего необходимо использовать LIMIT или аналогичное предложение в SQL. И для такого умеренного объема данных все в порядке использовать fetchAll()

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

Итак, вы видите, нет никакого случая ни для rowCount(), ни для дополнительного запроса, чтобы его заменить, как это предлагается в принятом ответе.

+18
источник

В итоге я использовал это:

$result = $db->query($query)->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo $row['blah'] . '<br />';
    }
} else {
    echo "<p>Nothing matched your query.</p>";
}
+16
источник

Это сообщение старое, но получение числа строк в php с PDO прост

$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
+8
источник

Это старое сообщение, но разочарование ищет альтернативы. К сожалению, PDO испытывает недостаток в этой функции, особенно потому, что PHP и MySQL имеют тенденцию идти рука об руку.

Есть неудачный недостаток в использовании fetchColumn(), поскольку вы больше не можете использовать этот набор результатов (эффективно), поскольку fetchColumn() перемещает иглу в следующую строку. Например, если у вас есть результат, похожий на

  • фруктового > Banana
  • фруктового > Apple,
  • фруктовое > Orange

Если вы используете fetchColumn(), вы можете узнать, что есть три возвращенных плода, но если теперь вы пройдете через результат, у вас будет только два столбца. Цена fetchColumn() - это потеря первого столбца результатов просто чтобы узнать, сколько строк было возвращено. Это приводит к небрежному кодированию, и при условии, что они полностью исключены.

Итак, теперь, используя fetchColumn(), вы должны реализовать и полностью новый вызов и запрос MySQL, чтобы получить новый рабочий набор результатов. (который, надеюсь, не изменился со времени вашего последнего запроса), я знаю, маловероятно, но это может произойти. Кроме того, накладные расходы на двойные запросы при проверке количества строк. Что для этого примера мало, но разбор 2 миллионов строк в объединенном запросе, а не приятная цена для оплаты.

Я люблю PHP и поддерживаю всех, кто участвует в его разработке, а также сообщество в целом, используя PHP на ежедневной основе, но на самом деле надеюсь, что это будет рассмотрено в будущих выпусках. Это "действительно" моя единственная жалоба с PHP PDO, которая в противном случае является отличным классом.

+5
источник

Отвечая на это, потому что я оказался в ловушке себя, зная это и, возможно, это будет полезно.

Имейте в виду, что вы не можете получить результаты дважды. Вы должны сохранить результат выборки в массив, получить количество строк на count($array) и вывести результаты с помощью foreach. Например:

$query = "your_query_here";
$STH = $DBH->prepare($query);
$STH->execute();
$rows = $STH->fetchAll();
//all your results is in $rows array
$STH->setFetchMode(PDO::FETCH_ASSOC);           
if (count($rows) > 0) {             
    foreach ($rows as $row) {
        //output your rows
    }                       
}
+2
источник

Если вы просто хотите получить количество строк (а не данных), то есть. используя COUNT (*) в подготовленном операторе, тогда все, что вам нужно сделать, это получить результат и прочитать значение:

$sql = "SELECT count(*) FROM `table` WHERE foo = bar";
$statement = $con->prepare($sql); 
$statement->execute(); 
$count = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number
return reset($count); // Resets array cursor and returns first value (the count)

Фактически получение всех строк (данных) для выполнения простого подсчета является пустой тратой ресурсов. Если результирующий набор является большим, ваш сервер может задушить его.

+1
источник

Посмотрите на эту ссылку: http://php.net/manual/en/pdostatement.rowcount.php Не рекомендуется использовать rowCount() в операторах SELECT!

+1
источник

Когда речь идет о mysql, как считать или , сколько строк в таблице с PHP PDO, я использую этот

// count total number of rows
$query = "SELECT COUNT(*) as total_rows FROM sometable";
$stmt = $con->prepare($query);

// execute query
$stmt->execute();

// get total rows
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['total_rows'];

кредиты передаются Майку @codeofaninja.com

0
источник

Чтобы использовать переменные в запросе, вы можете использовать bindValue() или bindParam() Чтобы использовать переменные в запросе, вы должны использовать bindValue() или bindParam(). И не объединяйте переменные с ". $variable. "

$statement = "SELECT count(account_id) FROM account
                  WHERE email = ? AND is_email_confirmed;";
$preparedStatement = $this->postgreSqlHandler->prepare($statement);
$preparedStatement->bindValue(1, $account->getEmail());
$preparedStatement->execute();
$numberRows= $preparedStatement->fetchColumn();

GL

0
источник

Здесь пользовательское расширение класса PDO со вспомогательной функцией для извлечения количества строк, включенных в критерий последнего запроса "WHERE".

Возможно, вам придется добавить больше "обработчиков", в зависимости от того, какие команды вы используете. Сейчас он работает только для запросов, которые используют "FROM" или "UPDATE".

class PDO_V extends PDO
{
    private $lastQuery = null;

    public function query($query)
    {
        $this->lastQuery = $query;    
        return parent::query($query);
    }
    public function getLastQueryRowCount()
    {
        $lastQuery = $this->lastQuery;
        $commandBeforeTableName = null;
        if (strpos($lastQuery, 'FROM') !== false)
            $commandBeforeTableName = 'FROM';
        if (strpos($lastQuery, 'UPDATE') !== false)
            $commandBeforeTableName = 'UPDATE';

        $after = substr($lastQuery, strpos($lastQuery, $commandBeforeTableName) + (strlen($commandBeforeTableName) + 1));
        $table = substr($after, 0, strpos($after, ' '));

        $wherePart = substr($lastQuery, strpos($lastQuery, 'WHERE'));

        $result = parent::query("SELECT COUNT(*) FROM $table " . $wherePart);
        if ($result == null)
            return 0;
        return $result->fetchColumn();
    }
}
-1
источник

Быстрый один вкладыш, чтобы вернуть первую запись. Это очень удобно для очень простых запросов.

<?php
$count = current($db->query("select count(*) from table")->fetch());
?>

Ссылка

-1
источник

Я пробовал $count = $stmt->rowCount(); с Oracle 11.2, и это не сработало. Я решил использовать цикл for как показано ниже.

   $count =  "";
    $stmt =  $conn->prepare($sql);
    $stmt->execute();
   echo "<table border='1'>\n";
   while($row = $stmt->fetch(PDO::FETCH_OBJ)) {
        $count++;
        echo "<tr>\n";
    foreach ($row as $item) {
    echo "<td class='td2'>".($item !== null ? htmlentities($item, ENT_QUOTES):"&nbsp;")."</td>\n";
        } //foreach ends
        }// while ends
        echo "</table>\n";
       //echo " no of rows : ". oci_num_rows($stmt);
       //equivalent in pdo::prepare statement
       echo "no.of rows :".$count;
-1
источник

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

function fetchSpecificRow(&$myRecord) {
    $myRecord = array();
    $myQuery = "some sql...";
    $stmt = $this->prepare($myQuery);
    $stmt->execute(array($parm1, $parm2, ...));
    if ($myRecord = $stmt->fetch(PDO::FETCH_ASSOC)) return 0;
    return $myErrNum;
}
-1
источник

когда вы делаете COUNT (*) в своем операторе mysql, например, в

$q = $db->query("SELECT COUNT(*) FROM ...");

ваш mysql-запрос уже подсчитывает количество результатов, почему снова подсчитывается в php? для получения результата вашего mysql

$q = $db->query("SELECT COUNT(*) as counted FROM ...");
$nb = $q->fetch(PDO::FETCH_OBJ);
$nb = $nb->counted;

и $nb будет содержать целое число, которое вы подсчитали с помощью оператора mysql немного долго писать, но быстро выполнить

Изменить: извините за неправильный пост, но, поскольку в каком-то примере показан запрос с подсчетом, я предлагал использовать результат mysql, но если вы не используете счет в sql fetchAll(), это эффективно, если вы сохраните результат в переменной, которую вы выиграли Не теряйте линию.

$data = $dbh->query("SELECT * FROM ...");
$table = $data->fetchAll(PDO::FETCH_OBJ);

count($table) вернет число строк, и вы все равно можете использовать результат после как $row = $table[0] или используя foreach

foreach($table as $row){
  print $row->id;
}
-2
источник

Вы можете комбинировать лучший метод в одну строку или функцию и создать для вас новый запрос:

function getRowCount($q){ 
    global $db;
    return $db->query(preg_replace('/SELECT [A-Za-z,]+ FROM /i','SELECT count(*) FROM ',$q))->fetchColumn();
}

$numRows = getRowCount($query);
-2
источник
$qry = "select id from table";
$cmd = $conn->prepare($qry);
$cmd->execute();
$cmd->rowCount()
-2
источник
<table>
      <thead>
           <tr>
                <th>Sn.</th>
                <th>Name</th>
           </tr>
      </thead>
      <tbody>
<?php
     $i=0;
     $statement = $db->prepare("SELECT * FROM tbl_user ORDER BY name ASC");
     $statement->execute();
     $result = $statement->fetchColumn();
     foreach($result as $row) {
        $i++;
    ?>  
      <tr>
         <td><?php echo $i; ?></td>
         <td><?php echo $row['name']; ?></td>
      </tr>
     <?php
          }
     ?>
     </tbody>
</table>
-2
источник

function count_x ($ connect) {$ query = "SELECT * FROM tbl WHERE id = '0'"; $ Statement = $connect-> prepare ($ query); $statement-> Execute(); $ total_rows = $statement-> rowCount(); вернуть $ total_rows; }

-2
источник

Использовать параметр array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), иначе показать -1:

Usen parametro array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), продажа греческой ello -1

Пример:

$res1 = $mdb2->prepare("SELECT clave FROM $tb WHERE id_usuario='$username' AND activo=1 and id_tipo_usuario='4'", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$res1->execute();

$count=$res1->rowCount();
echo $count;
-3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос