Cookies, pb headers !!

Cookies, pb headers !! - PHP - Programmation

Marsh Posté le 12-06-2005 à 21:21:31    

Salut,  
 
J'essaye de faire une identification pour mon site qui contient un forum.
J'ai une page indexe.php, qui contient la base générale de mon site (en-tete + cotés) et le tableau du milieu qui est une variable $page.
Une adresse serait par exple indexe.php?page=lire_cine.
 
J'ai donc une page identification dans laquelle j'ai la fameuse petite case "Se souvenir de moi" qui est censé envoyer un cookie.
J'ai mis la fonction cookie en top de ma page indexe.php.
Ca donne ca :
 

Code :
  1. <?  //1ere ligne d'indexe.php
  2. function send_cookie($nickname)
  3. {
  4. $expire = 365*24*3600;
  5. $cook = setcookie("pseudo","$nickname",time()+$expire);
  6. return($cook);
  7. }
  8. ?>
  9. <HTML>
  10. ......


 
Et apres j'ai la definition de mon entete et de ma barre de menus sur la gauche, puis j ai l'endroit ou j'appelle mon tableau du milieu comme variable :

Code :
  1. <!-- menu central -->
  2. <td align="center" valign="top" class="comic">
  3. <?php
  4.  if (empty($page))
  5.  {
  6.   include("default.php" );
  7.  }
  8.  else
  9.  {
  10.   $includ="$page.php";
  11.   include($includ);
  12.  }
  13. ?>
  14. </td>
  15. <!-- fin menu central -->


puis la page identification, d'où j'appelle la fonction cookie :

Code :
  1. if($souvenir == "on" )
  2.    {
  3.    $cook = send_cookie($surnom);
  4.    }
  5.    ?>
  6. <!-- menu central -->
  7. <table border="1" width="100%" class = "bordure" >
  8.    <tr><td align="center"><blink><font size="4">Votre identification s'est déroulée avec succés</font></blink><br><br>
  9.    <center><a href="indexe.php?page=identification" title="Index"><font color='white'                                      size='1'>Retour</font></a></center></td></tr>
  10. </table>
  11. <!-- fin menu central -->


 
Et quand je lance le tout, il me repond :
 
Warning: Cannot modify header information - headers already sent by (output started at /home/ioiolodi/www/indexe.php:11) in /home/ioiolodi/www/indexe.php on line 5
 
Je comprend pas  :cry:  
Qqun pourrait m'aider ?
 
Merci


Message édité par Profil supprimé le 12-06-2005 à 22:23:36
Reply

Marsh Posté le 12-06-2005 à 21:21:31   

Reply

Marsh Posté le 12-06-2005 à 21:25:02    

Les "headers" sont des informations envoyées en tout début de page, ayant pour but de n'être pas affichées et faisant partie des communications HTTP entre le navigateur et le serveur.
 
Par défaut, PHP fonctionne linéairement et avec peu de bufferisation: dès que tu lui dis d'afficher quelque chose il le place en sortie et l'envoie au navigateur.
 
Les headers devant impérativement être envoyés avant le début de la page (HTML), tenter d'accéder au header  en plein milieu de l'envoi de la page génère une erreur.
 
Solutions:
1- Coder proprement et faire bien attention à envoyer les headers avant le début du code HTML
2- Coder sâlement et utiliser la bufferisation de sortie (chercher ob_start, ob_flush et ob_end dans la doc PHP)


---------------
[Masklinn intérimaire Vediorbis] Kami-sama wa Ecchi ga dai-kirai desu!
Reply

Marsh Posté le 12-06-2005 à 21:27:28    

Vi ca je comprend mais ou est ce que j'envoie les headers ?
La ou se trouve ma fonction ou la ou j'appelle al fonction ?
car la fonction est bien avant les headers puisque c'est la premiere ligne de code. Mais si c'est la ou j'appelle la fonction je ne vois pas comment faire ...
 
