Portée des variables dans un même script - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Portée des variables dans un même script

Par paintbox -  4 reponses -  Le 28/07/2010 -  Flux RSS - 

Bonjour,

 

une fois de plus,  je fais appel à votre aide.

Voici le problème que je rencontre. J'ai 2 pages,la première est un simple formulaire à 1 champs qui permet de faire une recherche sur un numéro d'article. Sur cette même page apparaît le résultat. De cette page, on peut cliquer sur le numéro d'article pour éditer sa fiche. La seconde page est donc la fiche permettant de modifier les infos sur l'article. Le numéro d'article ($id_biens) entre la page 1° et la 2° se fait par un GET.

Chose étrange c'est que au début de mon code je récupère $id_biens sans problème mais lorsque je fais à nouveau appel à cette variable notamment pour ma requete sql, plus moyen d'avoir sa valeur ! Et donc,mes champs ne se préremplissent plus.

J'ai donc pensée à un problème de porté de variable, mais il ne me semble pas que ce soit le cas dans mon code. Je ne vois donc vraiment pas.

 

Peut-être l'un de vous aura une idée.

 

D'avance merci, voici mon code

 

[code]

 $id_biens=$_GET['id_biens'];//Récupération de l'id du bien à modifier

echo '<DIV class="container">';

echo '<p>Modification de la fiche du bien : '.$_GET['id_biens'].'</p>';

echo '<hr />';

/*DEBUT TRAITEMENT MODIFICATION BIEN*/

/*---------------------------------*/

if(isset($_GET['modifier_bien'])) //Si on demande de modifier un bien

{

//On protège la variable modifier_news pour éviter une faille SQL

$_GET['modifier_bien']=mysql_real_escape_string(htmlspecialchars($_GET['modifier_bien']));

//On récupère les infos de la news correspondante

$retour=mysql_query('SELECT * FROM biens INNER JOIN communes ON biens.id_commune=communes.id_commune WHERE id_biens=\''.$_GET['id_biens'].'\'');

$donnees=mysql_fetch_array($retour);

//Récupération des données

$bien=htmlentities($donnees['code_bien'], ENT_QUOTES,'UTF-8');

$statut=htmlentities($donnees['code_statut'], ENT_QUOTES,'UTF-8');

$adresse=htmlentities($donnees['adresse'], ENT_QUOTES,'UTF-8');

$commune=htmlentities($donnees['commune'], ENT_QUOTES,'UTF-8');

$pays=htmlentities($donnees['pays'], ENT_QUOTES,'UTF-8');

$prix=htmlentities($donnees['prix'], ENT_QUOTES,'UTF-8');

$description=htmlentities($donnees['description'], ENT_QUOTES,'UTF-8');

$id_biens=$donnees['id_biens']; //Cette variable va servir pour se souvenir que c'est une modification

}

else //C'est qu'on rédige une nouvelle news

{

//Les variables sont vides, puisque c'est un nouveau bien

$bien='';

$statut='';

$adresse='';

$commune='';

$pays='';

$prix='';

$descrition='';

$option[]='';

$id_biens=0;

}

/*FIN TRAITEMENT MODIFICATION BIEN*/

/*------------------------------*/

$request_commune=mysql_query('SELECT commune, id_commune, code_postal FROM communes');//Requete pour la liste des communes

 

/*DEBUT FORMULAIRE AJOUT DE BIENS*/

/*------------------------------*/

echo '<form action="gestion.php" method="POST" enctype="multipart/form-data">';

echo '<fieldset>';

echo '<legend>Vous êtes sur le point de modifier le bien : '.$id_biens.'</legend>';

echo '<br />';

echo '<p>Sélectionnez le type de bien</p>';

echo '<br />';

 

//Affichage type bien

if($donnees['code_bien']==10)

{

echo '<input type="radio" name="bien" value="Maison" checked="checked" ><label>Maison</label>';

echo '<input type="radio" name="bien" value="Appartement" ><label>Appartement</label>';

echo '<input type="radio" name="bien" value="Studio"><label>Studio</label>';

echo '<input type="radio" name="bien" value="Magasin"><label>Magasin</label>';

echo '<input type="radio" name="bien" value="Bureau"><label>Bureau</label>';

}

 

if($donnees['code_bien']==20)

{

echo '<input type="radio" name="bien" value="Maison" ><label>Maison</label>';

echo '<input type="radio" name="bien" value="Appartement" checked="checked" ><label>Appartement</label>';

echo '<input type="radio" name="bien" value="Studio"><label>Studio</label>';

echo '<input type="radio" name="bien" value="Magasin"><label>Magasin</label>';

echo '<input type="radio" name="bien" value="Bureau"><label>Bureau</label>';

}

if($donnees['code_bien']==30)

{

echo '<input type="radio" name="bien" value="Maison" ><label>Maison</label>';

echo '<input type="radio" name="bien" value="Appartement" ><label>Appartement</label>';

echo '<input type="radio" name="bien" value="Studio" checked="checked" ><label>Studio</label>';

echo '<input type="radio" name="bien" value="Magasin"><label>Magasin</label>';

echo '<input type="radio" name="bien" value="Bureau"><label>Bureau</label>';

}

if($donnees['code_bien']==40)

{

echo '<input type="radio" name="bien" value="Maison" ><label>Maison</label>';

echo '<input type="radio" name="bien" value="Appartement" ><label>Appartement</label>';

echo '<input type="radio" name="bien" value="Studio" ><label>Studio</label>';

echo '<input type="radio" name="bien" value="Magasin" checked="checked" ><label>Magasin</label>';

echo '<input type="radio" name="bien" value="Bureau"><label>Bureau</label>';

}

if($donnees['code_bien']==50)

{

echo '<input type="radio" name="bien" value="Maison" ><label>Maison</label>';

echo '<input type="radio" name="bien" value="Appartement" ><label>Appartement</label>';

echo '<input type="radio" name="bien" value="Studio" ><label>Studio</label>';

echo '<input type="radio" name="bien" value="Magasin" ><label>Magasin</label>';

echo '<input type="radio" name="bien" value="Bureau" checked="checked" ><label>Bureau</label>';

}

//FIN Affichage type bien

echo '<br />';

echo '<br />';

 

//Affichage Statut du bien

echo '<p>Sélectionnez le statut du bien</p>';

echo '<br />';

if($donnees['code_statut']==10)

{

echo '<input type="radio" name="statut" value="vendre" id="10" checked="checked" /><label>A vendre</label>';

echo '<input type="radio" name="statut" value="louer" id="20" /><label>A louer</label>';

}

if($donnees['code_statut']==20)

{

echo '<input type="radio" name="statut" value="vendre" id="10"  /><label>A vendre</label>';

echo '<input type="radio" name="statut" value="louer" id="20" checked="checked"/><label>A louer</label>';

}

//FIN Affichage Statut du bien

echo '<br />';

echo '<br />';

echo '<label>Adresse du bien : </label><input type="text" name="adresse" value="'.htmlentities($donnees['adresse']).'" size="75" />';

echo '<br />';

echo '<label>Sélectionnez une commune : '.$commune.'</label>';

echo '<SELECT name="commune" size="1" value='.$commune.'>';

echo '<OPTION>'.$commune.'</OPTION>';//Permet d'avoir un premier champs vide

while($donnees_commune=mysql_fetch_array($request_commune))

{

echo '<OPTION name="commune" value="'.$donnees_commune['commune'].'">'.$donnees_commune['commune'].'</OPTION>';

}

echo '</SELECT>';

echo '<label>Pays : </label>';

echo '<SELECT name="pays">';

echo '<OPTION>'.$pays.'</OPTION>';

echo '<OPTION name"Belgique">Belgique</OPTION>';

echo '<OPTION name"France">France</OPTION>';

echo '<OPTION name"Luxembourg">Luxembourg</OPTION>';

echo '<OPTION name"Pays-Bas">Pays-Bas</OPTION>';

echo '</SELECT>';

echo '<br />';

echo '<label>Prix : </label><input type="text" name="prix" size="30" value="'.$prix.'"/> Euros';

echo '<br />';

echo '<br />';

 

 

//Affichage des options

echo '<td>Garage : ';

if ($donnees['garage']==1)

{

echo '<input type="checkbox" name="option[]" value="garage" checked="true" >'; }

else

{

echo '<input type="checkbox" name="option[]" value="garage" >';

}

echo '<td>';

echo '</tr>';

echo '<tr>';

