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???
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é.
(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.
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
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 !
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?
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).
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();
Ç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);