[php+mysql+free]pb ouverture session

Résolu
bonjour à vous tous .
Alors en fait j'ai un problème qui ne se posait pas lorsque je travaillais en local et qui se pose maintenant que j'ai tout mis sur mon ftp .

J'ai une page de login qui permet d'avoir accès à mon site .
Pour cela il suffit d'entrer un login et mot de passe correct .

Avant de vous montrer le code et mon problème, voila le principe de fonctionnement :

index.php -> login.php -> preambule.php(include "session_verif.php")

- index.php est la page ou l'on entre login et mot de passe
- login.php est le fichier qui connecte a la base de données et qui vérifie les infos rentrée
si log & mdp ok : alors on ouvre preambule.php
si log | mdp non valide : alors on reste sur index.php
- session_verif.php sert a vérifier pour chaque page qu'une session est ouverte

alors voila mon problème :

- quand sur index.php je rentre un login ou mot de passe incorrect, voila le résultat :
Login ou mot de passe incorrect !
- quand je rentre un login et mot de passe corrects, voila le résultat :
Vous devez vous authentifier !

voila les parties de code :

index.php :
Compte : <input type="text" name="login" size="20">
					Mot de passe : <input type="password" name="password" size="20"><p /><br />
					<?php
					if(isset($_GET["message"]))
					{
						if($_GET["message"] == "erreur") echo "<font color=red>Erreur de login ou mot de passe<p /></font>";
						else if($_GET["message"] == "no_session") echo "<font color=red>Vous devez vous authentifier !<br /></font>";
					}
					?>
					<input type="submit" name="submit" value="Connexion">


login.php :
<?php
// les variables ont bien été récupérées on se connecte donc à la bdd pour vérification du login et du mot de passe
mysql_connect("sql.free.fr", "prenom.nom", "motdepasse"); 
mysql_select_db("prenom_nom");
// si le formulaire d'authentification a été validé
	if ($_POST["valid_form"]) 
	{
		function protect($txt)
			{
				$suppr	= array('[',']','=','1','$','&icirc;','&ocirc;','&agrave;','&ccedil;','&ccedil;','&ecirc;','&egrave;','&eacute;','é', 'è', 'ê', 'ë', 'â', 'à', 'ä', chr(156), chr(220), 'u', 'ù', 'ü', 'ö', 'ô', 'ç', 'ï', 'î', chr(63), '!', '@', '€',chr(128), '&amp;', '&', '%', '#', '°', ',', ';', ':', '/', '(', ')', '\'', '"', '*', '+', ' ', '---', '--',chr(133),'<','>',chr(145),chr(146), '\\', chr(253), '²');
				$repl	= array('','','-','','','i','o','a','c','e','e','e','e', 'e', 'e', 'e', 'a', 'a', 'a', 'a', 'u', 'u', 'u', 'u', 'o', 'o', 'c', 'i', 'i', '', '', 'a', 'eur','eur', 'et', 'et', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-','-','','','','-','-', '2', '2');
				$txt	= str_replace($suppr, $repl, $txt);
				$txt	= preg_replace("#\A-*(.*?)-*\z#si","\\1",$txt);
				return strtolower($txt);
		}	
		$l_valid = protect($_POST["login"]);
		$p_valid = md5(trim($_POST["password"]));
		// on regarde dans la base si le login existe
		$res = mysql_query ("SELECT * FROM `t_login` WHERE `user_login` = '".$l_valid."'");
		// si un enregistrement corerspond a ce login
		if (@mysql_num_rows ($res) > 0) 
			{
				// on extrait ttes les infos de cet enregistrement
				$row = mysql_fetch_array ($res);
				// si le mot de passe correspond aussi
				if ($row["user_password"] == $p_valid) 
					{
						// on crée la session
						session_name('qcm');
						session_start();
						$_SESSION["id"] = $row["user_id"];
						$_SESSION["login"] = $row["user_login"];
						$_SESSION["abracadabra"] = "lapin_rose";
						// authentification reussie => accès à la page cachée
						header ("Location: preambule.php");	
					// sinon message de mot de passe faux
				} 
				else $err_mess = "erreur";
			// sinon message de login faux
		}
		else $err_mess = "erreur";
	}
// si l'authentification n'a pas reussi on retourne a la page de login avec message d'erreur
if ($err_mess != "") header ("Location: index.php?message=".$err_mess);
?>


session_verif.php : (que l'inclus dans toutes les pages situées apres l'authentification)
<?php
// les variables ont bien été récupérées on se connecte donc à la bdd pour vérification du login et du mot de passe
mysql_connect("sql.free.fr", "prenom.nom", "motdepasse"); 
mysql_select_db("prenom_nom");
// réouverture de la session
session_name('qcm');
session_start();
// on vérifie que la session est bien ouverte
if(isset($_SESSION["login"]) && isset($_SESSION["id"]) && isset($_SESSION["abracadabra"])) 
	{
		$id_valid = $_SESSION["id"];
		$l_valid = $_SESSION["login"];
		$res = mysql_query(" SELECT * FROM `t_login` WHERE `user_id` = '".$id_valid."' AND `user_login` = '".$l_valid."' ");
		if(@mysql_num_rows($res) == 0)
			{
				session_destroy();
				header("Location: index.php?message=no_session");
		}
		// si la session est différente des paramètres rentrés
		if($_SESSION["abracadabra"] != "lapin_rose")
			{
				session_destroy();
				header ("Location: index.php?message=no_session");
		}
}
// sinon on renvoi aussi à la page d'accueil
else header ("Location: index.php?message=no_session");
?>


Voila je vois pas ou est le problème donc si vous avez des suggestions ... merci de me les faire savoir :p
Configuration: Windows XP
Firefox 2.0.0.4

15 réponses

  1. je ne connais pas session_name('qcm');
    mais cela ne devrait il pas etre apres le démarage de la session?
    1. as tu pensé à mettre un dossier "sessions" vide a la racine de ton ftp?
      1. oui justement j'ai pensé a ca dessuite mais le dossier est bien créé
        1. ouai c'est le genre de truc que je zapp et apres je cherche dans mon code pdt des heures ^^

          Dans session_verif.php

          met ton session_start(); en tout premier....

          c'est peut etre ça!
          1. Contributeur
            Salut

            Essaye en mettant tes session_start() juste après le tag php.

            Tchuss
            1. <?php
              // réouverture de la session
              session_name('qcm');
              session_start();
              // les variables ont bien été récupérées on se connecte donc à la bdd pour vérification du login et du mot de passe
              mysql_connect("sql.free.fr", "prenom.nom", "motdepasse"); 
              mysql_select_db("prenom_nom");
              
              // on vérifie que la session est bien ouverte
              if(isset($_SESSION["login"]) && isset($_SESSION["id"]) && isset($_SESSION["abracadabra"])) 
              	{...
                         ...
              


              Voila la modif effectuée .... et le résultat est le même :s
              1. ben dans login.php, si login et mot de passe sont ok, alors :

                // on crée la session
                				session_name('qcm');
                				session_start();
                				$_SESSION["id"] = $row["user_id"];
                				$_SESSION["login"] = $row["user_login"];
                				$_SESSION["abracadabra"] = "lapin_rose";
                		// authentification reussie => accès à la page cachée
                				header ("Location: preambule.php");	


                puis dans session_verif.php, voila ce que j'ai mis :

                <?php
                // réouverture de la session
                session_name('qcm');
                session_start();
                ...
                ...
                1. <html>
                  	<head>
                  		<title>Ouverture de session</title>
                  		<link rel="stylesheet" type="text/css" href="../css/css.css">
                  		<script type="text/javascript">
                  		function confirmation(frm)
                  			{
                  				var user_login = document.log.login.value;
                  				var user_password = document.log.password.value;
                  				var mess = "";
                  				if (user_login == "") mess += "ERREUR : Renseignez correctement le login. \n";
                  				if (user_password == "") mess += "ERREUR : Renseignez correctement le mot de passe. \n";
                  				if (mess != "") 
                  					{
                  						alert (mess);
                  						return false;
                  				}	
                  				else
                  					{
                  						return true;	
                  				}
                  		}
                  		
                  		</script>
                  	</head>
                  	<body><br />
                  	<div id="preambule">
                  		<form action="login.php" method="post" name="log" class="text" onsubmit="return confirmation(this)">
                  		<input type="hidden" name="valid_form" value="true" />
                  		<center><table border="0" cellspacing="0" width="60%" height="40%" class="cadre_sable_fonce">
                  			<tr>
                  				<td colspan="3"><br /><center><img src="../images/logo.jpg"></center><br /></td>
                  				
                  			</tr>
                  			<tr>
                  				<td class="text_centre"><br />
                  					
                  					Compte : <input type="text" name="login" size="20">
                  					Mot de passe : <input type="password" name="password" size="20"><p /><br />
                  					<?php
                  					if(isset($_GET["message"]))
                  					{
                  						if($_GET["message"] == "erreur") echo "<font color=red>Erreur de login ou mot de passe<p /></font>";
                  						else if($_GET["message"] == "no_session") echo "<font color=red>Vous devez vous authentifier !<br /></font>";
                  					}
                  					?>
                  					<input type="submit" name="submit" value="Connexion">
                  					<br />
                  				</td>
                  			</tr>
                  		</table></center>
                  	</div>
                  	</body>
                  </html>
                  1. Contributeur
                    Re

                    Bon, j'ai pas assez de recul pour voir ou ca merdouille.

                    Essaye de mettre des tests dans ton parcours. Les 2 cas ou tu as un retour en "no_session" sont :
                    if(@mysql_num_rows($res) == 0)
                    {
                    session_destroy();
                    header("Location: index.php?message=no_session");
                    }
                    // si la session est différente des paramètres rentrés
                    if($_SESSION["abracadabra"] != "lapin_rose")
                    {
                    session_destroy();
                    header ("Location: index.php?message=no_session");

                    Essaye de tester comme ca :
                    if(@mysql_num_rows($res) == 0)
                    {
                    echo 'bloqué cas 1';
                    session_destroy();
                    header("Location: index.php?message=no_session");
                    }
                    // si la session est différente des paramètres rentrés
                    if($_SESSION["abracadabra"] != "lapin_rose")
                    {
                    echo 'bloqué cas 2';
                    session_destroy();
                    header ("Location: index.php?message=no_session");
                    }

                    Tu saura comme ca ou ca bloque.

                    Tchusss
                    1. mouais j'avais déja essayé ca avant de balancer un post mais le probleme c'est qu'il n'affiche rien puisque ce fichier ne contient que du code .

                      je viens de le tester a nouveau et ca ne marche pas puisque session_verif n'affiche rien mais ne sert qu'a rediriger ...
                      1. tiens regarde meme ce que j'ai testé et qui ne marche pas :

                        if(isset($_SESSION["login"]) && isset($_SESSION["id"]) && isset($_SESSION["abracadabra"])) 
                        	{
                        		$id_valid = $_SESSION["id"];
                        		$l_valid = $_SESSION["login"];
                        		$res = mysql_query(" SELECT * FROM `t_login` WHERE `user_id` = '".$id_valid."' AND `user_login` = '".$l_valid."' ");
                        		if(@mysql_num_rows($res) == 0)
                        			{
                        				echo "cas1";
                        				session_destroy();
                        				header("Location: indexe.php?message=no_session");
                        		}
                        		// si la session est différente des paramètres rentrés
                        		if($_SESSION["abracadabra"] != "lapin_rose")
                        			{
                        				echo "cas2";
                        				session_destroy();
                        				header ("Location: indexee.php?message=no_session");
                        		}
                        }
                        // sinon on renvoi aussi à la page d'accueil
                        else header ("Location: indexeee.php?message=no_session");


                        les 3 headers qui renvoient a la page d'acceuil avec un message, j'ai mis des noms bidon ( indexe.php, indexee.php et indexeee.php) pour voir dans quelle boucle le programme s'engage, mais ca change rien, voila l'url qui s'affiche :

                        http://guillaume.priou.free.fr/taff/greta/qcm/index.php?message=no_session

                        Ce truc va me rendre chèvre ^_^
                        1. ne vous embétez pas, j'ai trouvé la solution .
                          c'est le fichier login.php placé a la racine de mon ftp qui etait exécuté et non celui placé dans le repertoire ou se trouve index.php .

                          Apparament c'était ca :)

                          Merci quand meme a vous