mathieu147 Posté 18 Octobre 2005 Posté 18 Octobre 2005 (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émoiremysql_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 cookieif($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 videelseif($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 menuif($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 formulaireelse{?> <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 PS2: Si je mets le bon mot de passe, l'erreur se trouve sur les lignes 50 et 51. Modifié 19 Octobre 2005 par mathieu147
KaRaK Posté 18 Octobre 2005 Posté 18 Octobre 2005 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 Posté 18 Octobre 2005 Posté 18 Octobre 2005 (modifié) Salut Il me semble que tu affiche du texte avant le header de ta condition if 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é 18 Octobre 2005 par MS-DOS_1991
Portekoi Posté 18 Octobre 2005 Posté 18 Octobre 2005 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
mathieu147 Posté 18 Octobre 2005 Auteur Posté 18 Octobre 2005 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 Posté 18 Octobre 2005 Posté 18 Octobre 2005 Rerebonjour, Tu peux nous remettre ton code corrigé stp ?
mathieu147 Posté 18 Octobre 2005 Auteur Posté 18 Octobre 2005 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émoiremysql_free_result($result);//Comparaison des mots de passeif($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
mathieu147 Posté 18 Octobre 2005 Auteur Posté 18 Octobre 2005 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é Posté 18 Octobre 2005 Posté 18 Octobre 2005 Et c'était quoi ce carré au début de ton code ??
MS-DOS_1991 Posté 19 Octobre 2005 Posté 19 Octobre 2005 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
Compte supprimé Posté 19 Octobre 2005 Posté 19 Octobre 2005 P.S: Dites-moi si je me trompe 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
MS-DOS_1991 Posté 19 Octobre 2005 Posté 19 Octobre 2005 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
Dan Posté 19 Octobre 2005 Posté 19 Octobre 2005 Oui, c'est le petit carré qui coinçait, celui avant le <?php
mathieu147 Posté 19 Octobre 2005 Auteur Posté 19 Octobre 2005 Moi je ne vois pas de petit carré avant <?php :-/ Enfin, merci quand-même :-)
MS-DOS_1991 Posté 19 Octobre 2005 Posté 19 Octobre 2005 Moi je ne vois pas de petit carré Pourtant il y en a un: <?php
mathieu147 Posté 19 Octobre 2005 Auteur Posté 19 Octobre 2005 Et moi je n'en vois pas?! C'est un problème à approfondir, ça...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant