$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn();
Ce n'est pas la façon la plus élégante de le faire, en plus cela implique une requête supplémentaire.
AOP a PDOStatement::rowCount()
, qui ne semble pas fonctionne dans MySql. Quelle douleur.
D'après le document AOP:
Pour la plupart des bases de données, PDOStatement :: rowCount () ne renvoie pas le nombre de lignes affectées par une instruction SELECT. À la place, utilisez PDO :: query () pour émettre une instruction SELECT COUNT (*) avec les mêmes prédicats que votre instruction SELECT prévue, puis utilisez PDOStatement :: fetchColumn () pour récupérer le nombre de lignes qui seront renvoyées. Votre application peut alors effectuer l'action correcte.
EDIT: L'exemple de code ci-dessus utilise une instruction préparée, ce qui est probablement inutile dans de nombreux cas pour compter les lignes, donc:
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
fetchColumn()
renvoie une chaîne "1234" ... votre EDIT aecho count($nRows);
-count()
est une fonction de tableau: P. Je recommanderais également de taper le résultat defetchColumn()
vers un entier.$count = (int) $stmt->fetchColumn()
Comme je l'ai écrit précédemment dans une réponse à une question similaire , la seule raison
mysql_num_rows()
fonctionné est qu'il récupérait en interne toutes les lignes pour vous donner cette information, même si cela ne vous paraissait pas.Ainsi, en AOP, vos options sont:
FOUND_ROWS()
fonction de MySQL .fetchAll()
fonction PDO pour récupérer toutes les lignes dans un tableau, puis utilisez-count()
le.SELECT COUNT(*)
, comme l'a suggéré karim79.la source
Comme cela arrive souvent, cette question est déroutante. Les gens viennent ici avec deux tâches différentes en tête:
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
Cela signifie que vous avez déjà fait une erreur. Utiliser
mysql_num_rows()
ourowCount()
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:
Au cas où vous auriez besoin d'obtenir plusieurs lignes, vous pouvez utiliser
fetchAll()
.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 à utiliserLIMIT
,WHERE
ou une clause similaire dans votre SQL. Et pour une quantité aussi modérée de données, tout est correctfetchAll()
. Et encore une fois, utilisez simplement le résultat de cette fonction dans la condition: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.
la source
C'est super tard, mais j'ai rencontré le problème et je fais ceci:
C'est vraiment simple et facile. :)
la source
J'ai fini par utiliser ceci:
la source
Cet article est ancien mais obtenir le nombre de lignes en php avec PDO est simple
la source
Ceci est un vieil article, mais frustré à la recherche d'alternatives. Il est très regrettable que PDO ne dispose pas de cette fonctionnalité, d'autant plus que PHP et MySQL ont tendance à aller de pair.
Il y a une faille malheureuse dans l'utilisation de fetchColumn () car vous ne pouvez plus utiliser ce jeu de résultats (effectivement) lorsque fetchColumn () déplace l'aiguille vers la ligne suivante. Par exemple, si vous obtenez un résultat similaire à
Si vous utilisez fetchColumn (), vous pouvez découvrir qu'il y a 3 fruits retournés, mais si vous parcourez maintenant le résultat, vous n'avez que deux colonnes, Le prix de fetchColumn () est la perte de la première colonne de résultats juste pour trouver sur le nombre de lignes renvoyées. Cela conduit à un codage bâclé et à des résultats totalement erronés s'il est mis en œuvre.
Alors maintenant, en utilisant fetchColumn (), vous devez implémenter un appel et une requête MySQL entièrement nouveaux juste pour obtenir un nouvel ensemble de résultats de travail. (qui, espérons-le, n'a pas changé depuis votre dernière requête), je sais, peu probable, mais cela peut arriver. En outre, la surcharge des requêtes doubles lors de la validation du nombre de lignes. Ce qui pour cet exemple est petit, mais l'analyse de 2 millions de lignes sur une requête jointe, ce n'est pas un prix agréable à payer.
J'adore PHP et je soutiens toutes les personnes impliquées dans son développement ainsi que la communauté en général utilisant PHP au quotidien, mais j'espère vraiment que cela sera abordé dans les prochaines versions. C'est «vraiment» mon seul reproche avec PHP PDO, qui autrement est une excellente classe.
la source
Répondre à cela parce que je me suis pris au piège en le sachant maintenant et peut-être que ce sera utile.
Gardez à l'esprit que vous ne pouvez pas récupérer les résultats deux fois. Vous devez enregistrer le résultat de l'extraction dans un tableau, obtenir le nombre de lignes par
count($array)
et afficher les résultats avecforeach
. Par exemple:la source
Si vous voulez juste obtenir un nombre de lignes (pas les données) ie. en utilisant COUNT (*) dans une instruction préparée, tout ce que vous avez à faire est de récupérer le résultat et de lire la valeur:
En fait, récupérer toutes les lignes (données) pour effectuer un comptage simple est un gaspillage de ressources. Si le jeu de résultats est volumineux, votre serveur risque de s'étouffer.
la source
Jetez un œil à ce lien: http://php.net/manual/en/pdostatement.rowcount.php Il n'est pas recommandé d'utiliser rowCount () dans les instructions SELECT!
la source
Pour utiliser des variables dans une requête, vous devez utiliser
bindValue()
oubindParam()
. Et ne concaténez pas les variables avec" . $variable . "
GL
la source
Quand il s'agit de mysql comment compter ou obtenir combien de lignes dans une table avec PHP PDO j'utilise ceci
les crédits vont à Mike @ codeofaninja.com
la source
Une doublure rapide pour récupérer la première entrée. C'est bien pour les requêtes très basiques.
Référence
la source
J'ai essayé
$count = $stmt->rowCount();
avec Oracle 11.2 et cela n'a pas fonctionné. J'ai décidé d'utiliser une boucle for comme indiqué ci-dessous.la source
Pour les requêtes simples où je veux une ligne spécifique et que je veux savoir si elle a été trouvée, j'utilise quelque chose comme:
la source
Il y a une solution simple. Si vous utilisez PDO, connectez-vous à votre base de données comme ceci:
Ensuite, la requête à DB sera:
Et enfin, pour compter les lignes correspondant à votre requête, écrivez comme ceci
la source
fetchColumn ()
utilisé si vous voulez obtenir le décompte des enregistrements [effisien]
requete()
utilisé si vous souhaitez récupérer des données et le nombre d'enregistrements [options]
PDOStatement :: rowCount
la source
lorsque vous faites un COUNT (*) dans votre instruction mysql comme dans
votre requête mysql compte déjà le nombre de résultat pourquoi compter à nouveau en php? pour obtenir le résultat de votre mysql
et
$nb
contiendra l'entier que vous avez compté avec votre instruction mysql un peu longue à écrire mais rapide à exécuterEdit: désolé pour le mauvais post, mais comme un exemple montre une requête avec count in, je suggérais d'utiliser le résultat mysql, mais si vous n'utilisez pas le count dans sql fetchAll () est efficace, si vous enregistrez le résultat dans une variable vous ne perdrez pas une ligne.
count($table)
renverra le nombre de lignes et vous pourrez toujours utiliser le résultat après comme$row = $table[0]
ou en utilisant unforeach
la source
Voici une extension personnalisée de la classe PDO, avec une fonction d'assistance pour récupérer le nombre de lignes incluses par le critère "WHERE" de la dernière requête.
Cependant, vous devrez peut-être ajouter plus de «gestionnaires», selon les commandes que vous utilisez. Pour le moment, cela ne fonctionne que pour les requêtes qui utilisent "FROM" ou "UPDATE".
la source
Vous pouvez combiner la meilleure méthode en une seule ligne ou fonction et faire en sorte que la nouvelle requête soit générée automatiquement pour vous:
la source
la source
la source
Utilisez le paramètre
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, sinon affichez -1:Usen Parametro
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, Sin ello Vente -1exemple:
la source