echo '<td>Jardin : ';

 

if ($donnees['jardin']==1)

{

echo '<input type="checkbox" name="option[]" value="jardin" checked="true" >';

}

else

{

echo '<input type="checkbox" name="option[]" value="jardin" >'; 

}

echo '<td>';

echo '</tr>';

echo '<tr>';

echo '<td>Grenier : ';

 

if ($donnees['grenier']==1)

{

echo '<input type="checkbox" name="option[]" value="grenier" checked="true" >';

}

else

{

echo '<input type="checkbox" name="option[]" value="grenier">';

}

echo '<td>';

echo '</tr>';

echo '<tr>';

echo '<td>Cave : ';

 

if ($donnees['cave']==1)

{

echo '<input type="checkbox" name="option[]" value="cave" checked="true" >';

}

else

{

echo '<input type="checkbox" name="option[]" value="cave" >';

}

//FIN Affichage des options

echo '<br />';

echo '<br />';

 

//Affichage des images du bien

echo '<p>Images enregistrées pour ce bien :</p>';

echo '<br />';

 

echo vignettes($id_biens); //Appel de la fonction pour afficher les vignettes des images

echo '<br />';

 

 

//Description du bien

echo '<label>Description du bien : </label><br /><textarea name="description" rows="20" cols="80">'.htmlentities($donnees['description']).'</textarea>';

echo '<br />';

echo '<br />';

echo '<input type="hidden" name="id_biens" value="'.$id_biens.'" />';

echo '<input type="submit" name="modifier_bien" value="Modifier" id="'.$id_biens.'"/></a><input type="reset" value="Effacer"/>';

echo '</fieldset>';

echo '</form>';

[/code] 

 

 

 

Réponses apportées à cette discussion

Par Cyrano -  Le 28/07/2010 - 

Normal : ton formulaire utilise la méthode POST : donc au second tour, ton id_bien étant récupéré en GET, il ne le trouve pas.

Il faudrait modifier l'initialisation de ta variable en début de code comme ceci :

  1. $id_biens = (isset($_GET['id_biens'])) ? $_GET['id_biens'] : ((isset($_POST['id_biens'])) ? $_POST['id_biens'] : null);

Résultat, si on le trouve en GET, pas de problème, sinon on le cherche en POST. Et si on ne l'y touve pas non plus, tu pars sur une valeur NULL.

Autre chose, j'en profite pour te suggérer de privilégier la simplicité et d'écrire moins de code. Tu crées des boutons radio en faisant une suite de if() por savoir lequel cocher, mais du coup tu as 5 fois le code HTML de tes boutons juste pour ajouter un seul checked="checked": simplifiions :

  1. // On commence par définir une constante, ça fera encore moins de code à écrire
  2. define('RADIO_CHECKED', ' checked="checked"');
  3.  
  4. // On définit une variable pour chaque bouton radio :
  5. $maisonchecked = ($donnees['code_bien'] == 10) ? RADIO_CHECKED : null;
  6. $appartchecked = ($donnees['code_bien'] == 20) ? RADIO_CHECKED : null;
  7. $studiochecked = ($donnees['code_bien'] == 30) ? RADIO_CHECKED : null;
  8. $magasinchecked = ($donnees['code_bien'] == 40) ? RADIO_CHECKED : null;
  9. $bureauchecked = ($donnees['code_bien'] == 50) ? RADIO_CHECKED : null;
  10.  
  11. // Et maintenant on peut afficher les boutons radios :
  12. echo '<input type="radio" name="bien" value="Maison"'. $maisonchecked .'><label>Maison</label>';
  13. echo '<input type="radio" name="bien" value="Appartement"'. $appartchecked .'><label>Appartement</label>';
  14. echo '<input type="radio" name="bien" value="Studio"'. $studiochecked .'><label>Studio</label>';
  15. echo '<input type="radio" name="bien" value="Magasin"'. $magasinchecked .'><label>Magasin</label>';
  16. echo '<input type="radio" name="bien" value="Bureau"'. $bureauchecked .'><label>Bureau</label>';

Pas plus clair comme ça ? ;-)

Enfin bon, ceci dit, tu es capable de faire mieux du coté du HTML : regarde un peu la source une fois ta page affichée dans un navigateur et ose me dire que c'est lisible :p

 

 
Par Cyrano -  Le 29/07/2010 - 

