web-dev-qa-db-fra.com

obtenir le nombre de lignes avec pdo

J'ai une simple requête préparée par 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];

l'écho semble renvoyer la valeur ID de l'enregistrement, pas le nombre d'enregistrements renvoyés par la requête?

une idée ou une explication à cela?

12
Smudger

PDO :: FETCH_NUM: renvoie un tableau indexé par numéro de colonne tel que renvoyé dans votre jeu de résultats, en commençant à la colonne 0

Vous ne récupérez pas du tout le nombre de lignes.

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

Cette requête retournerait le nombre total de lignes dans $rows[0];

EDIT: Veuillez voir la réponse de @ ray. utiliser count(id) est meilleur que count(*) pour InnoDB.


Vous pouvez obtenir le nombre de lignes de la manière suivante, à partir de votre requête précédente.

$row_count = $result->rowCount();

Mais attention:

Si la dernière instruction SQL exécutée par le PDOStatement associé était une instruction SELECT, certaines bases de données peuvent renvoyer le nombre de lignes renvoyées par cette instruction. Cependant, ce comportement n'est pas garanti pour toutes les bases de données et ne doit pas être utilisé pour les applications portables.

Documentation

8

Vous avez exécuté une requête qui renvoie des lignes de la base de données, récupéré la première ligne du résultat dans une variable, puis fait écho à la première colonne de cette ligne.

Si vous voulez compter, faites un compte SQL ()

$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;
17
Stephen

En supposant que id est l'utilisation de la clé primaire:

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

Évitez de compter (*). Si votre moteur de stockage est InnoDB (peut-être d'autres sauf MyIsam), vous subirez un impact sur les performances.

3
Ray

Essayez echo count($rows); comme $rows est un tableau.

Éditer:

Pour utiliser les résultats

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