En fait j'ai lu pas mal de doc (nottament phopdebutant et nexen) à propos des headers, mais le truc c'est que je ne sais pas à quel moment je les envoi. C'est pour ca que j'ai mis la fonction send_cookie en premiere ligne de ma page principale.
 
Si j'appelle les headers à lendroit ou j'appelle la fonction (donc dans identification.php alors que faut-il faire ? Faut-il passer par une page intermediaire ayant pour unique but d'envoyer le cookie ?


Message édité par Profil supprimé le 12-06-2005 à 21:52:10
Reply

Marsh Posté le 12-06-2005 à 22:49:39    

il faut que tu appelle ta fonction avant d'avoir envoyer le premier caractère au navigateur ( que ce soit avec une fonction echo / printf  ou que ce soit des caractères hors des <? ?> )
 


---------------

Reply

Marsh Posté le 12-06-2005 à 22:52:30    

Ok
merci pour ta réponse
Donc dans mon cas, vu que j'utilise tout le temps ma page indexe.php, la seule solution est-elle de passer par une page completement blanche envoyant le cookie et redirigant apres ?


Message édité par Profil supprimé le 12-06-2005 à 22:52:59
Reply

Marsh Posté le 12-06-2005 à 22:55:56    

pas forcement  
tu envoi tes cookies avant index, avec qq chose du genre  

Code :
  1. <?
  2. function cooKieSent(){
  3. /*
  4. tu regarde si le cookie est présent ou pas
  5. */
  6. }
  7. function sendCookie($nicknmame){
  8. /* definition de ta fonciton */
  9. }
  10. if(!cookieSent()){
  11.       send_cookie($nickname)   
  12. }
  13. ?>
  14. <html>
  15. </html>


 
au passage , inclue "./".$page au lieu de $page  
ca evite que qqun s'amuse a esayer d'inclure une page distante dans ton script ( page qui sera executée par ton serveur , avec acces aux variables et a bcp d'infos de configuration )


Message édité par flo850 le 12-06-2005 à 22:57:30

---------------

Reply

Marsh Posté le 12-06-2005 à 23:13:51    

flo850 a écrit :

pas forcement  
tu envoi tes cookies avant index, avec qq chose du genre  

Code :
  1. <?
  2. function cooKieSent(){
  3. /*
  4. tu regarde si le cookie est présent ou pas
  5. */
  6. }
  7. function sendCookie($nicknmame){
  8. /* definition de ta fonciton */
  9. }
  10. if(!cookieSent()){
  11.       send_cookie($nickname)   
  12. }
  13. ?>
  14. <html>
  15. </html>


 
au passage , inclue "./".$page au lieu de $page  
ca evite que qqun s'amuse a esayer d'inclure une page distante dans ton script ( page qui sera executée par ton serveur , avec acces aux variables et a bcp d'infos de configuration )


 
D'accord mais je veux envoyer le cookie que si je viens de cliquer sur valider (dans identification) et que la case "se souvenir de moi" est cochée. je ne veux pas l envoyer a chaque fois que j'arrive sur indexe. Je peux faire ca avec ta technique ?


Message édité par Profil supprimé le 12-06-2005 à 23:14:22
Reply

Marsh Posté le 12-06-2005 à 23:19:54    

Code :
  1. <?
  2. /*
  3. ici tu peux faire ce que tu veux , du moment que tu ne fait pas d'affichage ( pas de echo / printf )
  4. */
  5. if(isset($_POST['caseACocherPourCreerLeCookie)){
  6. send_cookie($nickname)   
  7. }
  8. /*
  9. ici tu peux faire ce que tu veux , du moment que tu ne fait pas d'affichage ( pas de echo / printf )
  10. */
  11. ?>
  12. </html>
  13. <!-- ici il est deja trop tard pour envoyer des cookie-->
  14. merci de vous etres identifier</html>


Message édité par flo850 le 12-06-2005 à 23:21:27

---------------

Reply

Marsh Posté le 12-06-2005 à 23:25:35    

Ok merci bcp :D
Je vais coder ca
Par contre pourrais tu me reexpliquer l'histoire de la page distante ? Comment une page qui nest pas sur mon serveur peut elle etre executée ? Et quels sont les caracteres que je devrais rajouter ? .$page ou "./".$page ?

Reply

Marsh Posté le 12-06-2005 à 23:33:33    

pas de quoi  
 
pour l'instant tu fais un "brutal"   include($page)
 
pour inclure la page , php va d'abord regarder dans le repertoire courant , puis le long du PATH, et si la page contient http://, il va aussi regarder sur le net
 
fait le test en ayant mis $page = "http://www.google.com";  
 
tu vas voir que ca va inclure la page d'accueil de google  
 
maintenant imagine un petit scénario ( que j'ai deja vu se realiser :sweat: )  

Code :
  1. <?
  2. connecte_bdd();
  3. if(identificationOK($_POST['login'],$_POST['pass'])){
  4.   include($page);
  5. }
  6. ?>


 
et qu'un petit malin arrive a faire inclure

Code :
  1. $tab = getNomDesTablesMySQL(); // facile en mySQL
  2. foreach($tab as $nom){
  3. $query = "DROP TABLE $nom";
  4. mysql_query($query);
  5. }


 
 
et paf , tu n'as plus aucune table mysql  
 
 
alors que si tu fait  

Code :
  1. include("./".$page);

on parle forcement de page présente sur TON serveur
ca complique grandement les choses pour profiter de cette faiblesse


Message édité par flo850 le 12-06-2005 à 23:34:05

---------------

Reply

Marsh Posté le 12-06-2005 à 23:33:33   

Reply

Marsh Posté le 12-06-2005 à 23:44:53    

donc j ai juste a modifier cette partie :
 

Code :
  1. <!-- menu central -->
  2. <td align="center" valign="top" class="comic">
  3. <?php
  4. if (empty($page))
  5.   {
  6.   include("default.php" );
  7.   }
  8. else
  9.   {           
  10.   $includ="$page.php";  // en mettant include("./".$page)
  11.   include($includ);
  12.      }
  13. ?>
  14. </td>
  15. <!-- fin menu central -->

Reply

Marsh Posté le 12-06-2005 à 23:48:30    

:oui:


---------------

Reply

Marsh Posté le 12-06-2005 à 23:49:31    

Bon ben merci bcp de l avertissement et des autres conseils.
 
Je vais coder ca et reviendrai pour dire si je m'en sors ou non ...  :jap:

Reply

Marsh Posté le 13-06-2005 à 02:30:41    

Bon j'ai mit la securité pour le include (en même temps ct pas trop dur  :whistle: ) mais bon ca ca marche.
 
Pour le cookie, j'ai modifié comme suit :
 
indexe.php

Code :
  1. <?
  2. include("connect.php" )
  3. ?>
  4. <?
  5. if ($cook == 1)
  6. {
  7. $req_user = mysql_query("SELECT * FROM users where cle='$cle'" );
  8. $nickname = mysql_result($req_user,0,"pseudo" );
  9. $expire   = 365*24*3600;
  10. $cook     = setcookie("pseudo","$nickname",time()+$expire);
  11. }
  12. ?>
  13. <HTML>
  14. <?
  15. include("foncts.php" )
  16. ?>
  17. <script language=javascript>
  18. var params_meteo="type_meteo=terrestre&langue=fr&fond=FFF0AA&texte=0000FF&saisie_meteo=caen";
  19. </script>
  20. <HEAD>
  21. <TITLE>Bienvenue sur Ioiolodie's website</TITLE>
  22. </HEAD>


 
et :
identification.php

Code :
  1. if($souvenir == "on" )
  2.     {
  3.     $cook = 1;
  4.     }
  5. else
  6.     {
  7.     $cook = 0;
  8.     }
  9. ?>
  10. <!-- menu central -->
  11. <table border="1" width="100%" class = "bordure" >
  12. <tr><td align="center"><blink><font size="4">Votre identification s'est déroulée avec succés</font></blink><br><br>
  13.         <center><a href="indexe.php?page=identification&cook=<? echo($cook);?>&cle=<? echo($key);?>" title="Index"><font                                       
  14.         color='white' size='1'>Retour</font></a></center></td></tr>
  15. </table>
  16. <!-- fin menu central -->


 
et ca me renvoit toujours la mm erreur.
Qu'est ce que j'ai mal codé ?

Reply

Marsh Posté le 13-06-2005 à 10:09:26    

entre le ?> de la ligne 3 et le <? de la ligne 5 , il y a un saut de ligne, donc des caractères envoyés au navigateurs
 
il ne faut pas qu'il y ait de caractères envoyés avant l'appel a la fonction setcookie
 
idem , si tu as des espaces avant le <? de la ligne 1 , enleve les


---------------

Reply

Marsh Posté le 13-06-2005 à 20:56:09    

flo850 a écrit :

entre le ?> de la ligne 3 et le <? de la ligne 5 , il y a un saut de ligne, donc des caractères envoyés au navigateurs
 
il ne faut pas qu'il y ait de caractères envoyés avant l'appel a la fonction setcookie
 
idem , si tu as des espaces avant le <? de la ligne 1 , enleve les


 
wow c a ce point la ? Bon ben c'est corrigé et ca marche.
Maintenant je m'attaque à l'affichage et il me fait encore une erreur:
Parse error: parse error, unexpected '\"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/ioiolodi/www/indexe.php on line 73
mais je desespere pas je vais trouver :sweat:

Reply

Marsh Posté le 13-06-2005 à 20:59:33    

c 'est a ce point là  [:twixy]  
tu nous donen le contenu de la ligne 73  [:tilleul]  ?


---------------

Reply

Marsh Posté le 13-06-2005 à 21:17:28    

Vi c'est a ce point la :(
 
la ligne 73 c un banal affichage de cookie
 

Code :
  1. <? echo "$_COOKIE["pseudo"]"; ?>


 
mais bon la je fait des verifs pour savoir si le cookie a bien ete envoyé

Reply

Marsh Posté le 13-06-2005 à 21:20:34    

mets plutot echo $_COOKIE["pseudo"];  


---------------

Reply

Marsh Posté le 13-06-2005 à 21:29:23    

bon ben ca marche merci bcp
mais j avais prit cette ligne de code sur phpdebutant alors comprend pas pourquoi ca genere une erreur
merci bcp de ton aide précieuse :d :jap:


Message édité par Profil supprimé le 13-06-2005 à 21:29:57
Reply

Marsh Posté le 13-06-2005 à 21:30:42    

bah normal regard la gueule des guillemeets tu va comprendre...

Reply

Marsh Posté le 13-06-2005 à 21:32:25    

pmusa a écrit :

bah normal regard la gueule des guillemeets tu va comprendre...


 
a l'origine c'etait :  

Code :
  1. echo "Bonjour $_COOKIE["pseudo"]";


 
guillemet pour guillemet ce qui etait marqué sur phpdebutant
mais bon je ne vais plus me fier qu'a nexen du coup :p

Reply

Marsh Posté le 13-06-2005 à 21:37:10    

essaye plutot echo "Bonjour ".$_COOKIE['pseudo'];


---------------

Reply

Marsh Posté le 13-06-2005 à 21:38:39    

c'est ce que j ai fait, maintenant ca marche :)
merci bcp flo


Message édité par Profil supprimé le 13-06-2005 à 21:38:58
Reply

Marsh Posté le 13-06-2005 à 22:12:49    

de rien


---------------

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed