php4 -> php5 probleme sessions

php4 -> php5 probleme sessions - PHP - Programmation

Marsh Posté le 03-07-2006 à 16:38:29    

Bonjour,
 
Petit historique avant la question,
j'ai fait un site en php/mysql avec formulaire, mot de passe et tout le toutim...
Tout marche niquel... En fait tout marchait niquel quand j'etais sous easyphp (apache 1.3 et php4)
 
Voulant pousser le vice plus loin, j'ai installé apache 2, php5, mysql 4.1.2(?) et bien sur phpmyadmin.
Il semble que tout fonctionne correctement, mon phpinfo() s'affiche niquel. J'ai installé ma base de données avec
phpmyadmin.
Sur mon site, il y a donc un formulaire ou on rentre le login et le Mot de Passe, qui renvoie vers membres_identification.php et c'est la mon probleme. Depuis mes changements de config (php5?)
lorsque je valide j'arrive sur une page blanche SANS AUCUNE ERREUR et c'est terminé!
Je me suis dit que code était bon en php4 mais pas en en php5 peut etre.
 Voici mon code d'identification (a supposer que ce soit cela l'explication!):
 
<?php  
 
include ("connexion.php" );
 
//passage des variables en variables courtes
$login = $_POST['login'];
$pass = $_POST['pass'];
 
// On selectionne quand le champ login correspond au login entré
// et le champ passe au pass entré.
$sql = "SELECT * FROM liste_membres WHERE login='$login' and pass=sha1('$pass')";
 
// On execute la requête de selection
$resultat = mysql_query($sql);
 
// On compte le nombre de ligne des resultats
// 1 : si valide ou 0 si aucun login ne correspond
$exist = mysql_numrows($resultat);
 
// Si la variable $exist = 0 --> login inexistant ou mauvais mot de passe
if(!$exist) {
    // On affiche ce message d'erreur
    echo "<h1>Veuillez vérifier vos données</h1>";
     
    // On inclut le formulaire d'identification
    include("membres_form_identification.php" );
}
 
// Sinon, si le login et pass sont valides
else {
 
 // On ouvre la session
 session_start();
 
 // On enregistre la variable login qu'on fera passer sur ttes les pages
 session_register("login" );
 
 //on incremente la variable de session avec la valeur entrée par l'utilisateur dans le formulaire
 $_SESSION['login']=$login;
 
 //On incrémente la table historique des connexions
 
 $sql = "SELECT * FROM historique_connectes WHERE login='$login' ";
 
 // On execute la requête de selection
 $resultat = mysql_query($sql);
 
 // On compte le nombre de ligne des resultats
 // 1 : si valide ou 0 si aucun login ne correspond
 $exist = mysql_numrows($resultat);
 
 // On affiche
 ?>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>ACCUEIL</title>
       <link href="styles/membres.css" rel="stylesheet" type="text/css">
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   </head>
   <body>
   
<div id="en_tete">
   
</div>
 
<div id="menu">
<?php
// Puis on inclue le menu
include("membres_menu.php" );
?>
</div>
 
<div id="corps">
ICI mon site
 
</div>
 
<div id="pied_de_page">
</div>
 
 
 <?// Si la variable $exist = 0 --> le login se connecte pour la premiere fois
 if(!$exist)
  {    // On incrémente la table
   
  echo "<h1>Ceci est votre premiere connexion!</h1>";
  $sql = "INSERT INTO historique_connectes VALUES('$login',now(),curtime(),'1')";
  mysql_query($sql);
  }
 else
  {
  $sql="select * from historique_connectes where login='$login'";
  $resultat=mysql_query($sql);
  $historique = mysql_fetch_array($resultat);
  $nombre=++ $historique['nombre']; //On incrémente le nombre de connexion  de 1 à chaque connexion
  $jour=$historique['date']; //Variables courtes
  $heure=$historique['heure'];
  echo "<div class='centre'><p>Votre derniere connexion était le $jour à $heure. <br />";
  echo "Ceci est votre $nombre ème connexion à mon site ouaib.</p></div>";
   
  $sql="UPDATE historique_connectes SET date=now(),heure=curtime(), nombre='$nombre' WHERE login='$login'";
  mysql_query($sql);
  }
 
}//fermeture du else ou le login et pass sont valides
?>

Reply

Marsh Posté le 03-07-2006 à 16:38:29   

Reply

Marsh Posté le 03-07-2006 à 16:55:34    

http://uk.php.net/manual/fr/functi [...] gister.php
 

Citation :


 Si vous voulez que votre script fonctionne indépendamment de la configuration de la directive register_globals, vous devez utiliser la variable $_SESSION. Tous les éléments de $_SESSION sont automatiquement enregistrés. Si votre script utilise session_register(), il ne fonctionnera pas dans les environnements où register_globals  est désactivée.
 
    register_globals : note importante : Depuis PHP 4.2.0, la valeur par défaut de la directive de configuration PHP register_globals vaut off. La communauté PHP vous recommande de ne pas dépendre de cette directive, mais de trouver d'autres moyens pour accéder aux données, tels que les superglobals.


 
Je suis sur que c'est ca


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 03-07-2006 à 17:16:48    


 
Je suis sur que c'est ca
 
Super merci, je vais essayer ca ce soir.
 
Quand on débute, on ne se doute pas que tous les tutos ne sont pas bons à prendre(ou peut etre tout simplement trop vieux!).
 
A+
 
 
 

Reply

Marsh Posté le 04-07-2006 à 09:29:29    

Ton problème vient de session_start qui n'a rien à faire à cet endroit : il faut placer cette instruction au début de ton code, à la première ligne. Dès qu'un utilisateur se connecte sur ton site, un identifiant de session lui est attribué. Au login, tu vérifies comme tu l'as fait qu'il est inscrit dans la base de données, et après tu lui attribues une variable de session type $_SESSION['login']=1 ou ce que tu veux.

Reply

Marsh Posté le 04-07-2006 à 09:40:25    

gebruik a écrit :

Ton problème vient de session_start qui n'a rien à faire à cet endroit : il faut placer cette instruction au début de ton code, à la première ligne. Dès qu'un utilisateur se connecte sur ton site, un identifiant de session lui est attribué. Au login, tu vérifies comme tu l'as fait qu'il est inscrit dans la base de données, et après tu lui attribues une variable de session type $_SESSION['login']=1 ou ce que tu veux.


 
Absolument pas :heink: , le session_start() tu le places où tu en as besoin , dans son cas sa place est appropriée. C 'est pas parcequ'il faut poser le session_start() avant que le headers soit envoyé qu'il faut commancer chaque fichier avec  :sarcastic:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-07-2006 à 11:12:52    

Et tu définis comment une session ? Quel est l'intérêt de la déclarer en plein milieu d'une page ? Comment veux-tu gérer des superglobales de cette façon ?


Message édité par gebruik le 04-07-2006 à 11:22:18
Reply

Marsh Posté le 04-07-2006 à 11:15:26    

Si tu lisais la doc avant de poser des questions tu saurais que  
 

Citation :


Note:  As of PHP 4.3.3, calling session_start() while the session has already been started will result in an error of level E_NOTICE. Also, the second session start will simply be ignored.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-07-2006 à 11:24:59    

Merci, je la connais la doc...
 
Relis ce que tu cites... et explique moi comment tu gères des superglobales de cette façon, comment du gères des variables de session et pourquoi dans tous les supports, tuto, livre ou je ne sais quoi on t'invite à déclarer ta session en début de code ?
C'est la définition du mot session qui pose un problème ?

Reply

Marsh Posté le 04-07-2006 à 11:27:58    

Merci pour toutes vos reponses
 
la solution était la suivante:
en passant de php4(easyphp) à php5
plusieurs choses changent, mais etant débutant je ne pensais  
pas faire appel à des fonctions avancées....
 
mais une chose primordiale change: le short tag
 
dans certain de mes scripts dont mon connexion.php
il y avait des <? au lieu de <?php
et le code est tout simplement ignoré  :o  
 
Merci encore pour vos pistes de reflexion

Reply

Marsh Posté le 04-07-2006 à 11:28:36    

C'est quand même, reconnais-le, beaucoup plus simple de la déclarer au début et d'y coller des variables que tu peux modifier, le cas échéant, pour authentifier un utilisateur, stocker un tableau, etc.
 
Cas concret : tu fais un site de vente en ligne, comment tu gères ton panier ? En écrivant sur le disque côté serveur ? Bonjour la sécurité...

Reply

Marsh Posté le 04-07-2006 à 11:28:36   

Reply

Marsh Posté le 04-07-2006 à 11:30:59    

Pourquoi les tuto conseillent de le mettre à la premiere ligne :
Parcequ'ils se basent sur la supposition que le lecteur est trop stupide pour chercher une meilleure place où le mettre, ce qui se confirme souvent vu le nombre de personnes qui viennent ici en criant a cause du Headers already sent.
Pour la gestion des superglobales, je te signale que c'est pas parceque tu as pas fait un session_start() que tu ne peux pas utiliser $_POST, $_GET . Donc dans son cas specifique, où il n'as pas besoin de session_start() jusqu'a la moitier du script, c'est stupide de le mettre au debut (surtout qu'il y aura plein de gens qui n'on auront pas besoin tout cours).
Pour finir, je n'ai pas dit qu'il faut pas l'utiliser, j'ai dit qu'il faut l'utiliser au bon moment ... Enfin probablement il vaut mieux que tu continues à le mettre à la 1ere ligne ...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-07-2006 à 11:42:35    

Ouais, c'est ça, je continue à le mettre en première ligne...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed