Probleme While, $i et variable - Programmation
Marsh Posté le 01-02-2002 à 21:49:32
quand tu fais
echo "$nom_page".$i++."";
tu demandes à php d'afficher la variable $nom_page puis la variable $i. $nom_page n'existe pas, tu ne vois donc que $i. il faut en fait reconstruire le nom de la variable :
$maVariable = 'nompage' . $i;
puis utiliser $ avec ce nom de variable pour afficher son contenu :
echo $$maVariable;
Marsh Posté le 01-02-2002 à 22:07:27
Ca a l'air de marcher pour l'instant , en fait , ce que je ne comprends pas justement , c'est que vu que c'est un formulaire , le nom des champs s'affiche ensuite par $variable ... mais pourquoi la , il fallait redefinir un $maVariable ?
le nom_page1 etc ... je les vois bien s'afficher dans l'url , alors pour les lire , il ne suffisait pas juste de faire un
echo $nom_page".$i."";
?
Marsh Posté le 02-02-2002 à 11:03:17
>> pour les lire , il ne suffisait pas juste de faire un
echo $nom_page".$i."";
non, comme j'ai dit en haut, tu demandes d'afficher deux variables.
si tu veux tout comprendre de A à Z, on va bosser avec la notation polonaise inversée (bouh ), présente sur certaines calculatrices et similaire au fonctionnement interne d'un langage.
ie + 1 2 veut en fait dire 'calculer 1 + 2'. dans un langage, c'est représenté sous forme d'une pile, qu'on lit de bas en haut :
2
1
+
à l'éxécution, php regarde ce qu'il y a dans la pile, voit qu'il y a un opérateur +, et appelle la fonction +. la fonction + se charge de chopper les deux opérandes (paramètres, 1 et 2 ici) avec une fonction interne (qu'on va eppeler getOperand()), fait l'addition, et remplace la stack avec le résultat :
3
ensuite, tu as la notion de priorité des opérateurs, ie 1 + 2 * 3 sera converti en :
2
3
*
1
+
la fonction appelle lorsqu'elle choppe ses paramètres getOperand(). getOperand() regarde ce qu'il y a dans la pile, si c'est un nombre (1) elle renvoie ce nombre, si c'est un opérateur (ici, *) elle appelle la fonction liée à cet opérateur, qui va réaliser la même opération que '+' plus haut pour la multiplication. donc après l'appel à *, ta pile ressemblera à :
6
1
+
maintenant, on appelle +, on a :
7
hop, tout con.
en php, $ charge dans la pile la variable correspondant au symbole contenu dans l'entrée suivante de la pile (un nom, ici nom_page)
mettons que nom_page est une variable qui vaut "bonjour" :
nom_page
$
après éxécution de la fonction associée à $, tu as dans ta pile :
"bonjour"
comment est éxécuté un echo $nom_page ? pareil, echo est une référence à une fonction interne de php, qui demande une opérande :
nom_page
$
echo
echo appelle getOperand() qui éxécuté $ et ramène la pile à :
"bonjour"
echo
echo affiche alors "bonjour".
en php, . est l'opérateur de concaténation de deux chaînes, ie "bonjour" . " mario" renvoie "bonjour mario".
sur la pile, ça donne :
" mario"
"bonjour"
.
après éxécution de la fonction ., tu obtiens
"bonjour mario"
maintenant, quand tu demandes (mettons que nom_page vaut "bonjour", $i vaut 5)
echo $nom_page . $i
tu demandes en fait la concaténation des deux variables nom_page et i. la pile devient alors
i
$
nom_page
$
.
echo
à l'éxécution, echo appelle getOperand() qui tombe sur l'opérateur de concaténation . qui a donc besoin de deux paramètres. il appelle deux fois getOperand() :
la première fois, il tombe sur un opérateur $ qui va donc chercher la variable $i:
5
nom_page
$
.
echo
la seconde fois, il tombe à nouveau sur un opérateur $ qui va ici chercher la variable $nom_page :
5
"bonjour"
.
echo
maintenant que . a ses deux opérandes, il peut réaliser la concaténation :
"bonjour5"
echo
et passer le résultat à echo qui affiche "bonjour5".
//
quand tu fais ton code echo $nom_page . $i, nom_page n'existe pas, il concatène une chaîne vide avec la valeur de i, et passe cette valeur à echo.
ce que tu veux, c'est recréer le nom de la variable "nom_page" + un entier. par ex si i vaut 1, il faut donc que la pile, en interne, ressemble à :
nom_page1
$
echo
1 étant la valeur de $i, on veut donc chopper la variable dont le nom est la concaténation de nom_page et de i :
i
$
nom_page
.
$
echo
soit en php echo $(nom_page . $i)
soit la forme 'compactée' de
$maVariable = 'nompage' . $i;
echo $$maVariable;
qui peut $etre assemblé pour la première ligne par :
i
$
nom_page
.
maVariable
$
=
qui va créer une nouvelle variable 'maVariable' contenant le nom de la page.
la seconde ligne devient :
maVariable
$
$
echo
echo appelle getOperand(), qui tombe sur la fonction 'va chercher la variable', qui lui même tombe sur la fonction 'va chercher la variable'. cette seconde fonction va retourner :
nom_page1
$
echo
la première fonction peut donc récupérer la variable appelée nom_page1, et la passer à echo.
//
tu n'as pas besoin de connaître tout ça pour programmer, ça te sera juste très utile. une fois que tu l'as dans la tête, c'est limpide.
Marsh Posté le 02-02-2002 à 12:15:16
Trés bonne explication !! je comprends maintenant !!
Mes respect
Marsh Posté le 01-02-2002 à 20:33:05
Bonsoir
voila :
J'ai un formulaire form.php qui affiche un lot de 2 champs (type="text", type="text" ) , le nombre de fois que ce lot est affiché est defini dans un précédent formulaire nb.php .
J'ai donc fait pour le fichier form.php une boucle WHILE qui tourne et affiche les lot de 2 champs le nombre de fois que l'on as defini dans nb.php .
Pour permettre la suite , j'ai nommé le premier champs name="champs1[]" avec des [] pour dire que l'on classe dans un tableau comme des chackbox , et le 2eme champs je l'ai nommé name="champs2<? echo $i; ?>" , $i etant un compteur qui s'autoincrement de 1.
Dans le fichier form2.php , j'ai fait une fonction WHILE (list ...) qui va voir tout les champs1 qui ont valeur et qui va les afficher mais aussi afficher les champs2 , la encore j'ai fait appel a un $i.
Tout devrait fonctionner , mais non , quand je lui demande d'afficher la valeur de champs2 , il ne m'affiche que le $i du compteur !
Si vous n'avez pas trop compris le probleme , je publie mes codes :
FICHIER NB.PHP :
<form>
<input type="text" name="nb">
submit ...
</form>
FICHIER FORM1.PHP :
$i = "1";
while ($i<=$nb)
{?>
Nom du lien :
<input type="text" name="lien[]" class="admin_style">
Nom de la page :
<input type="text" name="<? echo "nom_page".$i.""; ?>" class="admin_style
<?
$i++;
}
?>
FICHIER FORM2.PHP :
$i = "1";
while (list(,$ajout)=each($lien))
{
echo $ajout;
echo "<br>";
echo "$nom_page".$i++."";
echo "<br>";
}
Je pense que c'est assez comprehensible si l'on comprends la fonction LIST ! Je ne comprends pas , pourtant on lie bien les variables dans l'url ! si je met nom_page1 , au lieu de "$nom_page".$i."" , ca marche !!
help me !!
---------------
Je sais pas faire de revers coupé