une variable SESSION disparait

Eléphant du PHP | 206 Messages

08 avr. 2007, 17:07

Bonjour à tous,

Dans cette portion de code, il arrive à un moment que ma SESSION['rang'] perde sa valeur.
Ce bout de code traite justement des rang à fixer à l'utilisateur.
Vous verrez que j'ai mis plusieurs echo $_SESSION pour voir l'endroit précis
il s'avere que c'est au 4ème que ma variable ne marche plus
case "droits":
	        //Droits d'un membre (rang)
				
		        echo'<h1>Edition des droits d un membre</h1>'; 

		        if(!isset($_POST['membre']))
		        {
		                echo'<h2>De quel membre voulez-vous modifier les droits ?<br />';
		                echo'<br /><form method="post"
		                action="./admin.php?cat=membres&action=droits">
		                <label for="membre">Inscrivez le pseudo : </label> <input type="text"
		                id="membre" name="membre"><input type="submit" name="Chercher"></form></h2>';

		        }
		        else
		        {
		echo '1'.$_SESSION['rang'];
		                $pseudo = htmlspecialchars($_POST['membre'], ENT_QUOTES);

		                $requete_membre = mysql_query('SELECT pseudo,rang
		                FROM membres WHERE pseudo = "'.$pseudo.'"');
				echo '<br />2'.$_SESSION['rang'];

		                if ($data = mysql_fetch_assoc($requete_membre))
		                {    
		echo '<br />3'.$_SESSION['rang'];

		                echo'<form action="./adminok.php?cat=membres&action=droits"
		                method="post">';
						 $rang = array
		                (0 => "Visiteur",
		                1 => "Membre",
		                2 => "VIP",
		                3 => "Modérateur",
		                5 => "Admin"); //Ce tableau associe numéro de droit et nom
												 		echo '<br />4'.$_SESSION['rang'];

		                echo'<label>'.$data['pseudo'].'</label><br />';
		                echo'<select name="droits">';
		                for($i=0;$i<6;$i++)
		                {
		                if ($i == $data['rang'])
		                {
		                echo'<option value="'.$i.'"
		                 selected="selected">'.$rang[$i].'</option>';
						 										echo '<br />5'.$_SESSION['rang'];

		                }
		                else
		                {
												 				echo '<br />6'.$_SESSION['rang'];

		                echo'<option value="'.$i.'">
		                '.$rang[$i].'</option>';
		                }
		echo '<br />7'.$_SESSION['rang'];

		                }
		                echo'</select>
		                <input type="hidden" value="'.$pseudo.'" name="pseudo">               
		                <input type="submit" value="Envoyer"></form>';
		                }
		                else echo'Erreur : Ce membre n\'existe pas, cliquez
		                <a href="./admin.php?cat=membres&action=edit">ici</a> pour réessayez';
				}
						
	        break;
Merci d'avance de votre aide

nico-x1
Invité n'ayant pas de compte PHPfrance

08 avr. 2007, 22:49

A vu d'oeil , je ne voie pas l'erreur quand c'est comme sa ajoute des echo"$mavariable"; et tu ouvr eet la tu vois a quelle endroit elle perd sa valeur

Eléphant du PHP | 445 Messages

09 avr. 2007, 00:02

Hum, peut etre une piste du côté de register_global.

Est-ce que ce code fonctionne ?
case "droits":
            //Droits d'un membre (rang)
                
                echo'<h1>Edition des droits d un membre</h1>'; 

                if(!isset($_POST['membre']))
                {
                        echo'<h2>De quel membre voulez-vous modifier les droits ?<br />';
                        echo'<br /><form method="post"
                        action="./admin.php?cat=membres&action=droits">
                        <label for="membre">Inscrivez le pseudo : </label> <input type="text"
                        id="membre" name="membre"><input type="submit" name="Chercher"></form></h2>';

                }
                else
                {
        echo '1'.$_SESSION['rang'];
                        $pseudo = htmlspecialchars($_POST['membre'], ENT_QUOTES);

                        $requete_membre = mysql_query('SELECT pseudo,rang
                        FROM membres WHERE pseudo = "'.$pseudo.'"');
                echo '<br />2'.$_SESSION['rang'];

                        if ($data = mysql_fetch_assoc($requete_membre))
                        {    
        echo '<br />3'.$_SESSION['rang'];

                        echo'<form action="./adminok.php?cat=membres&action=droits"
                        method="post">';
                         $droits = array
                        (0 => "Visiteur",
                        1 => "Membre",
                        2 => "VIP",
                        3 => "Modérateur",
                        5 => "Admin"); //Ce tableau associe numéro de droit et nom
                                                         echo '<br />4'.$_SESSION['rang'];

                        echo'<label>'.$data['pseudo'].'</label><br />';
                        echo'<select name="droits">';
                        for($i=0;$i<6;$i++)
                        {
                        if ($i == $data['rang'])
                        {
                        echo'<option value="'.$i.'"
                         selected="selected">'.$droits[$i].'</option>';
                                                                 echo '<br />5'.$_SESSION['rang'];

                        }
                        else
                        {
                                                                 echo '<br />6'.$_SESSION['rang'];

                        echo'<option value="'.$i.'">
                        '.$droits[$i].'</option>';
                        }
        echo '<br />7'.$_SESSION['rang'];

                        }
                        echo'</select>
                        <input type="hidden" value="'.$pseudo.'" name="pseudo">               
                        <input type="submit" value="Envoyer"></form>';
                        }
                        else echo'Erreur : Ce membre n\'existe pas, cliquez
                        <a href="./admin.php?cat=membres&action=edit">ici</a> pour réessayez';
                }
                        
            break;
Je dis ca, mais j'attends l'avis d'un connaisseur ^^' (ou que le code fonctionne, ce qui confirmerais le bien fondé de cette théorie :P)
LLDC
Ulti

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

09 avr. 2007, 00:44

Hum, peut etre une piste du côté de register_global
Effectivement, si register_globals est à on dans le paramétrage de php, alors $rang et $_SESSION['rang'] pointent toutes deux sur la même valeur. En modifiant $rang tu affectes également la valeur de la session.

Tu peux donc utiliser un autre nom de variable comme le propose Ultim4T0m, voire mieux, si tu as la main sur le php.ini, désactiver le register_globals pour plus de sécurité :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 206 Messages

09 avr. 2007, 01:38

A vu d'oeil , je ne voie pas l'erreur quand c'est comme sa ajoute des echo"$mavariable"; et tu ouvr eet la tu vois a quelle endroit elle perd sa valeur
Merci d'au moins lire mon message en entier :P

Ryle et Ultim4T0m vous devez avoir raison, je testerais ça demain et je vous tiendrais informé. Merci de votre aide.

Eléphant du PHP | 206 Messages

09 avr. 2007, 20:37

Vous aviez raison, le problème venait de là.
Afin que je ne commette plus la même erreur,
En fait si une variable à le nom d'une variable SESSION ça foire ?

Car pour exemple, j'ai une variable SESSION['id'] transmise de page en page
Si dans une certaine page je crée une variable $id, Alors ma variable SESSION s'initialisera ?

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

09 avr. 2007, 23:23

Tout à fait, en un peu plus pire en fait : tant que ton register_globals est à "on", $_SESSION['variable'], $_POST['variable'], $_GET['variable'], $_COOKIE['variable'] seront liées à $variable.

Du coup si tu as un champ nommé "id" dans un formulaire que tu envois en get ou en post, tu va récupérer $_GET['id'] (ou $_POST) qui renseignera donc automatiquement $id (comme si tu faisais un extract()) et qui écrasera donc les valeurs de $_SESSION['id'] ou $_COOKIE['id'] s'ils existent.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 206 Messages

09 avr. 2007, 23:37

Vraiment contraignant ça, et donc par défaut c'est activé..
N'ayant pas acces au .ini à partir de maintenant et grâce à toi je ferais attention à ne pas mettre des noms de variable qui existe en SESSION

Bonne soirée

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

09 avr. 2007, 23:53

C'est activé par défaut jusqu'à la version 4.3 de php il me semble... A partir de cette version le paramètre a été désactivé par défaut pour raison de sécurité et pour éviter ce genre de désagrément. Il a carrément été supprimé de la version 6 :)

Mais dans la mesure ou de nombreux sites ont été codés en se basant sur cette configuration, beaucoup d'hébergeurs la laissent encore active.

Donc vaut mieux effectivement penser à utiliser des noms différents :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...