Page 1 sur 1

Questions sur un bout de code

Posté : 15 sept. 2007, 00:00
par Snipy
Bonsoir à tous, j'ai 2 petites question sur un bout de code,
En le regardant je pense que vous le comprendrez :)
$pseudo = htmlspecialchars($_POST['pseudo']);
//On vérifie que le pseudo renvoit bien quelque chose :o (1)
$requete = mysql_query("SELECT membre_id, COUNT(*) AS nbr FROM forum_membres
WHERE membre_pseudo = '".$pseudo."'
GROUP BY membre_pseudo") or die(mysql_error());
$data = mysql_fetch_assoc($requete);
$pseudo_exist = $data['nbr'];
$i = 0;
if(!$pseudo_exist)
{
echo '<p>Ce membre ne semble pas exister<br />

Ma première question est :
quel est l'interet de faire un GROUP BY ?


Et ma seconde est : littéralenent, "if(!$pseudo_exist)" veut bien dire si la variable n'existe pas. Mais dans notre cas, meme si la requete ne renvoit rien, la variable existe non (mais elle est vide? (il faudrait donc utiliser empty)

Mon raisonnement doit etre faux donc merci de me le corriger.

Merci encore de votre futur aide qui j'espère me permettra de comprendre certaines subtilités de ce langage :)

Re: Questions sur un bout de code

Posté : 15 sept. 2007, 00:54
par Hubert Roksor
quel est l'interet de faire un GROUP BY ?
Je n'en vois aucun, puisqu'il n'y a qu'une seule valeur de membre_pseudo possible.
littéralenent, "if(!$pseudo_exist)" veut bien dire si la variable n'existe pas
!$var signifie "le contraire (NOT) booléen de $var". Donc en gros ça veut dire "vrai si $var est vide, faux ou égal à 0". Pour vérifier qu'une variable existe, on utilise isset()

Voir Que donnent les tests sur les variables en PHP ?

Re: Questions sur un bout de code

Posté : 15 sept. 2007, 01:02
par Ryle
Ma première question est :[/b]quel est l'interet de faire un GROUP BY ?
Lorsque tu fais une requête dans laquelle tu mélanges de simple champs (comme ici ton membre_id) et des données regroupées à l'aide d'une fonction (que ce soit un COUNT, un SUM, etc.) tu es obligé de préciser que les résultats doivent être regroupés pour tous les champs "simples" présents dans le select.
MySQL a un comportement assez bizare avec le GROUP BY et tolère bien des choses érronnées (comme dans ton exemple ou le GROUP BY devrait se faire sur membre_id et non sur membre_pseudo qui n'est pas dans les champs du SELECT). Mais pour n'importe quel autre SGBD il faut mentionné tous les champs non groupés qui sont utilisés.

Outre cette contrainte, l'intéret serait, si plusieurs enregistrement avaient la même valeur pour le champ pseudo, tu pourrais connaitre les différents id associés, et combien de fois ce pseudo est associé à cet id.... ce qui dans le cas présent n'a absolument aucun intérêt. Un simple :
$sql = "SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_pseudo = '".$pseudo."'";
serait bien plus efficace et optimisé.

Et ma seconde est : littéralenent, "if(!$pseudo_exist)" veut bien dire si la variable n'existe pas.
Non, littérament cela veut dire "SI $pseudo_exist est FAUX". Le point d'exclamation est une négation et $pseudo_exist une variable qui doit être définie au préalable (sinon cela génerera un warning). Si tu veux tester qu'une variable existe, il faut utiliser la fonction isSet()
Mais dans notre cas, meme si la requete ne renvoit rien, la variable existe non (mais elle est vide? (il faudrait donc utiliser empty)
L'avantage d'une fonction COUNT() en SQL c'est que même si aucun enregistrment n'est trouvé, elle renvoi toujours quelque chose (en l'occurence 0). Tu peux donc être sur qu'il y a un résultat et tester cette valeur pour savoir si oui ou non il existe des enregistrements comportant déjà ce pseudo. La façon propre de faire ça serait la suivante :
$nb = $data['nbr']; 
if ($nb > 0) // alors le pseudo existe déjà
La façon dont c'est fait dans ton code utilise le fait que pour php 0, "", et FALSE sont des valeurs identiques. Ainsi, si le count() retourne 0 et que tu testes directement la variable $pseudo_exist, php considère que celle ci est à FALSE, donc que !$pseudo_exist est TRUE. Ca fonctionne, mais c'est sincèrement pas la méilleure méthode à adopter, mieux vaut s'habituer aux types avec lesquels on travail et éviter de mélanger numériques et booléens.

vala... HTH :)

Posté : 15 sept. 2007, 11:19
par Snipy
Merci pour vos réponse, ça répond parfaitement à mes questions.

Bonne continuation

EDIT: en fait sans le GROUP BY ça ne marche pas !

Voici l'erreur renvoyé
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause