JeuWeb - Crée ton jeu par navigateur
Compter le nombre d'entrées sélectionées par une requête avec PDO - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Compter le nombre d'entrées sélectionées par une requête avec PDO (/showthread.php?tid=4541)



Compter le nombre d'entrées sélectionées par une requête avec PDO - php_addict - 15-01-2010

bonjour

je passe mes script en PDO, et je rencontre un truc assez etrange:

mon bug se situe au niveau de mysql_num_rows() mais en PDO:

Code PHP :
<?php 
$connexion_projet
= new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);


$resultats=$connexion_projet->query("SELECT id FROM joueur");
$resultats->setFetchMode(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT);

echo
$resultats->fetchColumn();

et bien cela me retourne la valeur '1' alors que ma table est pleine de joueur...

comment est ce possible ?

fetchColumn() n'est pas censé retourner le nombre d'entrées trouvées par la requete???


RE: bug PDO ou c'est moi qui hallucine? - My Hotel - 15-01-2010

Euh, lis la doc ici : http://php.net/manual/fr/pdostatement.fetchcolumn.php. Je vois pas en quoi ça compte le nombre d'entrées, ou alors je suis aveugle. Wink
Ou alors lis ici : http://www.php.net/manual/fr/pdostatement.rowcount.php, ils expliquent que pour utiliser fetchColumn, faut déjà faire une requète COUNT, et après afficher la colonne qui contient le nombre recherché.
Or y'a pas de COUNT dans ta requète. Essaie $resultats=$connexion_projet->query("SELECT COUNT(*) FROM joueur");

Dis-nous si ça marche Smile


Bye


RE: bug PDO ou c'est moi qui hallucine? - Ekilio - 15-01-2010

Heu... Non ^^'

Je ne comprends pas tout à fait ce que tu cherches à faire, mais le fetchColumn sert à récupérer le contenu d'une colonne particulière dans une row du rowset dans le cas que tu as mis (au passage, je ne comprends pas le second argument que tu mets à setFetchMode, d'après la doc c'est le numéro de la colonne qui va là...)

J'imagine que tu t'es basé sur l'exemple de rowCount() pour ton code ; mais l'exemple de la doc est foireux (comme hélàs souvent les exemples de la doc officielle...). Une méthode plus simple pour réaliser ce que tu cherches à faire peut être, par exemple, de faire un fetchAll sur ton objet PDO_Statment, puis un count() sur le résultat obtenu (qui est un tableau).

Edit : le Non s'addressait à php_addict, mais la méthode suggerée dans la doc n'est pas bonne non plus au sens où elle force à executer en double la même requête, mais une fois avec une syntaxe particulièrement lourde. D'un point de vue optimisation, je pense qu'un fetchAll serait plus rapide, bien que je ne l'ai pas vérifié.


RE: bug PDO ou c'est moi qui hallucine? - php_addict - 15-01-2010

(15-01-2010, 11:14 PM)My Hotel a écrit : Euh, lis la doc ici : http://php.net/manual/fr/pdostatement.fetchcolumn.php. Je vois pas en quoi ça compte le nombre d'entrées, ou alors je suis aveugle. Wink
Ou alors lis ici : http://www.php.net/manual/fr/pdostatement.rowcount.php, ils expliquent que pour utiliser fetchColumn, faut déjà faire une requète COUNT, et après afficher la colonne qui contient le nombre recherché.
Or y'a pas de COUNT dans ta requète. Essaie $resultats=$connexion_projet->query("SELECT COUNT(*) FROM joueur");

Dis-nous si ça marche Smile


Bye

oh lalala ben oui, ca marche! je n'ai pas pris le manuel a l'endroit...

faut dire que je suis depuis ce matin en train de tout passer en PDO et je ne sais meme plus pourquoi je passe tout en PDO...

merci !


RE: bug PDO ou c'est moi qui hallucine? - My Hotel - 15-01-2010

Effectivement, c'est lourd, mais s'il veut simplement compter et non pas sélectionner après les entrées comme sur l'exemple #2, ça passe non?


RE: [resolu] bug PDO ou c'est moi qui hallucine? - Ekilio - 15-01-2010

Si il ne veux que compter, un count(id) ou autre colonne est plus approprié ! count(*), de même que SELECT *, est très lourd et ne devrais jamais être employé.

Et php_addict, peut-être parce que mysql_* va disparaitre dans PHP 6 ? :p (enfin ce sera une extension dépreciée de PECL). Et que c'est plus rapide et plus sûr (et plus puissant, aussi).


RE: [resolu] bug PDO ou c'est moi qui hallucine? - php_addict - 16-01-2010

merci pour vos reponses

donc pour compter le nombre d'entrée le meiux c'est ceci: ?

Code :
$resultats=$connexion->query("SELECT id FROM joueur WHERE blablabla");
$num_rows = $resultats->rowCount();



RE: [resolu] bug PDO ou c'est moi qui hallucine? - Ekilio - 16-01-2010

Ça peut être une solution à tester, mais la doc PHP indique que sur certains SGBD, rowCount() bug sur les requêtes de type SELECT. Cela étant, les commentaires ont l'air de dire que sur MySQL ça marche : je t'invite à tester et à nous le dire :p

Sinon, la solution suggérée par la doc est la suivante (une fois remise en forme pour virer les erreurs de la doc) :

Code PHP :
<?php 
$resultats
= $connexion->query('SELECT COUNT(id) FROM joueur WHERE blablabla');
$num_rows = $resultats->fetchColumn();

Ceci te permettant de récupérer simplement le contenu de la première colonne du premier rang du résultat, soit le COUNT(id). A mon humble avis (mais sans benchmark, je les ferais en rentrant de week-end si j'ai le temps) cette solution n'est bonne que si tu ne souhaites pas exploiter les colonnes reçues (c'est à dire si tu n'as pas l'intention de te servir du retour, par exemple pour vérifier si un pseudo est libre, ce genre de truc).

Si tu dois de toutes façons te servir du résultat (par exemple pour afficher une liste de joueurs ou autres) je pense que cette solution est plus optimisée et plus élégante :

Code PHP :
<?php 
$resultats
= $connexion->query('SELECT id FROM joueur WHERE blablabla');
$rows = $resultats->fetchAll();
$num_rows = count($rows);



RE: [Résolu] Compter le nombre d'entrées sélectionées par une requête ? - Sephi-Chan - 16-01-2010

Une petite remarque sur le titre du sujet, au passage.

Citation :bug PDO ou c'est moi qui hallucine?

C'est un mauvais titre.
Déjà, c'est moche. Il manque une majuscule et un espace avant point d'interrogation.
Ensuite, ça ne décrit absolument pas ton problème. Ton problème concernant la récupération du nombre d'entrées sélectionnées par une requête et tu n'en fais même pas mention.

Le bon point, c'est que tu as pensé à mettre un tag indiquant la résolution de ton problème. Mais le souci, c'est que [resolu] c'est moche. [Résolu], c'est plus beau.

Voilà, à bientôt et bon choix de te mettre à PDO ! Smile


Sephi-Chan