Page 1 sur 1

Perte de variables de session dans formulaire

Posté : 18 mars 2006, 17:18
par coxine
Re !
J'ai finalisé mon formulaire d'identification. Jusqu'à présent, je le testais en local...j'ai transféré quelques pages pour faire des essais en "live"....
Je m'aperçois que les sessions sont interrompues :-(
J'ai mis ce site chez Free.
J'ai bien un dossier 'sessions' à la racine de mon site.
Quelqu'un a déjà connu cela ?
En gros mon pb, est qu'une fois l'identification faite, et que je clique sur espace membres...j'arrive avec bonjour truc truc... :arrow: OK
Si je rafraichis la page, ou si je clique sur modifier mes coordonnées, je perds tout :cry:
Une idée ? (avant que je ne vous recopie-colle mon code)
(je poste ici, je ne sais pas si ce topic a sa place sur la discussion hébergement.... :?

Posté : 18 mars 2006, 18:09
par Laap
Si tu perd la session c'est que tu perds tes identifients de session quelque part. Tu es sur que tous les identifients sont bien transmis d'une page a l'autre ? Si tu utilises les cookies essaye d'utiliser sid=(ta variable de session).

alors je n'utilise pas de cookies

Posté : 18 mars 2006, 18:25
par coxine
Ca fonctionne en local...c'est normal que je perde les sessions sur un hébergeur ?
Je suis entrain de vérifier les conditions de SESSION.
A priori je les ai partout #-o
Sur l'index (où l'on doit s'identifier...)
<?php require_once('includes/connexion.php'); ?>
<?php session_start();
// .../... suite du code HTML
?>
<?php // tester la présence de la variable 'login' dans la session
if (isset($_SESSION['login']) && !empty($_SESSION['login'])) { 
  echo '<span class="Style9"><b>Bienvenue ' . $_SESSION['prenom'] .' '. $_SESSION['nom'].'</b></span>'; 
  // lecture de la variable de session 'login'
  echo '<br /><br />';
  echo '>> <a href="moncompte.php">Mon compte - mes cours</a><br /><br />';
  echo '>> <a href="includes/deconnect.php">Déconnexion</a>';
} else {

// ../.. on arrive au formulaire
?>
<form action="includes/valid.php" method="post" name="form" id="form" onSubmit="showsubmit(this)">
			<input type="hidden" name="redir" value="index.php">
		<div class="hidden" id="login">
	<table width="100%" border="0" cellpadding="2" cellspacing="0">
      <tr>
        <td width="116" height="19" valign="top" class="Style4"><div align="right">Login</div></td>
          <td width="77" valign="top"><input name="login" type="text" class="form" id="login" size="15"></td>
        </tr>
      <tr>
        <td height="19" valign="top" class="Style4"><div align="right">Mot de<br/> passe</div> </td>
          <td valign="top"><input name="pass2" type="password" class="form" id="pass2" value="" size="15"></td>
        </tr>
      <tr>
        <td height="13" colspan="2" valign="top"><div align="right"><a href="#" onClick="javascript:showsubmit(document.form);">Me connecter</a></div></td>
        </tr>
    </table></div></form>
<?php // affichage des erreurs
if(isset($_GET['erreur'])) { 
   echo '<p align=right><span class="Style12">Utilisateur inconnu,<br /> veuillez recommencer SVP</span></p>'; 
   echo '<p align=right>>> <a href="pass.php">Mot de passe perdu ?</a></p>';
} 
?>
  </table>
  <table width="249" border="0" cellpadding="0" cellspacing="0"> 
  </td>
    </tr>
    <tr>
      <td height="19" valign="top"><div align="right">>> <a href="inscription.php">Pas encore inscrit ?</a></div></td>
    </tr>
  </table>
  </div>
<?php 
} 
?> 
sur valid.php où l'on fait les vérifs
<?php 
session_start(); 
$dbhost="localhost"; 
$dblogin="root"; 
$dbpassword=""; 
$dbname="toto"; 

if (isset($_POST) && !empty($_POST['login']) &&!empty($_POST['pass2'])) { // premier test à faire, est-ce qu'un login est passé ? si non, pas la peine de faire d'autre controle, on passe direct à la fin  
  $login=htmlentities(addslashes($_POST['login']));
  $pass=htmlentities($_POST['pass2']); // on stock dans $login pour simplifier l'écritude et la lisibilité 
  mysql_connect($dbhost,$dblogin,$dbpassword); 
  mysql_selectdb($dbname); 
  $result=mysql_query("SELECT nom, prenom FROM membres WHERE login = '".mysql_real_escape_string($login)."' AND pass2 = '".mysql_real_escape_string($pass)."' "); // le test sur le mot de passe

if ($row=mysql_fetch_array($result)) { // s'il y a un résultat, c'est que le login (ou le couple login/pass) existe en base. L'utilisateur s'est donc correctement authentifié 
    $_SESSION['login'] = $login; // je mets ses infos en session 
    $_SESSION['nom'] = $row['nom'];
	$_SESSION['prenom'] = $row['prenom'];
	header('Location: ../index.php'); // et on le redirige directement vers la page sur laquelle il a le droit d'aller 
    exit(); // bon maintenant qu'il est parti, pas la peine d'aller plus loin  
  }     
} 

// si l'authentification n'a pas fonctionné (soit pace que $_POST['login'] est vide, soit parce qu'il n'y a pas eu de résultat en base) on arrive ici et on redirige l'utilisateur sur la page d'index avec la variable erreur égale à 1 pour faire afficher le message d'erreur 
header("Location:../index.php?erreur=1"); 
?> 
La page moncompte.php
<?php require_once('includes/connexion.php'); ?>
<? //début de page.....
// initialisation
session_start() ;
if (isset($_POST['login'])) // on verifie que la variable existe
{
$login = htmlentities($_POST['login']); //on recupere les données du formulaire
$_SESSION['login'] = $login;
}
?>
La page modifMembre.php
<?php require_once('includes/connexion.php'); ?>
<?
// initialisation
session_start() ;
//init des variables
if(!isset($_POST['nom'])) $nom=""; else $nom=$_POST['nom']; // penser à la protection des données !!!!!!!! htmlentitites...Etc
if(!isset($_POST['prenom'])) $prenom=""; else $prenom=$_POST['prenom'];
if(!isset($_POST['login'])) $login=""; else $login=$_POST['login'];
if(!isset($_POST['pass'])) $pass=""; else $pass=$_POST['pass'];
if(!isset($_POST['pass2'])) $pass2=""; else $pass2=$_POST['pass2'];
if(!isset($_POST['adresse'])) $adresse=""; else $adresse=$_POST['adresse']; /// etc...............
comme je débute...j'imagine qu'il y a une ENORME *ù*$^$ù!! mais je ne parviens pas à voir quoi.
Il est clair, qu'en serveur Free, je perds les infos de session lorsque je rafraichis la page moncompte, et ou que je souhaite modifier mes infos de compte...donc quand je suis redirigée vers modifMembres.php
:-k donc je me demandais si ce n'est pas plutôt parce que c'est Free que ça débloque....style, paramétrages serveur pas identiques ou autres

Posté : 18 mars 2006, 18:49
par Laap
Donne un nom a ta session, sur tous tes scripts bien sur.

Code : Tout sélectionner

session_start(); session_name('coxine');
Et reviens nous voir. :wink:

Posté : 18 mars 2006, 19:36
par Lorenzo
Laap :
par defaut les sessions utilisent ce nom : "PHPSESSID"
donc ce n'est pas une obligation !



coxine :
regarde dans le rep session qui est censé stocker les infos sur free qu'il y a bien un fichier qui est crée avec les données de la session courante.

rappel -> http://www.php.net/manual/fr/ref.session.php

cherche aussi la difference avec ta config local des sessions (phpinfo())

voici ce que free propose comme reglages par defaut :

Code : Tout sélectionner

session Session Support enabled Registered save handlers files user Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 100 100 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path /var/www/sdc/2/e/NOM-DU-COMPTE/sessions /sessions session.serialize_handler php php session.use_cookies On On session.use_only_cookies Off Off session.use_trans_sid Off Off

alors chez Free et en local

Posté : 18 mars 2006, 21:43
par coxine
free :

Code : Tout sélectionner

session Session Support enabled Registered save handlers files user Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 100 100 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path /var/www/free.fr/9/5/toto/sessions /sessions session.serialize_handler php php session.use_cookies On On session.use_only_cookies Off Off session.use_trans_sid Off Off
et en local

Code : Tout sélectionner

session Session Support enabled Registered save handlers files user Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 Off Off session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 1000 1000 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path D:/programmes/EasyPHP1-8\tmp\ D:/programmes/EasyPHP1-8\tmp\ session.serialize_handler php php session.use_cookies On On session.use_only_cookies Off Off session.use_trans_sid Off Off
C'est à peu près pareil non ? :?:
Chez free, j'ai bien un fichier dans le répertoire 'sessions'
il est vide quand je l'ouvre avec le bloc notes :? :(

et ça sert à

Posté : 18 mars 2006, 21:48
par coxine
Donne un nom a ta session, sur tous tes scripts bien sur.

Code : Tout sélectionner

session_start(); session_name('coxine');
Et reviens nous voir. :wink:
Ca sert à quoi de la nommer ?
Je veux bien essayer !

Re: et ça sert à

Posté : 18 mars 2006, 21:55
par coxine
Ca sert à quoi de la nommer ?
Je veux bien essayer !
Je viens d'essayer, ça ne change rien, si je change de page et que je reviens sur l'index, mes données d'identifications sont perdues !
](*,) 8-[

ça vient de mon code

Posté : 19 mars 2006, 14:38
par coxine
:cry:
C'est fou que ça fonctionne en local mais pas en distant...
Est-ce qu'un bonne âme pourrait m'indiquer où j'ai fait l'erreur dans mes pages membres et modif ?
moncompte.php
<?php require_once('includes/connexion.php'); ?><?php
// initialisation
session_start() ;
if (isset($_POST['login'])) // on verifie que la variable existe
{
$login = htmlentities($_POST['login']); //on recupere les données du formulaire
$_SESSION['login'] = $login;
}

if (isset($_SESSION['login'])) {
  $login = (get_magic_quotes_gpc()) ? $_SESSION['login'] : addslashes($_SESSION['login']);
}
mysql_select_db($database, $connexion);
$query_Membres = sprintf("SELECT * FROM membres WHERE login = '$login'");
$Membres = mysql_query($query_Membres, $connexion) or die(mysql_error());
$row_Membres = mysql_fetch_assoc($Membres);
$totalRows_Membres = mysql_num_rows($Membres);

if ($row=mysql_fetch_array($Membres)) {
$nom=$_SESSION['nom']; ///
$prenom=$_SESSION['prenom'];
$login=$_SESSION['login'];
$pass=$_SESSION['pass'];
$pass2=$_SESSION['pass2'];
$adresse=$_SESSION['adresse'];
$code_postal=$_SESSION['code_postal'];
$ville=$_SESSION['ville'];
$email=$_SESSION['email'];
$tel=$_SESSION['tel'];
$naissance=$_SESSION['naissance'];
}
//----------------------------
?>
Plus bas le formulaire

Code : Tout sélectionner

<form id="form" name="form" method="post" action="modifMembre.php" > ../... <input name="modif" type="hidden" id="modif" value="1" /> <input type="submit" name="Submit" value="Modifier" /> </form>
Et la page ModifMembre.php
<?php
// initialisation
session_start() ;
require_once('includes/connexion.php');
if (isset($_SESSION['login'])) {
  $login = (get_magic_quotes_gpc()) ? $_SESSION['login'] : addslashes($_SESSION['login']);
}
mysql_select_db($database, $connexion);
$query_Membres = sprintf("SELECT * FROM membres WHERE login = '$login'");
$Membres = mysql_query($query_Membres, $connexion) or die(mysql_error());
$row_Membres = mysql_fetch_assoc($Membres);
$totalRows_Membres = mysql_num_rows($Membres);

if ($ModifMembre=="1")
{
//---Mise à jour dans la base
mysql_select_db($database, $connexion);
$updateMembres = "UPDATE membres SET nom='$nom', prenom='$prenom', login='$login', pass='$pass', pass2='$pass2', adresse='$adresse', code_postal='$code_postal', ville='$ville', email='$email', tel='$tel', naissance='$naissance'";
$updateMembres .= "WHERE login='$login'";
mysql_query($updateMembres, $connexion) or die(mysql_error()); 
header("Location: moncompte.php");
}
?>
Plus bas le formulaire

Code : Tout sélectionner

<form id="form" name="form" method="post" action="modifMembre.php"> <input name="nom" type="text" class="form" onblur="if(!this.value)alert('vous n\'avez pas saisi \nvotre nom');" value="<?php echo $row_Membres['nom']; ?>" /> .../... <input type="submit" name="Submit" value="Valider" /> <input name="ModifMembre" type="hidden" id="ModifMembre" value="1" /> </form>
Merci de m'aider à me corriger !!!
:-)

J'ai fait qques modifs

Posté : 19 mars 2006, 16:30
par coxine
Mais c'est une histoire de dingue ! :lol:
Je récupère maintenant tout, SAUF le nom et le prénom !!!!!!!
Le form commence par nom, prénom PUIS login...ça vient de là ?
Je vous avoue que je cherche dans tous les sens...mais là, je suis paumée et perplexe....pourquoi je peux modifier tout le reste et pas les noms et prénoms ?
Code corrigé de la page "modifMembre.php
<?php
// initialisation
session_start() ;
require_once('includes/connexion.php');
if (isset($_SESSION['login'])) {
  $login = (get_magic_quotes_gpc()) ? $_SESSION['login'] : addslashes($_SESSION['login']);
}
mysql_select_db($database_oberte, $oberte);
$query_Membres = sprintf("SELECT * FROM membres WHERE login = '$login'");
$Membres = mysql_query($query_Membres, $connexion) or die(mysql_error());
$row_Membres = mysql_fetch_assoc($Membres);
$totalRows_Membres = mysql_num_rows($Membres);

if ($row=mysql_fetch_array($Membres)) {
$nom=$_SESSION['nom']; ///
$prenom=$_SESSION['prenom'];
$login=$_SESSION['login'];
$pass=$_SESSION['pass'];
$pass2=$_SESSION['pass2'];
$adresse=$_SESSION['adresse'];
$code_postal=$_SESSION['code_postal'];
$ville=$_SESSION['ville'];
$email=$_SESSION['email'];
$tel=$_SESSION['tel'];
$naissance=$_SESSION['naissance'];
}
if ($ModifMembre=="1")
{
//---Mise à jour dans la base
mysql_select_db($database, $connexion);
$updateMembres = "UPDATE membres SET login='$login', nom='$nom', prenom='$prenom', pass='$pass', pass2='$pass2', adresse='$adresse', code_postal='$code_postal', ville='$ville', email='$email', tel='$tel', naissance='$naissance'";
$updateMembres .= "WHERE login='$login'";
mysql_query($updateMembres, $connexion) or die(mysql_error()); 
header("Location: moncompte.php");
}
?>
zarbi !

