Portée des variables dans un même script
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 '';
echo 'Modification de la fiche du bien : '.$_GET['id_biens'].'';
echo '';
/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 '';
echo '';
echo 'Vous êtes sur le point de modifier le bien : '.$id_biens.'';
echo '';
echo 'Sélectionnez le type de bien';
echo '';
//Affichage type bien
if($donnees['code_bien']==10)
{
echo 'Maison';
echo 'Appartement';
echo 'Studio';
echo 'Magasin';
echo 'Bureau';
}
if($donnees['code_bien']==20)
{
echo 'Maison';
echo 'Appartement';
echo 'Studio';
echo 'Magasin';
echo 'Bureau';
}
if($donnees['code_bien']==30)
{
echo 'Maison';
echo 'Appartement';
echo 'Studio';
echo 'Magasin';
echo 'Bureau';
}
if($donnees['code_bien']==40)
{
echo 'Maison';
echo 'Appartement';
echo 'Studio';
echo 'Magasin';
echo 'Bureau';
}
if($donnees['code_bien']==50)
{
echo 'Maison';
echo 'Appartement';
echo 'Studio';
echo 'Magasin';
echo 'Bureau';
}
//FIN Affichage type bien
echo '';
echo '';
//Affichage Statut du bien
echo 'Sélectionnez le statut du bien';
echo '';
if($donnees['code_statut']==10)
{
echo 'A vendre';
echo 'A louer';
}
if($donnees['code_statut']==20)
{
echo 'A vendre';
echo 'A louer';
}
//FIN Affichage Statut du bien
echo '';
echo '';
echo 'Adresse du bien : ';
echo '';
echo 'Sélectionnez une commune : '.$commune.'';
echo '';
echo ''.$commune.'';//Permet d'avoir un premier champs vide
while($donnees_commune=mysql_fetch_array($request_commune))
{
echo ''.$donnees_commune['commune'].'';
}
echo '';
echo 'Pays : ';
echo '';
echo ''.$pays.'';
echo 'Belgique';
echo 'France';
echo 'Luxembourg';
echo 'Pays-Bas';
echo '';
echo '';
echo 'Prix : Euros';
echo '';
echo '';
//Affichage des options
echo 'Garage : ';
if ($donnees['garage']==1)
{
echo ''; }
else
{
echo '';
}
echo '';
echo '';
echo '';
echo 'Jardin : ';
if ($donnees['jardin']==1)
{
echo '';
}
else
{
echo '';
}
echo '';
echo '';
echo '';
echo 'Grenier : ';
if ($donnees['grenier']==1)
{
echo '';
}
else
{
echo '';
}
echo '';
echo '';
echo '';
echo 'Cave : ';
if ($donnees['cave']==1)
{
echo '';
}
else
{
echo '';
}
//FIN Affichage des options
echo '';
echo '';
//Affichage des images du bien
echo 'Images enregistrées pour ce bien :';
echo '';
echo vignettes($id_biens); //Appel de la fonction pour afficher les vignettes des images
echo '';
//Description du bien
echo 'Description du bien : '.htmlentities($donnees['description']).'';
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
[/code]
Réponses apportées à cette discussion
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 :
$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 :
// On commence par définir une constante, ça fera encore moins de code à écrire
define('RADIO_CHECKED', ' checked="checked"');
// On définit une variable pour chaque bouton radio :
$maisonchecked = ($donnees['code_bien'] == 10) ? RADIO_CHECKED : null;
$appartchecked = ($donnees['code_bien'] == 20) ? RADIO_CHECKED : null;
$studiochecked = ($donnees['code_bien'] == 30) ? RADIO_CHECKED : null;
$magasinchecked = ($donnees['code_bien'] == 40) ? RADIO_CHECKED : null;
$bureauchecked = ($donnees['code_bien'] == 50) ? RADIO_CHECKED : null;
// Et maintenant on peut afficher les boutons radios :
echo '<input type="radio" name="bien" value="Maison"'. $maisonchecked .'><label>Maison</label>';
echo '<input type="radio" name="bien" value="Appartement"'. $appartchecked .'><label>Appartement</label>';
echo '<input type="radio" name="bien" value="Studio"'. $studiochecked .'><label>Studio</label>';
echo '<input type="radio" name="bien" value="Magasin"'. $magasinchecked .'><label>Magasin</label>';
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
Tiens allez, pour te donner un modèle, ton code réaligné proprement, ça pourrait (devrait) ressembler à ceci :
<?php
//Récupération de l'id du bien à modifier
$id_biens = (isset($_GET['id_biens'])) ? $_GET['id_biens'] : ((isset($_POST['id_biens'])) ? $_POST['id_biens'] : 0);
/*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
$sql = "SELECT ".
" code_bien, ".
" code_statut, ".
" adresse, ".
" commune, ".
" pays, ".
" prix, ".
" description ".
"FROM biens ".
"INNER JOIN communes ON biens.id_commune = communes.id_commune ".
"WHERE id_biens ='". $id_biens ."'";
$retour = mysql_query($sql);
$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');
}
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[] = '';
}
/*FIN TRAITEMENT MODIFICATION BIEN*/
/*------------------------------*/
$request_commune = mysql_query('SELECT commune, id_commune, code_postal FROM communes');//Requete pour la liste des communes
// On commence par définir une constante, ça fera encore moins de code à écrire
define('RADIO_CHECKED', ' checked="checked"');
// On définit une variable pour chaque bouton radio ou les cases à cocher :
$maisonchecked = ($donnees['code_bien'] == 10) ? RADIO_CHECKED : null;
$appartchecked = ($donnees['code_bien'] == 20) ? RADIO_CHECKED : null;
$studiochecked = ($donnees['code_bien'] == 30) ? RADIO_CHECKED : null;
$magasinchecked = ($donnees['code_bien'] == 40) ? RADIO_CHECKED : null;
$bureauchecked = ($donnees['code_bien'] == 50) ? RADIO_CHECKED : null;
$vendrechecked = ($donnees['code_statut'] == 10) ? RADIO_CHECKED : null;
$louerchecked = ($donnees['code_statut'] == 20) ? RADIO_CHECKED : null;
// Options du bien
$garagechecked = ($donnees['garage']==1) ? RADIO_CHECKED : null;
$jardinchecked = ($donnees['jardin']==1) ? RADIO_CHECKED : null;
$grenierchecked = ($donnees['grenier']==1) ? RADIO_CHECKED : null;
$cavechecked = ($donnees['cave']==1) ? RADIO_CHECKED : null;
// Appel de la fonction pour afficher les vignettes des images
$sVignettes = vignettes($id_biens);
// On crée des variables pour les textes à traiter avant affichage :
$sAdresse = htmlentities($donnees['adresse']);
$sDescription = htmlentities($donnees['description']);
/*-----------------------------*/
/* FORMULAIRE AJOUT DE BIENS */
/*-----------------------------*/
$sHtml = <<<CODE_HTML
<div class="container">
<p>Modification de la fiche du bien : {$id_biens}</p>
<hr />
<form action="gestion.php" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Vous êtes sur le point de modifier le bien : {$id_biens}</legend>
<br />
<p>Sélectionnez le type de bien</p>
<br />
<input type="radio" name="bien" value="Maison"{$maisonchecked} /><label>Maison</label>
<input type="radio" name="bien" value="Appartement"{$appartchecked} /><label>Appartement</label>
<input type="radio" name="bien" value="Studio"{$studiochecked} /><label>Studio</label>
<input type="radio" name="bien" value="Magasin"{$magasinchecked} /><label>Magasin</label>
<input type="radio" name="bien" value="Bureau"{$bureauchecked} /><label>Bureau</label>
<br />
<br />
<p>Sélectionnez le statut du bien</p>
<br />
<input type="radio" name="statut" value="vendre" id="10"{$vendrechecked} /><label>A vendre</label>';
<input type="radio" name="statut" value="louer" id="20"{$louerchecked} /><label>A louer</label>
<br />
<br />
<label>adresse du bien : </label><input type="text" name="adresse" value="{$sAdresse}" size="75" />
<br />
<label>sélectionnez une commune : {$commune}</label>
<select name="commune" size="1" value="{$commune}">
<option>{$commune}</option>
CODE_HTML;
while($donnees_commune=mysql_fetch_array($request_commune))
{
$sHtml .= <<<CODE_HTML
<option name="commune" value="{$donnees_commune['commune']}">{$donnees_commune['commune']}</option>
CODE_HTML;
}
$sHtml .= <<<CODE_HTML
</select>
<label>pays : </label>
<select name="pays">
<option>{$pays}</option>
<option name"belgique">belgique</option>
<option name"france">france</option>
<option name"luxembourg">luxembourg</option>
<option name"pays-bas">pays-bas</option>
</select>
<br />
<label>prix : </label><input type="text" name="prix" size="30" value="{$prix}" /> euros
<br />
<br />
<table summary="options du bien">
<tr>
<td>
Garage : <input type="checkbox" name="option[]" value="garage"{$garagechecked} />
<td>
</tr>
<tr>
<td>
Jardin : <input type="checkbox" name="option[]" value="jardin"{$jardinchecked} />
<td>
</tr>
<tr>
<td>
Grenier : <input type="checkbox" name="option[]" value="grenier"{$grenierchecked} />
<td>
</tr>
<tr>
<td>
Cave : <input type="checkbox" name="option[]" value="cave"{$cavechecked} />
<td>
</tr>
</table>
<br />
<br />
<p>Images enregistrées pour ce bien :</p>
<br />
{$sVignettes}
<br />
<label>Description du bien : </label><br />
<textarea name="description" rows="20" cols="80">{$sDescription}</textarea>
<br />
<br />
<input type="hidden" name="id_biens" value="{$id_biens}" />
<input type="submit" name="modifier_bien" value="Modifier" id="{$id_biens}" />
<input type="reset" value="Effacer" />
</fieldset>
</form>
</div>
CODE_HTML;
// Maintenant que le code HTML est construit, on peut l'afficher :
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é.
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
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 :
$maVariable = "une valeur quelconque";
ça pourrait aussi être le retour d'une fonction :
$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 :
$maVariable = <<<UN_MOT_CLE_DE_MON_CHOIX
<p>
Une phrase quelconque à propos de {$maVariable}.<br />
On peut aussi utiliser des tableaux, par exemple {$monTableau['index_choisi']}
</p>
UN_MOT_CLE_DE_MON_CHOIX;
Attention à un autre détail important : la chaine est comprise entre « *