Aller au contenu

Sujets conseillés

Posté (modifié)

Bonjour :) ,

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:

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:

<?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! :)

PS1: je suis débutant, je ne connais pas grand chose :blush:

PS2: Si je mets le bon mot de passe, l'erreur se trouve sur les lignes 50 et 51.

Modifié par mathieu147
Posté

Bonjour,

Il ne faut aucun affichage avant d'envoyer le cookie.

Un simple retour à la ligne peut provoquer cette erreur.

Bon courage

Posté (modifié)

Salut :)

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

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 ;)

Modifié par MS-DOS_1991
Posté

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'. :)

Portekoi

Posté

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 :/

Posté

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:

<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:

<?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

Warning: Cannot modify header information - headers already sent

aux lignes avec setcookie() et Header().

Encore merci :)

Posté

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

Posté
Et c'était quoi ce carré au début de ton code wink.gif ??

Bien vu ;)

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:

Posté

Oui, c'est le petit carré qui coinçait, celui avant le <?php ;)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...