Tiens allez, pour te donner un modèle, ton code réaligné proprement, ça pourrait (devrait) ressembler à ceci :

  1. <?php
  2. //Récupération de l'id du bien à modifier
  3. $id_biens = (isset($_GET['id_biens'])) ? $_GET['id_biens'] : ((isset($_POST['id_biens'])) ? $_POST['id_biens'] : 0);
  4.  
  5. /*DEBUT TRAITEMENT MODIFICATION BIEN*/
  6. /*---------------------------------*/
  7. if(isset($_GET['modifier_bien'])) //Si on demande de modifier un bien
  8. {
  9. //On protège la variable modifier_news pour éviter une faille SQL
  10. $_GET['modifier_bien'] = mysql_real_escape_string(htmlspecialchars($_GET['modifier_bien']));
  11. //On récupère les infos de la news correspondante
  12. $sql = "SELECT ".
  13. " code_bien, ".
  14. " code_statut, ".
  15. " adresse, ".
  16. " commune, ".
  17. " pays, ".
  18. " prix, ".
  19. " description ".
  20. "FROM biens ".
  21. "INNER JOIN communes ON biens.id_commune = communes.id_commune ".
  22. "WHERE id_biens ='". $id_biens ."'";
  23. $retour = mysql_query($sql);
  24. $donnees = mysql_fetch_array($retour);
  25. //Récupération des données
  26. $bien = htmlentities($donnees['code_bien'], ENT_QUOTES,'UTF-8');
  27. $statut = htmlentities($donnees['code_statut'], ENT_QUOTES,'UTF-8');
  28. $adresse = htmlentities($donnees['adresse'], ENT_QUOTES,'UTF-8');
  29. $commune = htmlentities($donnees['commune'], ENT_QUOTES,'UTF-8');
  30. $pays = htmlentities($donnees['pays'], ENT_QUOTES,'UTF-8');
  31. $prix = htmlentities($donnees['prix'], ENT_QUOTES,'UTF-8');
  32. $description = htmlentities($donnees['description'], ENT_QUOTES,'UTF-8');
  33. }
  34. else //C'est qu'on rédige une nouvelle news
  35. {
  36. //Les variables sont vides, puisque c'est un nouveau bien
  37. $bien = '';
  38. $statut = '';
  39. $adresse = '';
  40. $commune = '';
  41. $pays = '';
  42. $prix = '';
  43. $descrition = '';
  44. $option[] = '';
  45. }
  46. /*FIN TRAITEMENT MODIFICATION BIEN*/
  47. /*------------------------------*/
  48. $request_commune = mysql_query('SELECT commune, id_commune, code_postal FROM communes');//Requete pour la liste des communes
  49.  
  50. // On commence par définir une constante, ça fera encore moins de code à écrire
  51. define('RADIO_CHECKED', ' checked="checked"');
  52.  
  53. // On définit une variable pour chaque bouton radio ou les cases à cocher :
  54. $maisonchecked = ($donnees['code_bien'] == 10) ? RADIO_CHECKED : null;
  55. $appartchecked = ($donnees['code_bien'] == 20) ? RADIO_CHECKED : null;
  56. $studiochecked = ($donnees['code_bien'] == 30) ? RADIO_CHECKED : null;
  57. $magasinchecked = ($donnees['code_bien'] == 40) ? RADIO_CHECKED : null;
  58. $bureauchecked = ($donnees['code_bien'] == 50) ? RADIO_CHECKED : null;
  59. $vendrechecked = ($donnees['code_statut'] == 10) ? RADIO_CHECKED : null;
  60. $louerchecked = ($donnees['code_statut'] == 20) ? RADIO_CHECKED : null;
  61. // Options du bien
  62. $garagechecked = ($donnees['garage']==1) ? RADIO_CHECKED : null;
  63. $jardinchecked = ($donnees['jardin']==1) ? RADIO_CHECKED : null;
  64. $grenierchecked = ($donnees['grenier']==1) ? RADIO_CHECKED : null;
  65. $cavechecked = ($donnees['cave']==1) ? RADIO_CHECKED : null;
  66.  
  67. // Appel de la fonction pour afficher les vignettes des images
  68. $sVignettes = vignettes($id_biens);
  69. // On crée des variables pour les textes à traiter avant affichage :
  70. $sAdresse = htmlentities($donnees['adresse']);
  71. $sDescription = htmlentities($donnees['description']);
  72.  
  73. /*-----------------------------*/
  74. /* FORMULAIRE AJOUT DE BIENS */
  75. /*-----------------------------*/
  76. $sHtml = <<<CODE_HTML
  77. <div class="container">
  78. <p>Modification de la fiche du bien : {$id_biens}</p>
  79. <hr />
  80. <form action="gestion.php" method="post" enctype="multipart/form-data">
  81. <fieldset>
  82. <legend>Vous êtes sur le point de modifier le bien : {$id_biens}</legend>
  83. <br />
  84. <p>Sélectionnez le type de bien</p>
  85. <br />
  86. <input type="radio" name="bien" value="Maison"{$maisonchecked} /><label>Maison</label>
  87. <input type="radio" name="bien" value="Appartement"{$appartchecked} /><label>Appartement</label>
  88. <input type="radio" name="bien" value="Studio"{$studiochecked} /><label>Studio</label>
  89. <input type="radio" name="bien" value="Magasin"{$magasinchecked} /><label>Magasin</label>
  90. <input type="radio" name="bien" value="Bureau"{$bureauchecked} /><label>Bureau</label>
  91. <br />
  92. <br />
  93. <p>Sélectionnez le statut du bien</p>
  94. <br />
  95. <input type="radio" name="statut" value="vendre" id="10"{$vendrechecked} /><label>A vendre</label>';
  96. <input type="radio" name="statut" value="louer" id="20"{$louerchecked} /><label>A louer</label>
  97. <br />
  98. <br />
  99. <label>adresse du bien : </label><input type="text" name="adresse" value="{$sAdresse}" size="75" />
  100. <br />
  101. <label>sélectionnez une commune : {$commune}</label>
  102. <select name="commune" size="1" value="{$commune}">
  103. <option>{$commune}</option>
  104.  
  105. CODE_HTML;
  106. while($donnees_commune=mysql_fetch_array($request_commune))
  107. {
  108. $sHtml .= <<<CODE_HTML
  109. <option name="commune" value="{$donnees_commune['commune']}">{$donnees_commune['commune']}</option>
  110.  
  111. CODE_HTML;
  112. }
  113. $sHtml .= <<<CODE_HTML
  114. </select>
  115. <label>pays : </label>
  116. <select name="pays">
  117. <option>{$pays}</option>
  118. <option name"belgique">belgique</option>
  119. <option name"france">france</option>
  120. <option name"luxembourg">luxembourg</option>
  121. <option name"pays-bas">pays-bas</option>
  122. </select>
  123. <br />
  124. <label>prix : </label><input type="text" name="prix" size="30" value="{$prix}" /> euros
  125. <br />
  126. <br />
  127. <table summary="options du bien">
  128. <tr>
  129. <td>
  130. Garage : <input type="checkbox" name="option[]" value="garage"{$garagechecked} />
  131. <td>
  132. </tr>
  133. <tr>
  134. <td>
  135. Jardin : <input type="checkbox" name="option[]" value="jardin"{$jardinchecked} />
  136. <td>
  137. </tr>
  138. <tr>
  139. <td>
  140. Grenier : <input type="checkbox" name="option[]" value="grenier"{$grenierchecked} />
  141. <td>
  142. </tr>
  143. <tr>
  144. <td>
  145. Cave : <input type="checkbox" name="option[]" value="cave"{$cavechecked} />
  146. <td>
  147. </tr>
  148. </table>
  149. <br />
  150. <br />
  151. <p>Images enregistrées pour ce bien :</p>
  152. <br />
  153. {$sVignettes}
  154. <br />
  155. <label>Description du bien : </label><br />
  156. <textarea name="description" rows="20" cols="80">{$sDescription}</textarea>
  157. <br />
  158. <br />
  159. <input type="hidden" name="id_biens" value="{$id_biens}" />
  160. <input type="submit" name="modifier_bien" value="Modifier" id="{$id_biens}" />
  161. <input type="reset" value="Effacer" />
  162. </fieldset>
  163. </form>
  164. </div>
  165.  
  166. CODE_HTML;
  167.  
  168. // Maintenant que le code HTML est construit, on peut l'afficher :
  169. echo($sHtml);

