Aller au contenu

Compter ligne mysql


Sujets conseillés

Posté

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

Posté

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 !

Posté

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?

Posté

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

Posté

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.

Posté

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

Posté

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

Posté
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 !

Posté

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.

Posté (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é par TheRec
Posté (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é par hcplayer
Posté
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.

Posté (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 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
Posté
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.

Posté

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..

Posté

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.

Posté

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

Veuillez vous connecter pour commenter

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



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