Variables dynamiques, mysql et un débutant

Voyvoda
Invité n'ayant pas de compte PHPfrance

27 mars 2010, 10:02

Bonjour,

Comme vous vous en doutez j'ai un petit problème avec mon code.

N'étant vraiment pas un as en php, plus de la bidouille qu'autre chose je suis face a un mystère.

J'essaye d'assigner un nom précis avec à un identifiant récupéré sur ma BDD mysql.

Ex:
$query="SELECT DISTINCT identifiant FROM ma_table WHERE identifiant IS NOT NULL"; // ma query pour récupérer les identifiant différant uniquement.
$getiden=mysql_query($query);
while($donnees=mysql_fetch_assoc($getiden)) // ma boucle pour afficher le résultat ligne par ligne
{
$itemcode = $donnees['hero'];
$itemname = ${$itemcode }; // Partie qui pause problème voir ci-dessous

echo $itemcode.' = '.$itemname;
echo '<br>';
}
$itemname = ${$itemcode };
Selon moi ( on sait jamais, je trompe souvent^^) devrait donc valoir $itemname = $D0E1 (par exemple) ce qui est le cas sauf quand bien sûr $itemcode est vide. et la j'ai un problème j'ai essayé plusieurs façons mais je vois pas trop comment faire pour assigner un variable par défaut quand $itemcode est vide pour éviter de me retrouver avec ce genre de notice:
Notice: Undefined variable: in C:\wamp\www\dstats\games.php on line 103

j'ai déjà essayé des choses comme ça:
if (strlen($itemcode)==4)
{
$itemname = ${$itemcode };
}
else
{
$itemname = "Aucun Identifiant";
}
Ça fonctionne à moitié.. ça me retire qu'un avertissement notice et je ne comprend pas, pourquoi un seul et non pas tous ou aucun ?

En résumé: A l'aiiiddeee.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 mars 2010, 16:39

Je ne suis pas certain d'avoir bien tout compris, mais à priori ta première approche était la bonne, tu as juste une erreur au niveau de l'index utilisé :)

Ta requête retourne le champ "identifiant" tous les enregistrements dont l'identifiant n'est pas nul. Ce n'est donc pas $donnees['hero'] qu'il te faut utiliser, mais $donnees['identifiant'] (ce qui devrait déjà t'enlever un warning)

Ensuite, quand tu fais ${$itemcode}, tu fais appel à la variable dont le nom est contenu dans $itemcode. Si cette valeur est "DOE1", alors tu fais appel à la variable $DOE1. Cependant, si cette variable n'a pas été déclarée au préalable dans ton code, tu auras là encore un message d'avertissement.

Pour tester si ta variable existe avant d'y faire appel, tu peux utiliser la fonction isSet() :
if (isSet( ${$itemcode} )) {
  $itemname = ${$itemcode};
}
else {
  $itemname = "Aucun Identifiant";
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 5462 Messages

27 mars 2010, 16:43

pourquoi tu mets une majuscule a isset (isSet)?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 mars 2010, 17:08

C'est l'habitude de java :)

PHP n'est pas sensible à la casse dans les noms de méthodes (ce qui n'est pas vrai pour les variables), donc minuscule ou majuscule ne change absolument rien ici. Et comme il n'y a pas de norme d'écriture dans le nom des fonctions php, je trouve que ça facilite la lecture de mettre une majuscule lorsque tu commences un nouveau mot dans un nom de fonction, lorsqu'ils ne sont pas découpés avec des underscores.

En gros, je vais écrire strip_tags() en minuscule mais stripSlashes() en callant une majuscule. Du coup tu le lis immédiadement Strip-Slashes sans te poser de question. Même chose pour strToUpper(), où tu vois de suite que c'est "Str-To-Upper" et pas "Str-Toupper", "Str-Toup-Per" ou je ne sais quoi :)

Mais ça reste qu'une question de confort personnel :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 2287 Messages

27 mars 2010, 19:07

En gros, je vais écrire strip_tags() en minuscule mais stripSlashes() en callant une majuscule. Du coup tu le lis immédiadement Strip-Slashes sans te poser de question. Même chose pour strToUpper(), où tu vois de suite que c'est "Str-To-Upper" et pas "Str-Toupper", "Str-Toup-Per" ou je ne sais quoi :)

Mais ça reste qu'une question de confort personnel :)
<hs>Ca porte même un nom, c'est la convention lowerCamelCase.

Perso je fais exactement le contraire : j'écris les fonctions et mots-clés internes à php en minuscules, comme ça je les différencie très bien visuellement de mes fonctions perso (qui, elles, sont en lowerCamelCase :) )
</hs>
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 5462 Messages

27 mars 2010, 21:18

<hs>
moi je suis bête et discipliner , toutes les fonctions interne a php en lower (comme dans les sources), les noms de class en CamelCase, les methodes en camelCase les propriété en lower, et les constant en upper, tout en normal quoi :wink:
</hs>

Voyvoda
Invité n'ayant pas de compte PHPfrance

28 mars 2010, 08:43

Je ne suis pas certain d'avoir bien tout compris, mais à priori ta première approche était la bonne, tu as juste une erreur au niveau de l'index utilisé :)

Ta requête retourne le champ "identifiant" tous les enregistrements dont l'identifiant n'est pas nul. Ce n'est donc pas $donnees['hero'] qu'il te faut utiliser, mais $donnees['identifiant'] (ce qui devrait déjà t'enlever un warning)


Ensuite, quand tu fais ${$itemcode}, tu fais appel à la variable dont le nom est contenu dans $itemcode. Si cette valeur est "DOE1", alors tu fais appel à la variable $DOE1. Cependant, si cette variable n'a pas été déclarée au préalable dans ton code, tu auras là encore un message d'avertissement.

Pour tester si ta variable existe avant d'y faire appel, tu peux utiliser la fonction isSet() :
if (isSet( ${$itemcode} )) {
  $itemname = ${$itemcode};
}
else {
  $itemname = "Aucun Identifiant";
}
Rahh, je sais pas pourquoi j'avais déjà tester isset() mais sur $itemname est forcement c'etais déjà trop tard...
Pourquoi mais pourquoi j'y ai pas pensé plus tôt !! En tout cas merci ça corrige bien les problèmes notice, ce qui est logique :mrgreen:.
*y pensera pour la prochaine fois*