Regarde dans la documentation de PHP les informations sur la syntaxe « Heredoc », tu comprendras tout de suite à quoi je fais référence. Malheureusement cette syntaxe n'est pas bien prise en charge ici pour la coloration syntaxique, mais teste-la, tu vas réaliser qu'on gagne énormément de temps et en lisibilité.

 

 

 
Par paintbox -  Le 29/07/2010 - 

Bonjour Cyrano,

une nouvelle fois, merci pour ton aide!

Cela fonctionne à présent. J'ai comme tu me l'as conseillé définit une constante pour mes boutons "checked" et j'ai réorganisé mon code. Cela paraît effectivement déjà un peu plus propre et plus claire.

Pas évident quand on se forme par soi même d'adopter les bonnes méthodes et une bonne organisation dans son code. Je me sert essentiellement de bouquins et du net pour me former. Chaque livre, chaque site à sa façon de coder et d'organiser son code. Si tu as de bonnes adresses ou d'autres conseils (mis à part  www.apprendre-php.com évidement que j'utilise régulièrement) pour se former, je suis preneur. 

 J'ai fais quelques recherches sur la syntaxe heredoc mais j'avoue que je ne comprend pas trop le fonctionnement. 

Je retourne à mon projet jusqu'au prochain obstacle 

 

 

 
Par Cyrano -  Le 29/07/2010 - 

