Sessions: problème sessions deux erreurs qui se contredisent

Nouveau WRInaute
Bonjour à tous,

Mon problème ne semble pas exister dans le forum. On parle beaucoup de sessions mais pas de ce que j'ai besoin exactement.

Ma config:

easyphp 1.8


Voici le code de mes 2 pages qui posent problème:

index.php:

Code:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<link href="cssindex.css" rel="stylesheet" type="text/css">
</head>
<body>

<div id="header">
<?php
include "menu.php";
?>
</div>

<div id="corps">
<?php

  // On définit le tableau contenant les pages autorisées
  // ----------------------------------------------------
  $pageOK = array('page1' => 'page1.php',
                  'page2' => 'page2.php',
				  'pageprotegee' => 'pageprotegee.php',
				  'deconnexion' => 'deconnexion.php',
				  'accueil' => 'accueil.php');
  // On teste que le paramètre d'url existe et qu'il est bien autorisé
  // -----------------------------------------------------------------
  
  if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) //si l'url existe dans le tableau
  {
    include($pageOK[$_GET['page']]);   // Nous appelons cette url
  } 
  else //sinon
  {
    include('accueil.php');   // Page par défaut quant elle n'existe pas dans le tableau
  }

?>

</div>


</body>
</html>
[/b]

verif.php:

Code:
<?php
session_start();

//ici on vérifie que le mot de passe et le login entrés existent dans la base de données mysql
$log=false;

$login=$_POST['login'];
$mot_de_passe=$_POST['mot_de_passe'];

$db=mysql_connect('localhost','root','') or die("erreur de connexion");

mysql_select_db ('immobay',$db) or die ("erreur de connexion");

$login=addslashes($login);

$reqlog = mysql_query("SELECT * FROM users WHERE login='$login'")or die(mysql_error());//on cherche dans la base de données le login = au login entré
$log=mysql_num_rows($reqlog);//on compte le nombre de ligne qui contiennent le login en question (dans notre cas c'est 1 ligne)

$mot_de_passe=addslashes($mot_de_passe);

$reqpass = mysql_query("SELECT * FROM users WHERE mot_de_passe='$mot_de_passe'")or die(mysql_error());//on cherche dans la base le mot de passe = au mot de passe entré
$pass=mysql_num_rows($reqpass);//on compte le nombre de ligne qui contiennent le login en question (dans notre cas c'est 1 ligne)

   
if (($log==1)&&($pass==1))//cas ou le login et la mot de passe sont bons ==> on déclare les variables de sessions

{
$_SESSION['login'] = $_POST['login'];
$_SESSION['mot_de_passe'] = $_POST['mot_de_passe'];

$req2=mysql_query("SELECT id,nom,prenom from users WHERE login='$login' ");//ici on met certaines informations en variables de session afin de pouvoir s'en servir.
$essai=mysql_fetch_array($req2);
$_SESSION['prenom']=$essai['prenom'];
$_SESSION['nom']=$essai['nom'];
$_SESSION['id']=$essai['id']; 

$log=true;//variable mise à TRUE car le user s'est bien identifié

include 'index.php';
}
elseif (($log==1)&&($pass==0))
{

echo"mot de passe incorrect";
session_destroy();
include "connexion.php";

}
elseif (($log==0)&&($pass==1))
{

echo"login incorrect";
session_destroy();
include "connexion.php";
}
elseif (($log==0)&&($pass==0))
{
echo"login et mot de passe incorrects";
include "connexion.php";
}

mysql_close($db);

?>
[/code]


Je ne suis pas u pro en php mais je pense comprendre le principe.

J'ai les erreurs banales de sessions mais que je n'arrive pas à résoudre en supprimant le session_start de l'une ou l'autre des 2 pages ou en tentant des if pour voir si le user est déjà loggé !!

Voici l'erreur que j'obtiens avec les 2 pages que je vous ai donné:
Notice: A session had already been started - ignoring session_start() in c:\program files\easyphp1-8\www\immobay4\index.php on line 2

Je comprend bien que c'est parceque j'ai déjà une session d'ouverte mais si je supprimme le session_start de la page index, je n'arrive pas à accéder à ma page protégée dont le code est le suivant :

Code:
<?php

if (($logOK=true)&& (isset($_SESSION['login']))&&(isset($_GET['page'])))

{
echo $_SESSION['login'];


?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</head>
<body>


<?php echo ?>"Bienvenue sur la page protégée";

<?php
}
else
{
include "connexion.php";
}




?>
</body>
</html>

Si quelqu'un peut m'aider, c'est super sympa.

D'avance merci.

Jhon :D :D
 
WRInaute accro
Il suffit de mettre un ob_start() pour bufferiser les sorties et comme cela, il n'y aura que les header qui seront envoyés.
En général, ça suffit pour résoudre ce type de problème :wink:
 
Nouveau WRInaute
Yep,

Tout d'abord merci d'avoir répondu.

1) Mais cette fonction ob_start, c'est une manière de contourner le problème ou est-ce une vraie solution propre et répandue ?

2) Moi j'ai vu qu'il fallait utiliser session_start plutôt que session_register -->http://fr.php.net/session_register
C'est pour une raison de sécurité. D'ailleurs ils disent bien que maintenant ils ont totalement supprimer la possibilité de mettre register global à ON.


:D
 
WRInaute accro
hxjonathan a dit:
1) Mais cette fonction ob_start, c'est une manière de contourner le problème ou est-ce une vraie solution propre et répandue ?
C'est une solution propre, qui permet d'envoyer tous les en-têtes (header, cookie, etc...) en premier. Car aucun code ne doit être envoyé avant eux.
Le code peut déjà avoir été généré pour l'envoi à la page, mais il reste dans un tampon.
Cela peut aussi, mais je ne l'ai jamais utilisé de cette manière, permettre de créer le code de la page dans un buffer et de modifier ce contenu avant l'envoi définitif vers le navigateur.
 
Discussions similaires
Haut