Mumulafrite Posté 11 Février 2006 Partager Posté 11 Février 2006 Bonjour, Jai un petit problême, je n'arrive pas à compter le nombre de membre sur mon forum. voici mon code: $db=connect_mysql();$sql = "SELECT COUNT(*) FROM phpbb_user";echo $sql;$res = mysql_query($sql);echo $res;close_mysql($db); Ce qui m'ennerve c'est que jai trouvé le code sur un forum. bref si quelqu'un peut m'aider P.S: les echo c'est pour voir la requette Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheRec Posté 11 Février 2006 Partager Posté 11 Février 2006 Bonjour, à la place de : echo $res; Utilise ceci par exemple : echo mysql_result($res,0); Le résultat de "mysql_query" donne une ressource (result set) et non directement les résultats. Il faut toujours utiliser une fonction pour récupérer les données, par exemple : mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_object mysql_fetch_row Bonne continuation ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mumulafrite Posté 11 Février 2006 Auteur Partager Posté 11 Février 2006 bien cela ne foncionne pas jai une erreur: Warning: mysql_result(): supplied argument is not a valid MySQL result resource in /home/graphizo/domains/webfolie.com/public_html/test.php on line 7 ... une solution? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sarc Posté 12 Février 2006 Partager Posté 12 Février 2006 Bonjour, Ce genre d'erreur arrive quand ton mysql_query n'a rien renvoyé, donc quand la requète SQL n'a pas de réponses du tout ! Tu as essayé la requète directement dans phpmyadmin ? C'est la première étape quand une requète ne marche pas ! Si ça renvoie bien quelque chose, il faut voir du côté de la connexion à la BDD si ça marche bien. Toujours une explication logique à ce genre d'erreurs, normalement Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheRec Posté 12 Février 2006 Partager Posté 12 Février 2006 Effectivement... la requête n'est pas correcte, je n'ai pas vérifier le nom de ta table à ta place Si tu utilises phpBB la table sur laquelle tu souhaites faire une requête doit être : phpbb_users Il manquait un "s" à "user", on espère quand même qu'il y en ait plus d'un pour un forum en général. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sarc Posté 12 Février 2006 Partager Posté 12 Février 2006 Ah bah voilà, je n'avais pas la base des PHPBB sous les yeux, donc je n'avais pas su dire ce qui n'allait pas... En fait TheRec, dans un livre sur SQL (qui n'est sûrement pas une référence, m'enfin..) il était conseillé de mettre le nom des tables au singulier pour éviter d'oublier si c'est singulier, pluriel, un mélange des deux, en langage SMS ou en abréviations... Bref, ça aurait pu être au singulier comme conseillé dans ce livre, au moins il n'aurait pas eu cette erreur ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mumulafrite Posté 12 Février 2006 Auteur Partager Posté 12 Février 2006 Merci bien ce sont vraiment les erreurs les plus bete que l'on ne voit pas... de plus, qd on est dans le code c terrible pour se rendre compte des erreurs Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sarc Posté 12 Février 2006 Partager Posté 12 Février 2006 de plus, qd on est dans le code c terrible pour se rendre compte des erreurs <{POST_SNAPBACK}> Y'a pas de quoi pour la petite aide que j'ai pu apporté... Par contre, essaye de garder un Français correct sans SMS sur le forum si possible, pour qu'on puisse toujours apporter de l'aide à ceux qui en demandent Merci d'avance ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kalt Posté 13 Février 2006 Partager Posté 13 Février 2006 Une petite remarque pour TheRec dans le même sens que Sarc : une table SQL comme celle des utilisateurs contient bien évidemment plusieurs enregistrements, mais au niveau conceptuel, la table utilisateur représente UN utilisateur, c'est pourquoi il est plus "logique" de nommer ses tables au singulier. Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheRec Posté 13 Février 2006 Partager Posté 13 Février 2006 (modifié) En même temps je n'ai pas codé phpBB, je ne faisait qu'imaginer le développement logique qui a mené les developpeurs à cette dénomination. Au sujet de l'erreur, tu aurais pu la découvrir par toi-même en utilisant cette ligne de code après la requête (mysql_query) produisant l'erreur : echo mysql_errno() . ": " . mysql_error(); Ensuite, évite d'oublier ce genre de ligne dans le code (elles n'affichent rien lorsqu'il n'y a pas eu d'erreur lors de la précédente requête au serveur mySQL), cela donne des indices aux éventuels hackers sur la structure de ta base de données. Modifié 13 Février 2006 par TheRec Lien vers le commentaire Partager sur d’autres sites More sharing options...
hcplayer Posté 13 Février 2006 Partager Posté 13 Février 2006 (modifié) Bonjour, $db=connect_mysql();$sql = "SELECT COUNT(*) FROM phpbb_user";$res = mysql_query($sql);$r = mysql_fetch_assoc($res);echo $r[0]; non? PS: pourquoi "*", pourquoi pas juste l'ID s'il s'agit de compter juste le nombre de membres ? Modifié 13 Février 2006 par hcplayer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kalt Posté 13 Février 2006 Partager Posté 13 Février 2006 PS: pourquoi "*", pourquoi pas juste l'ID s'il s'agit de compter juste le nombre de membres ? <{POST_SNAPBACK}> Il me semble que quand tu fais un COUNT(*), MySQL va directement chercher le nombre d'enregistrement dans l'entête de la table (renseignements généraux sur la table), sans effectivement compter les lignes, d'où une réponse quasi-instantanée. Lien vers le commentaire Partager sur d’autres sites More sharing options...
petit-ourson Posté 13 Février 2006 Partager Posté 13 Février 2006 (modifié) Il me semble que quand tu fais un COUNT(*), MySQL va directement chercher le nombre d'enregistrement dans l'entête de la table (renseignements généraux sur la table), sans effectivement compter les lignes, d'où une réponse quasi-instantanée. <{POST_SNAPBACK}> On obtient le même résultat avec les deux requêtes suivantes : sql> EXPLAIN SELECT COUNT(*) FROM tatable;Résultat : Select tables optimized awaysql> EXPLAIN SELECT COUNT(unchamp) FROM tatable;Résultat : Select tables optimized away Peut être que tous les chemins sont optimisés ;o) Modifié 13 Février 2006 par petit-ourson Lien vers le commentaire Partager sur d’autres sites More sharing options...
hcplayer Posté 13 Février 2006 Partager Posté 13 Février 2006 sql> EXPLAIN SELECT COUNT(unchamp) FROM tatable;Résultat : Select tables optimized away Peut être que tous les chemins sont optimisés ;o) <{POST_SNAPBACK}> Je ne sais pas si ça optimise en réalité, mais j'ai toujours fait plutôt comme ça. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sarc Posté 13 Février 2006 Partager Posté 13 Février 2006 Ah tiens ça m'intéresse là : on m'a toujours conseillé de compter les id et non tous les champs, alors si vous avez raison, je pourrai dire à tout le monde que leurs conseils étaient mauvais ! Alors, de compter l'étoile, c'est plus optimisé que de compter un champs ? Qui saura répondre avec exactitude ? Ou alors comme l'a dit petit-ourson, ça revient au même.. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kalt Posté 13 Février 2006 Partager Posté 13 Février 2006 Après vérification, si vous comptez le nombre de lignes sur une table disposant d'un index, MySQL ne scanne pas la table mais retourne simplement la taille de l'index. Ce qui veut donc dire à mon humble avis qu'un COUNT(id) et COUNT(*) reviennent au même sur une table avec un index. Lien vers le commentaire Partager sur d’autres sites More sharing options...
petit-ourson Posté 13 Février 2006 Partager Posté 13 Février 2006 Je ne sais pas comment fonctionne le EXPLAIN, cependant dans la doc on retrouve : COUNT(*) est optimisée pour retourner très rapidement un résultat si SELECT travaille sur une table, qu'aucune autre colonne n'est lue, et qu'il n'y a pas de clause WHERE. Par exemple :mysql> SELECT COUNT(*) FROM student;Cette optimisation s'applique uniquement pour les tables MyISAM et ISAM, car un compte exact du nombre de lignes est stocké pour ces types de tables, et il peut être lu très rapidement. Pour les moteurs de tables transactionnels, (InnodB, BDB), le stockage de cette valeur est plus problématique, car plusieurs transactions peuvent survenir en même temps, et affecter toutes ce compte. http://dev.mysql.com/doc/refman/5.0/fr/gro...-functions.html Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant