Variables de session et requêtes SQL

Fermé
XecK Messages postés 386 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 26 août 2016 - 27 févr. 2013 à 11:55
 Utilisateur anonyme - 5 mars 2013 à 08:40
Bonjour,
je crée actuellement un site web à base de PHP et SQL, mais je me heurte à un problème omniprésent : quand je fais une requête SQL dans ma base de donnée, la dernière ligne que j'utilise prend la place de mes variables de sessions...
Exemple : si j'ouvre une liste des membres :
$reponse = $bdd->query('SELECT * FROM Adherent ORDER BY Nom,Prenom');
while ($donnees = $reponse->fetch())
{
//Données à mettre dans le tableau
}

La liste fonctionne, mais mes variables de sessions sont modifiées, et prenne la valeur du dernier adhérent de la liste.
De la même manière, si je cherche un adhérent en particulier :
$reponse = $bdd->prepare('SELECT * FROM Adherent WHERE id = :id');
$reponse->execute(array('id' => $id));

Cela fonctionne mais les variables de session prennent pour valeur cet adhérent.

Pourtant, la seule page PHP où les variables de sessions sont modifiées est une page de connexion qui n'est pas appelée ici.

Ainsi, j'ai trouvé une solution, j'ai mis pour mes variables de sessions des noms différents de ceux des attributs de ma table SQL.

Mais je ne comprend pas la logique de ce problème, donc si quelqu'un pouvais m'expliquer, ce serais sympa.
Merci?

5 réponses

Utilisateur anonyme
27 févr. 2013 à 13:26
Bonjour

Je doute fort que des requêtes SQL aient le pouvoir de modifier des variables de session.
Peux-tu donner le code complet de la page qui a le problème (en cachant les mots de passe bien sûr)
0
XecK Messages postés 386 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 26 août 2016 54
28 févr. 2013 à 17:43
Ça va vraiment pas être digeste, mais soit, voilà une page qui bug, sachant qu'ici, les variables de sessions ont été renommées afin de faire disparaître le bug (st=statut, dr=droit, etc) :

membre.php :
<?php
session_start();
?>

<!DOCTYPE html>
<html lang="fr" >
<head>
<meta charset="UTF-8" />
<title>Membre</title>
<link rel="stylesheet" type="text/css" href="/style.css" />
<link rel="shortcut icon" href="/images/logo_petit.ico" />
</head>

<body>
<?php
require_once("/XXXXXXXXX/mise_en_page/menu.inc.php");
require_once("/XXXXXXXXX/mise_en_page/tete.inc.php");
require_once("membre.inc.php");
?>
</body>
</html>