Salut Paintbox,

dis-toi que je suis moi-même autodidacte. Mais justement, c'est en étant discipliné et rigoureux que j'ai pu arriver à mon niveau actuel au point de pouvoir gagner ma vie en développant an PHP.

Si tu vas sur les forums de PHPFrance, tu verras que j'y ai été très très actif et même si maintenant je n'y fais que de rares apparitions, je suis toujours le premier posteur. Il y a un forum de tutos divers en plus des tutos du site lui-même.

Pour ce qui est de la syntaxe Heredoc, en fait c'est relativement simple d'utilisation. Une initialisation normale de variable, c'est :

  1. $maVariable = "une valeur quelconque";

ça pourrait aussi être le retour d'une fonction :

  1. $maVariable = maFonction('parametre');

Attention dans ce ca parce qu'on est jamais ecertain du retour, donc il vaut valider le retour ou bien inclure dans la fonction une gestion d'erreur s'il n'y a pas de données à retourner.

Ensuite la syntaxe Heredoc. En gros, on affecte une chaine de caractère et le formatage est conservé. Dans cette chaine, on peut insérer d'autres variables PHP, mais pas de fonctions, attention à ce détail. Si tu regardes la correction que je t'ai proposé, il y a deux variables qui sont des retours de fonction que j,ai définies avant de les insérer dans la chaine de caractère. On insère ces variables en les mettant entre deux accolades :

  1. $maVariable = <<<UN_MOT_CLE_DE_MON_CHOIX
  2. <p>
  3. Une phrase quelconque à propos de {$maVariable}.<br />
  4. On peut aussi utiliser des tableaux, par exemple {$monTableau['index_choisi']}
  5. </p>
  6.  
  7. UN_MOT_CLE_DE_MON_CHOIX;

Attention à un autre détail important : la chaine est comprise entre « <<<UN_MOT_CLE_DE_MON_CHOIX » et « UN_MOT_CLE_DE_MON_CHOIX; » :

  1. le mot de fin doit être strictement le même que le premier.
  2. Le premier doit impérativement être précédé par un triple chevron;
  3. Le mot de fermeture doit obligatoirement être positionné en début de ligne, aucun espace n'est parmis sinon ça plante;
  4. On laisse en général la dernière ligne de chaine vide pour laisser un retour de chariot, le code source qui apparaitra dans le navigateur sera plus lisible.

Ce système permet d'utiliser de longues chaines et donc c'est tout à fait approprié pour des parties de HTML.

Une autre syntaxe dont le nom m'échappe, et disponible dans PHP 5.3, permet maintenant l'ajout de retours de fonctions en plus des variables, retours de fonctions interdits dans HEREDOC

 

 

 

 

 

Ajouter une réponse à la discussion

Seuls les membres loggués sont autorisés à poster dans les forums !