Получить количество строк с 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];

Кажется, что эхо возвращает идентификационное значение записи, а не количество записей, возвращаемых запросом?

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

Ответ 1

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

Вы не собираете счетчик строк вообще.

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

Этот запрос будет возвращать полные строки в $rows[0];

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


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

$row_count = $result->rowCount();

Но будьте осторожны:

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

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

Ответ 2

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

Если вы хотите подсчитать, сделайте 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;

Ответ 3

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

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

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

Ответ 4

Попробуйте echo count($rows); как $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";
}

Ответ 5

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

<?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 здесь