en supprimant

Posté : 19 mars 2006, 17:08
par coxine
En supprimant les variables de session....
J'obtiens le même résultat, et je peux modifier la date de naissance par exemple ou l'adresse etc..
Le principe était le suivant:
Je me connecte sur l'index du site....une variable de session est alors ouverte.
Je clique sur "mon compte", j'ai toutes les informations liées à mon compte. Le sélect est fait sur la page de la variable de session $login que je traine de page en page....
Si je clique sur modifier, je suis renvoyée sur la page ModifMembre.php
1. s'il y a une session '$login', je fais un sélect dans la base membres où le 'login'=$login
2. si je clique sur modifier :
if ($ModifMembre=="1")
3. je demande un update de la base.
Cf code corrigé :
<?php
// initialisation
session_start() ;
require_once('includes/connexion.php');
if (isset($_SESSION['login'])) {
  $login = (get_magic_quotes_gpc()) ? $_SESSION['login'] : addslashes($_SESSION['login']);
 }
mysql_select_db($database, $connexion);
$query_Membres = sprintf("SELECT * FROM membres WHERE login = '$login'");
$Membres = mysql_query($query_Membres, $connexion) or die(mysql_error());
$row_Membres = mysql_fetch_assoc($Membres);
$totalRows_Membres = mysql_num_rows($Membres);

if ($ModifMembre=="1")
{
//---Mise à jour dans la base
mysql_select_db($database, $connexion);
$updateMembres = "UPDATE membres SET login='$login', nom='$nom', prenom='$prenom', pass='$pass', pass2='$pass2', adresse='$adresse', code_postal='$code_postal', ville='$ville', email='$email', tel='$tel', naissance='$naissance'";
$updateMembres .= "WHERE login='$login'";
mysql_query($updateMembres, $connexion) or die(mysql_error()); 
header("Location: moncompte.php");
}
?>
Je me suis demandée si ça venait du $ModifMembre=="1", mais non, puisque j'arrive à modifier les champs naissance, adresse etc.....AUTRES que le NOM et le PRENOM :-k ](*,)

J'ai modifié le code

Posté : 19 mars 2006, 18:24
par coxine
car je crois avoir compris pourquoi (enfin pas sur tout, car je ne m'expliquerais jamais comment je pouvais changer la date de naissance et l'adresse et le tel...mais pas les nom/prenom :roll: )
<?php
// initialisation
session_start() ;
require_once('includes/connexion.php');
if (isset($_SESSION['login'])) {
  $login = (get_magic_quotes_gpc()) ? $_SESSION['login'] : addslashes($_SESSION['login']);
 }
mysql_select_db($database, $connexion);
$query_Membres = sprintf("SELECT * FROM membres WHERE login = '$login'");
$Membres = mysql_query($query_Membres, $connexion) or die(mysql_error());
$row_Membres = mysql_fetch_assoc($Membres);
$totalRows_Membres = mysql_num_rows($Membres);

if ($ModifMembre=="1")
{
//---Mise à jour dans la base
mysql_select_db($database, $connexion);
$updateMembres = "UPDATE membres SET login='".$_POST['login']."', nom='".$_POST['nom']."', prenom='".$_POST['prenom']."', pass='".$_POST['pass']."', pass2='".$_POST['pass2']."', adresse='".$_POST['adresse']."', code_postal='".$_POST['code_postal']."', ville='".$_POST['ville']."', email='".$_POST['email']."', tel='".$_POST['tel']."', naissance='".$_POST['naissance']."'";
$updateMembres .= "WHERE login='$login'";
mysql_query($updateMembres, $connexion) or die(mysql_error()); 
header("Location: moncompte.php");
}
?>
GROSSE bourde !
Comme je fasais un header("Location....)Je sortais de la session, c'est bien ça ?
Donc j'ai remplacé le UPDATE par les variables du post.

Un petite aide SVP, je n'arrive pas à protéger ces variables.....
Comment indiquer :
$nom=trim(htmlentities(addslashes($_POST['nom'])));
quand on est face à
login='".$_POST['login']."'
je me mélange les pinceaux dans les quotes, car j'ai des parse errors.... :? :D