membre.inc.php :
<div id="contenu">
<div>
<?php
try
{
$bdd = new PDO(XXXXXXXXXXXX);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$id=$_GET['id'];
$reponse = $bdd->prepare('SELECT * FROM Adherent WHERE id = :id');
$reponse->execute(array('id' => $id));
echo "<form method=\"post\" action=\"membre.action.php?id=$id\">\n<fieldset>\n\t<legend>Modifier le membre :</legend>\n";
while ($donnees = $reponse->fetch())
{
$nom=utf8_encode($donnees['nom']);
$prenom=utf8_encode($donnees['prenom']);
$statut=utf8_encode($donnees['statut']);
$mail=utf8_encode($donnees['mail']);
$mdp=utf8_encode($donnees['mdp']);
$telfixe=$donnees['telfixe'];
$telportable=$donnees['telportable'];
$droit=$donnees['droit'];
}
$reponse->closeCursor();
echo "\t<label for=\"nom\">Nom :</label>\n\t<input type=\"text\" name=\"no\" id=\"no\" value=\"$nom\" />\n\t<br />\n";
echo "\t<label for=\"prenom\">Prénom :</label>\n\t<input type=\"text\" name=\"pr\" id=\"pr\" value=\"$prenom\" />\n\t<br />\n";
echo "\t<label for=\"statut\">Statut :</label>\n\t<input type=\"text\" name=\"st\" id=\"st\" value=\"$statut\" />\n\t<br />\n";
echo "\t<label for=\"mail\">Mail :</label>\n\t<input type=\"text\" name=\"ma\" id=\"ma\" value=\"$mail\" />\n\t<br />\n";
echo "\t<label for=\"mdp\">Mot de passe :</label>\n\t<input type=\"text\" name=\"md\" id=\"md\" value=\"$mdp\" />\n\t<br />\n";
echo "\t<label for=\"telfixe\">Téléphone fixe :</label>\n\t<input type=\"text\" name=\"tf\" id=\"tf\" value=\"$telfixe\" />\n\t<br />\n";
echo "\t<label for=\"telportable\">Téléphone portable :</label>\n\t<input type=\"text\" name=\"tp\" id=\"tp\" value=\"$telportable\" />\n\t<br />\n";
if($droit==TRUE)
echo "\t<label for=\"droit\">Droits d'admin :</label>\n\tOui<INPUT type=radio name=\"dr\" value=\"TRUE\" checked=\"checked\">Non<INPUT type=radio name=\"dr\" value=\"FALSE\" >\n\t<br />\n";
else
echo "\t<label for=\"droit\">Droits d'admin :</label>\n\tOui<INPUT type=radio name=\"dr\" value=\"TRUE\">Non<INPUT type=radio name=\"dr\" value=\"FALSE\" checked=\"checked\" >\n\t<br />\n";
echo "</fieldset>\n<p>\n\t<input type=\"submit\" value=\"Enregistrer\" />\n</p>";
?>
</div>
</div>

menu.inc.php :
<div id="menu"> <!--Menu-->
<ul>
<li><a href="/index.php">Accueil</a></li>
<li><a href="/general/description.php">Qui sommes nous ?</a></li>
<li><a href="/general/acces.php">Accès</a></li>
<li><a href="/spectacle/spectacles.php">Spectacles</a></li>
<?php
if(isset($_SESSION['st']))
echo "<li><a href=\"/general/membres.php\">Membres</a></li>\n";
?>
</ul>
</div>
<?php
if(isset($_SESSION['dr']) && $_SESSION['dr']==TRUE)
{
echo "<div id=\"menu_admin\">\n\t<ul>\n\t\t<li><a href=\"/admin/spectacles.php\">Spectacles</a></li>\n\t\t<li><a href=\"/admin/membres.php\">Membres</a></li>\n\t</ul>\n</div>\n";
}
?>


tete.inc.php :
<div id="tete"> <!--Entête-->
<img src="/images/logo.png" alt="logo" />
<?php
if (isset($_SESSION['st']))
{
echo "<a href=\"/connexion/deconnexion.action.php\">Se deconnecter</a>";
}
else
{
echo "<a href=\"/connexion/connexion.php\">Se connecter</a>";
}
?>
<h1> XXXXXXXXXXX </h1>
<?php
if (isset($_SESSION['st']))
{
echo "<br /><p>Utilisateur : ",$_SESSION['pn']," ",$_SESSION['nm']," connecte en tant que ",$_SESSION['st'],"</p>";
}
?>
</div>
0
Utilisateur anonyme
28 févr. 2013 à 18:10
Ça aurait été plus clair si tu avais utilisé la balise code...
Pourquoi dis-tu que " les variables de session prennent pour valeur cet adhérent" ?
Qu'écris-tu, où cliques-tu, que se passe-t-il et quelle est la différence avec ce que tu attendais ?
Car si je vois des anomalies dans ton code, aucune n'a de rapport avec les variables de session.
0
XecK Messages postés 386 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 26 août 2016 54
1 mars 2013 à 10:56
Désolés pour la balise code, je connaissais pas -_-

Si je charge la page, elle va sélectionner l'adhérent correspondant à l'identifiant envoyé grâce à la méthode GET, et remplir la page avec son contenu, dès que je changerai de page, en actionnant un bouton du menu par exemple, mes variables $_SESSION['prenom'], $_SESSION['nom'], $_SESSION['statut'] et $_SESSION['droit'] vont prendre pour valeur le nom, le prénom, le statut et le droit de cet adhérent. En ayant enlevé plusieurs bouts du code, j'ai put constater que c'étais l'utilisation de $donnees et/ou while ($donnees = $reponse->fetch()) qui faisais ça, mais pourquoi ?
0
Utilisateur anonyme
1 mars 2013 à 11:22
Deux questions :
En relisant bien ton message, si j'ai bien compris, le code que tu as donné hier à 17:43 n'a pas le bug ? Il y a donc peu de chance que je le trouve, s'il n'y est pas !
Peux-tu donner le code avec bug ?
Peux-tu donner le code de la page qui appelle membre.php avec la méthode GET ?Ce ne serait pas plutôt là que tes variables de session sont altérées ?
0
XecK Messages postés 386 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 26 août 2016 54
5 mars 2013 à 07:02
Cette page n'est pas buggée, mais si on remplace $_SESSION['st'] par $_SESSION['statut'], $_SESSION['dr'] par $_SESSION['droit'], etc, elle l'est.
Ce n'est pas la méthode GET qui fais bug, dans une autre page je parcours toute ma table, les variables de sessions prennent la valeur de la dernière ligne consultée avec $donnees = $reponse->fetch(), c'est pourquoi je me demande si cette méthode n'utiliserai pas les variables de sessions (étrange, mais ça expliquerais mes problèmes)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
5 mars 2013 à 08:40
Non, fetch n'a absolument aucun rapport avec les variables de session, il n'y a aucun doute là-dessus.
Tes variables $_SESSION sont modifiées ailleurs que dans le code que tu nous montres, mais libre à toi de ne pas montrer ce que je t'ai demandé.
0