Version complète: sur le forum Webmaster Hub : [Résolu]Problème de cookies
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
mathieu147
Bonjour smile.gif ,

J'ai un problème de cookies. Je voudrais demander une authentification sur une page. Les login/mot de passe sont contenus dans une base mySQL:
base : base
table : membres
champs de la table : login et mdp.

Seulement, j'ai une erreur:
CITATION
Warning: Cannot modify header information - headers already sent by (output started at /var/www/tests/protection.php:13) in /var/www/tests/protection.php on line 57

Warning: Cannot modify header information - headers already sent by (output started at /var/www/tests/protection.php:13) in /var/www/tests/protection.php on line 58

et je ne vois pas du tout d'où elle vient...

Voici le code:

CODE
<?php
//Réception des infos entrées dans le forumaire
$motdepasseentre = @$_POST["pass"];
$login = @$_POST["login"];

echo $motdepasseentre;
echo "<br />";
echo $login;

//Connection
$mysql_id = mysql_connect('hote', 'login', 'motdepasse');
mysql_select_db('base', $mysql_id);

//Recherche du mot de passe correspondant au login entré
//Construction de la requète
$requete = "SELECT mdp FROM membres WHERE login='" . $login . "'";

echo "<br /> Requete : ";
echo $requete;
//Soumission de la requète à la base, et stockage du résultat dans la variable $result
$result = mysql_query($requete,$mysql_id);
//Mise en forme du résultat par PHP. La variable $membre contiendra le mot de passe de l'enregistrement trouvé.
$membre = mysql_fetch_object($result);
//Vidage de la variable pour désencombrer la mémoire
mysql_free_result($result);
//On vient d'aller chercher le mot de passe correspondant au login, il faut le comparer à celui entré dans le formulaire.
$bonmotdepasse = $membre->mdp;

echo "<br /> Mot de passe de la base de données : ";
echo $bonmotdepasse;
echo "<br /> Mot de passe entré dans le formulaire : ";
echo $motdepasseentre;

//Si les mots de passe correspondent, on met "ok" dans le cookie
if($bonmotdepasse==$motdepasseentre)
{
echo "<br /> Les mots de passe correspondent";
setcookie("passe","ok"); //LIGNE 50
Header("Location: ".$_SERVER["PHP_SELF"]); //LIGNE 51
}
//Sinon, on laisse le cookie vide
elseif($bonmotdepasse!=$motdepasseentre)
{
echo "<br /> Les mots de passe ne correspondent pas";
setcookie("passe",""); //LIGNE 57
Header("Location: ".$_SERVER["PHP_SELF"]); //LIGNE 58
}
//On lit le cookie
$isOK = (@$_COOKIE["passe"]!="");
//S'il n'est pas vide, on affiche le menu
if($isOK)
{
?>
<center>
<A href="?pass=no">Déconnecter</A> -
<A href="page1.php">Page 1</A> -
<A href="page2.php">Page 2</A> -
<A href="page3.php">Page 3</A>
</center><hr>
<?php
}
//S'il est vide, on affiche le formulaire
else
{
?>
<form method="post">
<table><tr>
<td><input type="password" name="pass"></td>
<td><input type="text" name="login"></td>
<td><input type="Submit" value="Entrer"></td>
</tr></table>
</form>
<?php
}
?>



Merci beaucoup d'avance! smile.gif


PS1: je suis débutant, je ne connais pas grand chose blush.gif
PS2: Si je mets le bon mot de passe, l'erreur se trouve sur les lignes 50 et 51.
KaRaK
Bonjour,

Il ne faut aucun affichage avant d'envoyer le cookie.
Un simple retour à la ligne peut provoquer cette erreur.

Bon courage
MS-DOS_1991
Salut smile.gif

Il me semble que tu affiche du texte avant le header de ta condition if rolleyes.gif

CITATION
if($bonmotdepasse==$motdepasseentre)
{
echo "<br /> Les mots de passe correspondent";
setcookie("passe","ok");                          //LIGNE 50
Header("Location: ".$_SERVER["PHP_SELF"]);        //LIGNE 51
}
//Sinon, on laisse le cookie vide
elseif($bonmotdepasse!=$motdepasseentre)
{
echo "<br /> Les mots de passe ne correspondent pas";
setcookie("passe","");                            //LIGNE 57
Header("Location: ".$_SERVER["PHP_SELF"]);        //LIGNE 58
}


La fonction header() doit etre utilisée AVANT TOUT AFFICHAGE de texte, c'est donc sans doute ceci qui génère une erreur à l'exécution wink.gif
Portekoi
Bonjour,

Les erreurs de header sont dû à l'affichage d'un ou plusieurs caractères avant la redirection php.

Tu dois donc enlever tous les 'echo'. smile.gif


Portekoi
mathieu147
Rebonjour,

Merci pour vos réponses!

Malheureusement, j'ai enlevé tous les echo, tous les affichages de texte, et ça remet exactement la même erreur :/
NorSeb
Rerebonjour,

Tu peux nous remettre ton code corrigé stp ?
mathieu147
Voilà, j'ai carrément changé, pour que ce soit plus clair... En fait j'ai refait pareil, mais en deux pages. Sur la première, un bête formulaire en html:
CODE
<form action="auth.php" method="post">
 <p>Login:</p><br />
 <input type="text" name="login">
 <p>Mot de passe:</p><br />
 <input type="password" name="pass">
 <br />
 <input type="Submit" value="Ok">
</form>

et la deuxième page (auth.php) contient ceci:
CODE
<?php
//Récupération du login et de mot de passe entrés
$login = $_POST['login'];
$pass  = $_POST['pass'];

//Connection à la base de données
$mysql_id = mysql_connect('hote', 'login', 'mot_de_passe');
mysql_select_db('base', $mysql_id);
//Construction de la requète: On va chercher le mot de passe correspondant au membre dont on a le login.
$requete = "SELECT mdp FROM membres WHERE login='" . $login . "'";
//Soumission de la requète à la base, et stockage du résultat dans la variable $result
$result = mysql_query($requete,$mysql_id);
//Mise en forme du résultat par PHP. La variable $membre contiendra le mot de passe de l'enregistrement trouvé.
$membre = mysql_fetch_object($result);
//La variable $bonmotdepasse contient le mot de passe venant de la base.
$bonmotdepasse = $membre->mdp;
//Vidage de la variable pour désencombrer la mémoire
mysql_free_result($result);

//Comparaison des mots de passe
if($bonmotdepasse==$motdepasseentre)
{
 setcookie("passe","ok");
 Header("Location: ".$_SERVER["PHP_SELF"]);
}
elseif($bonmotdepasse!=$motdepasseentre)
{
 setcookie("passe");
 Header("Location: ".$_SERVER["PHP_SELF"]);
}
?>

Tout ce code php est AVANT tout le reste, avant même le doctype.

J'ai toujours ce
CITATION
Warning: Cannot modify header information - headers already sent

aux lignes avec setcookie() et Header().

Encore merci smile.gif
mathieu147
Maintenant ça marche...

Je ne sais pas comment ça se fait, j'ai fait un nouveau fichier, j'ai copier/collé petit à petit pour voir à partir de quand ça commençait à foirer, et puis je suis arrivé au bout et ça a fonctionné.

La vérité est ailleurs, moi je vous le dis...


En tout cas, merci de votre soutient! :-D
Compte supprimé
Et c'était quoi ce carré au début de ton code wink.gif ??
MS-DOS_1991
CITATION
Et c'était quoi ce carré au début de ton code wink.gif ??

Bien vu wink.gif

Il me semble aussi que la fonction setcookie() renvoie le même type d'information que header(). Par conséquent, l'usage de l'une interdit l'autre ^_^

P.S: Dites-moi si je me trompe unsure.gif
Compte supprimé
CITATION(MS-DOS_1991 @ mercredi 19 octobre 2005, 12h27)
P.S: Dites-moi si je me trompe unsure.gif

Tu te trompe.
Quand tu appelle setcookie() le serveur s'en souvient mais n'envoie rien, il le fait soit à l'appel du header(), ou au premier affichage wink.gif
MS-DOS_1991
CITATION(jeroen @ Mercredi 19 Octobre 2005 @ 13h06)
Tu te trompe.
Quand tu appelle setcookie() le serveur s'en souvient mais n'envoie rien, il le fait soit à l'appel du header(), ou au premier affichage wink.gif

Au temps (autant) pour moi alors hypocrite.gif laugh.gif
Dan
Oui, c'est le petit carré qui coinçait, celui avant le <?php wink.gif
mathieu147
Moi je ne vois pas de petit carré avant <?php :-/

Enfin, merci quand-même :-)
MS-DOS_1991
CITATION(Matthieu)
Moi je ne vois pas de petit carré


Pourtant il y en a un:
CODE
<?php
mathieu147
Et moi je n'en vois pas?!

C'est un problème à approfondir, ça...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.