Aller au contenu

Compter ligne mysql


Mumulafrite

Sujets conseillés

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

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 :

Bonne continuation !

Lien vers le commentaire
Partager sur d’autres sites

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

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 :P

Lien vers le commentaire
Partager sur d’autres sites

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

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 ! :P

Lien vers le commentaire
Partager sur d’autres sites

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

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

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é par TheRec
Lien vers le commentaire
Partager sur d’autres sites

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é par hcplayer
Lien vers le commentaire
Partager sur d’autres sites

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

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 away

sql> EXPLAIN SELECT COUNT(unchamp) FROM tatable;
Résultat : Select tables optimized away

Peut être que tous les chemins sont optimisés ;o)

Modifié par petit-ourson
Lien vers le commentaire
Partager sur d’autres sites

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

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

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

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...