Comme cela arrive souvent, cette question est déroutante. Les gens viennent ici avec deux tâches différentes en tête:
- Ils ont besoin de savoir combien de lignes dans le tableau
- Ils ont besoin de savoir si une requête a renvoyé des lignes
Ce sont deux tâches absolument différentes qui n'ont rien en commun et ne peuvent pas être résolues par la même fonction. Ironiquement, pour aucun d'eux, la PDOStatement::rowCount()
fonction réelle ne doit être utilisée.
Voyons pourquoi
Compter les lignes dans le tableau
Avant d'utiliser PDO, j'ai simplement utilisé mysql_num_rows()
.
Cela signifie que vous avez déjà fait une erreur. Utiliser mysql_num_rows()
ou rowCount()
pour compter le nombre de lignes dans le tableau est un vrai désastre en termes de consommation des ressources du serveur. Une base de données doit lire toutes les lignes du disque, consommer la mémoire du serveur de base de données, puis envoyer tout ce tas de données à PHP, consommant également la mémoire du processus PHP, alourdissant votre serveur sans aucune raison.
En outre, sélectionner des lignes uniquement pour les compter n'a tout simplement aucun sens. Une count(*)
requête doit être exécutée à la place. La base de données comptera les enregistrements hors de l'index, sans lire les lignes réelles , puis une seule ligne retournée.
À cette fin, le code suggéré dans la réponse acceptée est équitable.
Comptage du nombre de lignes renvoyées.
Le deuxième cas d'utilisation n'est pas aussi désastreux qu'inutile: au cas où vous auriez besoin de savoir si votre requête a renvoyé des données, vous avez toujours les données elles-mêmes!
Dites, si vous ne sélectionnez qu'une seule ligne. Très bien, vous pouvez utiliser la ligne récupérée comme indicateur:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
Au cas où vous auriez besoin d'obtenir plusieurs lignes, vous pouvez utiliser fetchAll()
.
fetchAll()
est quelque chose que je ne veux pas car je peux parfois avoir affaire à de grands ensembles de données
Oui bien sûr, pour le premier cas d'utilisation, ce serait deux fois plus mauvais. Mais comme nous l'avons déjà appris, ne sélectionnez pas les lignes uniquement pour les compter, ni avec rowCount()
nifetchAll()
.
Mais au cas où vous utiliseriez réellement les lignes sélectionnées, il n'y a rien de mal à utiliser fetchAll()
. N'oubliez pas que dans une application Web, vous ne devez jamais sélectionner un grand nombre de lignes. Seules les lignes qui seront effectivement utilisées sur une page Web doivent être sélectionnés, d' où vous avez à utiliser LIMIT
, WHERE
ou une clause similaire dans votre SQL. Et pour une quantité aussi modérée de données, tout est correct fetchAll()
. Et encore une fois, utilisez simplement le résultat de cette fonction dans la condition:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
Et bien sûr, ce sera une folie absolue d'exécuter une requête supplémentaire uniquement pour dire si votre autre requête a renvoyé des lignes, comme cela a été suggéré dans les deux premières réponses.
Compter le nombre de lignes dans un grand jeu de résultats
Dans un cas aussi rare où vous avez besoin de sélectionner une très grande quantité de lignes (dans une application console par exemple), vous devez utiliser une requête sans tampon , afin de réduire la quantité de mémoire utilisée. Mais c'est le cas réel lorsqu'il rowCount()
ne sera pas disponible , donc cette fonction ne sert pas non plus.
C'est donc le seul cas d'utilisation où vous devrez peut-être exécuter une requête supplémentaire, au cas où vous auriez besoin de connaître une estimation proche du nombre de lignes sélectionnées.