получить количество строк с pdo

У меня есть простой pdo подготовленный запрос:

$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rows = $result->fetch(PDO::FETCH_NUM);
echo $rows[0];

Эхо, похоже, возвращает значение ID записи, а не количество записей, возвращаемых запросом?

любая идея или объяснение этому?

5 ответов


PDO:: FETCH_NUM: возвращает массив, индексированный по номеру столбца, как вернулся в результирующий набор, начиная со столбца 0

вы вообще не получаете счет строк.

SELECT COUNT(*) FROM coursescompleted where person=:p

этот запрос вернет всего строк в $rows[0];

EDIT: Пожалуйста, см. @Рэя ответа. используя count(id) лучше, чем count(*) для InnoDB.


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

$row_count = $result->rowCount();

но предупреждаю:

если последний оператор SQL, выполненный связанным PDOStatement был инструкция SELECT, некоторые базы данных могут возвращать количество строк возвращено этим заявлением. Однако такое поведение не гарантируется для всех баз данных и не следует полагаться на портативный приложения.

документация


вы выполнили запрос, который возвращает строки из базы данных, извлекли первую строку из результата в переменную, а затем повторили первый столбец этой строки.

Если вы хотите считать, сделайте SQL count ()

$result = $db->prepare("select count(*) from coursescompleted where person=:p"); 
$result->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rowCount = $result->fetchColumn(0);
echo $rowCount;

предполагая, что id использование первичного ключа:

 SELECT COUNT(id) FROM coursescompleted WHERE person=:p;

избежать граф(*). Если ваш движок хранения InnoDB (возможно, другие, кроме MyIsam), вы получите удар по производительности.


попробовать echo count($rows); as $rows - это массив.

Edit:

использовать результаты

$rows = $result->fetchAll(/* nothing here */);
if(count($rows) > 0) {
  // Show results, perhaps using a foreach($rows as $row)
} else {
 echo "Sorry, no results found";
}

Вы можете использовать этот

<?php
$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rows = $result->rowCount();
echo $rows;
?>

это иногда не работает на SELECT запросы. Но основываясь на личном опыте, и поскольку вы не упомянули о переносе его в другие системы баз данных, он должен работать на MySQL.

дополнительная информация находится в руководстве PHP здесь