Problème page login avec session

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème page login avec session

par Ryle » 09 mars 2006, 18:02

En plus clair, ça pourrait donner ceci : ton code est bon, il y a juste un soucis au niveau des données html (donc en hors des balises <? ?>) qui fait que le session_start() ne peut pas fonctionner correctement :)

Typiquement, comme je le disais plus haut, c'est généralement un retour à la ligne, un tag html ou un echo qui en sont la cause. Dans ton cas, c'est le retour charriot entre la ligne 1 et la ligne 2 (qui est donc en dehors des balises <? ?> et que php interprète comme ta première sortie html.

La solution est de regrouper tes lignes dans une seule balise php pour éviter ce retour charriot :
<?php 
require_once('Connections/connexion.php'); // le retour à la ligne à lieu entre les balises <? ?> et ne sera donc pas considéré comme du html

mysql_select_db($database_connexion, $connexion); 
$query_

par lafieau » 09 mars 2006, 17:37

Sorry ! Mais j'ai pas très bien compris ! :oops:
<?php require_once('Connections/connexion.php'); ?>
<?php
mysql_select_db($database_connexion, $connexion);
$query_Recordset1 = "SELECT * FROM tb_user";
$Recordset1 = mysql_query($query_Recordset1, $connexion) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);

 if(isset($_POST))  // on ne rentre la dedans que si le formulaire est soumis 
 	{
    	if (!empty($_POST['login']) && !empty($_POST['pass']))
			{
         		extract($_POST);
     
        mysql_select_db($database_connexion, $connexion); 
        $query_Recordset1 = "SELECT pwd FROM tb_user WHERE login='".$login."'"; 
        $Recordset1 = mysql_query($query_Recordset1, $connexion) or die(mysql_error()); 
        // $totalRows_Recordset1 = mysql_num_rows($Recordset1); // ce n'est utile que si tu as besoin de connaitre le nombre d'enregistrement retournés 
        // en théorie, ici ce sera 0 ou 1, autant tester directement s'il y a un résultat : 
        if($row_Recordset1 = mysql_fetch_assoc($Recordset1))  // est ce qu'une ligne correpondait à ce login ? si oui, elle sera dans $row_Recordset1 
			{
            if($row_Recordset1['pwd'] != $pass) { // p'tit changement ici, c'est pas data['pwd'] 
                $message = '<p>Mauvais login / password. Merci de recommencer</p>'; 
            } 
            else
			{ 
                session_start(); 
                $_SESSION['login'] = $login; 
                header("Laccueiladministration.php"); // va chercher bonheur  
            }      
        } 
        else { // éventuellement si le login n'est pas trouvé : 
            $message = '<p>Mauvais login / password. Merci de recommencer</p>'; 
        } 
         
        mysql_free_result($Recordset1); // on libère les ressources qui ne nous serve plus (cela dit, il le fait tout seul à la fin du script) 

    } 
    else { // pas de login ou de mot de passe : 
        $message = '<p>Vous avez oublié de remplir un champ.</p>'; 
    } 
} 

?>

<html>
<head>
<title>Document sans titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php if(isSet($message)) echo '<p align="center">'.$message.'</p>'; ?>
<form name="form1" method="post" action="accueiladministration.php">
  <table align="center" border="0">
    <tr> 
      <td>Login :</td>
      <td><input type="text" name="login" maxlength="250"></td>
    </tr>
    <tr> 
      <td>Password</td>
      <td><input type="password"name="pass" maxlength="10"></td>
    </tr>
    <tr> 
      <td colspan="2" align="center"><input name="submit" type="submit" value="log in"></td>
    </tr>
  </table>
</form>
</body>
</html>
<?php
mysql_free_result($Recordset1);
?>

Faut vraiment que j'essaye de bien organiser mon code ! J'arrive pas tjrs à m'y retrouver !!! (là ça serait une bonne habitude à prendre !)

par Ryle » 09 mars 2006, 17:20

Comment ça "tout ça pour rien" ? il est très bien ton code, faut juste vérfiier qu'il n'écrit rien sur la page avant le session_start() (genre des retour à la ligne avant le <?php...)

mais il ne devrait pas poser de problème sinon.. :)

re poste le éventuellement qu'on regarde ensemble ce qui peut être à la source du warning :)

par lafieau » 09 mars 2006, 16:41

Donc tout ça pour rien, faut que je trouve autre chose !

Et dire que je pensais que c'était simple de créer une page login !!! :?

Mais bon, faut pas désespérer y a sûrement d'autres solutions !

Encore merci pour tout !

par Ryle » 09 mars 2006, 16:26

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\program files\easyphp1-8\www\site\accueiladministration.php:3) in c:\program files\easyphp1-8\www\site\accueiladministration.php on line 4
Le session_start() tout comme les header() ne doivent pas être précédés d'une sortie html (pas d'echo, pas de tag html, pas d'espace, pas de saut de ligne etc.

Tout ceci n'est donc pas bon :
<html>
<body>
<?
sessiont_start();
...
?>
[color=white].[/color]
<?
sessiont_start();
...
?>
<?
echo "Hello world";
sessiont_start();
...
?>

par lafieau » 09 mars 2006, 16:11

Ryle !

Ok pour la modif, il faut l'avouer, je ne suis pas très douée !
Mais j'ai encore des p'tits soucis !!!
La page login s'affiche, mais avant l'espace login j'ai :
Vous avez oublié de remplir un champ
Mais surtout quand je remplis l'espace login et que je valide ça me renvoie ces messages :
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\program files\easyphp1-8\www\site\accueiladministration.php:3) in c:\program files\easyphp1-8\www\site\accueiladministration.php on line 4

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\site\accueiladministration.php:3) in c:\program files\easyphp1-8\www\site\accueiladministration.php on line 4
Vous n'êtes pas autoris´ à acceder à cette zone
Notice: A session had already been started - ignoring session_start() in c:\program files\easyphp1-8\www\site\login2.php on line 24

Warning: Cannot modify header information - headers already sent by (output started at c:\program files\easyphp1-8\www\site\accueiladministration.php:3) in c:\program files\easyphp1-8\www\site\login2.php on line 26

Login :
Password


Warning: mysql_free_result(): 7 is not a valid MySQL result resource in c:\program files\easyphp1-8\www\site\login2.php on line 69

par Ryle » 09 mars 2006, 15:35

Un jour peut être que j'arriverais à poster un morceau de code sans rien oublier dedans... un jour... peut être... ;)

Il y a effectivement une erreur ligne 3, il manque la parenthèse fermante du if... d'ailleurs en fait non, elle ne manque pas, je l'ai oublié exprès, juste pour voir si tu suivais ;p

par lafieau » 09 mars 2006, 09:44

Salut !

J'ai bien effectué les modifs, j'ai toujours un message d'erreur :
Parse error: parse error in c:\program files\easyphp1-8\www\site\login2.php on line 3

par Ryle » 08 mars 2006, 18:46

pour le message d'erreur qui s'affiche quand même, c'est logique (ouais, je suis désolé, j'écris d'abord, je réfléchis après... enfin des fois ;)), c'est parce que quand tu arrives sur la page la première fois il n'y a pas de $_POST, du coup il file dans le else :)

Le mysql_free_result, ben du coup comme je t'ai fait mettre le reste dans le if (et que je l'avais pas vu lui ;)) il va falloir l'y remonter aussi (vu que s'il n'y a pas de requête il sert à rien :)) Le problème de la ligne 56 devrait y être lié également... ton code devrait donc avoir cette tête là :
<?php 

if(isset($_POST) { // on ne rentre la dedans que si le formulaire est soumis

	if (!empty($_POST['login']) && !empty($_POST['pass'])) { 
	 	extract($_POST); 
	
		mysql_select_db($database_connexion, $connexion); 
		$query_Recordset1 = "SELECT pwd FROM tb_user WHERE login='".$login."'"; 
		$Recordset1 = mysql_query($query_Recordset1, $connexion) or die(mysql_error()); 
		// $totalRows_Recordset1 = mysql_num_rows($Recordset1); // ce n'est utile que si tu as besoin de connaitre le nombre d'enregistrement retournés
		// en théorie, ici ce sera 0 ou 1, autant tester directement s'il y a un résultat :
		if($row_Recordset1 = mysql_fetch_assoc($Recordset1)) { // est ce qu'une ligne correpondait à ce login ? si oui, elle sera dans $row_Recordset1

			if($row_Recordset1['pwd'] != $pass) { // p'tit changement ici, c'est pas data['pwd']
				$message = '<p>Mauvais login / password. Merci de recommencer</p>';
			} 
			else { 
				session_start(); 
				$_SESSION['login'] = $login; 
				header("Location:accueiladministration.php"); // va chercher bonheur :)
			}     
		}
		else { // éventuellement si le login n'est pas trouvé :
			$message = '<p>Mauvais login / password. Merci de recommencer</p>'; 
		}
		
		mysql_free_result($Recordset1); // on libère les ressources qui ne nous serve plus (cela dit, il le fait tout seul à la fin du script)

	} 
	else { // pas de login ou de mot de passe :
		$message = '<p>Vous avez oublié de remplir un champ.</p>'; 
	}
} 
?> 

...
<body> 
<?php if(isSet($message)) echo '<p align="center"><font color="red">'.$message.'</font></p>'; ?> 
...

par lafieau » 08 mars 2006, 17:44

La page s'affiche mais avec comme texte en haut de la page : vous avez oublié de remplir un champ

J'ai encore un message d'erreur en bas de page :
Notice: Undefined variable: Recordset1 in c:\program files\easyphp1-8\www\site\login2.php on line 56

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\site\login2.php on line 56

par Ryle » 08 mars 2006, 17:01

c'est tout à fait possible... personnellement, ce que je ferais au lieu des includes, c'est stocker le message dans une variable qui serait affichée dans le formulaire quand elle est renseignée
<?
// au lieu de 
    echo '<p>Mauvais login / password. Merci de recommencer</p>'; 
    include('login2.php'); // On inclut le formulaire d'identification 
    exit; 
// tu aurais juste :
    $message = '<p>Mauvais login / password. Merci de recommencer</p>';

// idem pour 
   echo '<p>Vous avez oublié de remplir un champ.</p>'; 
   include('login2.php'); // On inclut le formulaire d'identification 
   exit; 
// par 
    $message = '<p>Vous avez oublié de remplir un champ.</p>';
?>

// et ajouter juste avant ton formulaire :
<body>
<?php if(isSet($message)) echo '<p align="center"><font color="red">'.$message.'</font></p>'; ?> // a décorer comme bon te semble :)
<form ...>

par lafieau » 08 mars 2006, 16:50

Donc j'ai bien fait la modif, et j'ai comme tu me l'as prédit Ryle toujours le même problème que tout à l'heure ! Comment faut-il que je procède afin de pouvoir afficher dans la même page (si toutefois c'est possible).

par Ryle » 08 mars 2006, 16:34

Les 5 premières lignes php, place les dans le if, en effet, il est inutile d'essayer de comparer le login ou de ramener des informations de la base si l'utilisateur n'est pas en train d'essayer de se loguer :)
<?php 
// déplacé dans le if

if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) { 
  extract($_POST); 

mysql_select_db($database_connexion, $connexion); 
$query_Recordset1 = "SELECT pwd FROM tb_user WHERE login='$login'";
$Recordset1 = mysql_query($query_Recordset1, $connexion) or die(mysql_error()); 
$row_Recordset1 = mysql_fetch_assoc($Recordset1); 
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
... 
Pour la partie
echo 'Vous etes bien logué'; 
<a href="accueiladministration.php">accès</a> 
Tu peux même remplacer ces deux lignes par :
header("Location:accueiladministration.php");
Comme ça, si l'authentification a fonctionné, l'utilisateur est automatiquement redirigé vers la page accueiladministration.php et n'a pas besoin de cliquer sur le lien accès :)

Edit : autre petit soucis au niveau du else :
else { 
  echo '<p>Vous avez oublié de remplir un champ.</p>'; 
   include('login2.php'); // On inclut le formulaire d'identification 
   exit; 
} 
Si le champ n'est pas renseigné, il inclut la page login2.php qui à priori est la page en cours... du coup il va se rappeller lui même de manière récursive.. d'où peut être l'erreur d'accès et de réactualisation que tu as eu..

par lafieau » 08 mars 2006, 16:26

Salut Mario !

J'ai bien fait la modif, mais du coup le problème se complique !
J'ai une page qui s'affiche un bref instant avec ce message d'erreur :
Notice : Undefined variable : login in C/programmefiles.../login2.php on line 4
Vous avez oublié de remplir un champ

et puis affiche impossible d'afficher la page

par mario » 08 mars 2006, 16:16

cette ligne <a href="accueiladministration.php">accès</a>
renvoi une erreur car elle est interprétée par PHP

remplace la par:
echo '<a href="accueiladministration.php">accès</a>';