Page 1 sur 1

Probleme avec les sessions

Posté : 04 mars 2008, 10:18
par PetarouxRay
bonjour,

J'ai donc un petit soucis de gestion des sessions.
On accède a différente page d'un site après s'être authentifié. Si l'authentification est correcte, on ouvre une session.

En supposant que ce code suffit a sécurisé l'ensemble, il est inséré a chaque début de page :

Code : Tout sélectionner

<?php // On prolonge la session session_start(); // On teste si la variable de session existe et contient une valeur if(empty($_SESSION['login'])) { // Si inexistante ou nulle, on redirige vers le formulaire de login header("Location: ../authentification.htm"); exit; } ?>

On ouvre donc bien une session ici.

Ensuite dans ma page, qui est une page de gestion de profil, je peux changer mon email de contact.
Quand je veux le changer donc, après appui sur le bouton confirmation, l'action du formulaire est une page php. Outre le fait d'acceder a la base de donner et de vérifier la validité de l'adresse, voici le code :

Code : Tout sélectionner

// L'adresse mail a changée ? if($ChMail != $result['mail']) { $sql = "UPDATE membres SET mail='".$ChMail."' WHERE login='".$ChLogin."'"; $res = mysql_query($sql) or die ('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $txtMail = "L'adresse mail a été changé"; $_SESSION["adrMail"] = $ChMail; include("Profil.php");
On voit ici donc que je rajoute une entrée a la globale $_SESSION. (qui me permettra de ré afficher la nouvelle adresse mail quand on rafraichira la page. Comme ca :

Code : Tout sélectionner

<input name="ChMail" type="text" id="ChMail" value=" <?php if(!empty($_SESSION["adrMail"])) {echo "";}else{echo $_SESSION["adrMail"];} ?> " size="30" />

En espérant être clair.
Le problème étant, que la mise a jour ne se fait pas.
Par contre, si je rajoute un session_start(); avant de rajouter l'entrée $_SESSION["adrMail"] = $ChMail; ca marche. Mais un message d'erreur apparait me disant qu'une session est deja ouverte.

A l'aide :) merci

Posté : 04 mars 2008, 10:27
par d0m
Dans une page PHP, il faut mettre session_start avant de toucher aux variable de sessions.
Par contre il n'en faut pas 2 dans la même page.

Il faut donc bien ajouter session_start avant
$_SESSION["adrMail"] = $ChMail;
Regarde bien la ligne qui pose problème dans le message d'erreur, tu n'aurais pas un appel à session_start dans le fichier inclus plus tard ?
include("Profil.php");

Posté : 04 mars 2008, 10:28
par Korg
Bonjour,

Quel est le message d'erreur exact ?

Korg

Posté : 04 mars 2008, 10:42
par PetarouxRay
bonjour,

j'ai deux page php :
"profil.php" qui contient le html (le formulaire) ainsi que le code de sécurisation de la page, donc un session_start(); .

et "validProfil.php" qui contient le code d'insertion dans la base de la nouvelle adresse (donc sans session_start).


pour Korg : voila le mesage d'erreur si je rajoute session_start dans "validProfil.php" :
Notice: A session had already been started - ignoring session_start() in c:\program files\easyphp1-7\www\internetlocal\accueil\votreespace\portail\site_portail\Profil.php on line 3

Posté : 04 mars 2008, 10:55
par d0m
Voilà c'est exactement ce que je disais, l'erreur se produit dans ton fichier inclus profil.php.
C'est donc un session_start en trop.
Il va donc falloir ordonner ton code différemment. Pour n'avoir besoin que de faire un seul session_start.

- Soit tu enlèves session_start de profil.php et tu le rajoutes dans tous les fichiers qui l'inclus.

- soit tu déplaces la ligne
$_SESSION["adrMail"] = $ChMail;
après l'inclusion, si c'est possible.

Posté : 04 mars 2008, 11:23
par PetarouxRay
Bon...

alors voila, j'ai enlevé comme tu as dis le "$_SESSION["adrMail"] = $ChMail;"
pour le mettre dans la page "profil.php";
Je suis donc obligé de me connecter a la base au début de ma page pour aller chercher l'info.

Code : Tout sélectionner

<?php // On prolonge la session session_start(); // On teste si la variable de session existe et contient une valeur if(empty($_SESSION['login'])) { // Si inexistante ou nulle, on redirige vers le formulaire de login header("Location: ../authentification.htm"); exit; }else { mysql_connect("localhost", "root", ""); // Connexion à MySQL mysql_select_db("portailinternet "); // Sélection de la base de données //création de la requéte SQL $sql = "SELECT * FROM membres WHERE login = '".$_SESSION['login']."'"; //exécution de la requéte SQL $requete = @mysql_query($sql) or die ('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); //on récupére le résultat $result = mysql_fetch_array($requete); $_SESSION["adrMail"] = $result['mail'] ; mysql_close(); } ?>
Ça marche nickel.
C'est pas "dangereux" quand même d'ouvrir les connections à la base ici ?

Posté : 04 mars 2008, 11:34
par d0m
Peux être que ton système d'inclusion est pas si bien choisi.

Si ta page profil.php est appelé par plusieurs pages :
- tu mets session_start au début de chacune de ces pages.
- tu fais tes opérations propres à la page
- tu inclus ton fichier profil.php

Je ne sais pas si c'est mieux mais j'ai pour habitude de faire l'inverse :
Avoir un fichier php contenant le code html et avec au début un include de fichiers contenant les traitements PHP.

Posté : 04 mars 2008, 13:44
par PetarouxRay
très bien.

en tous cas merci dOm et Korg pour la solution et vos réactions rapides :)