Aller au contenu

[PHP]Erreur avec un cookie


Ocaeph

Messages recommandés

Bonjour,

J'ai un problème de cookie, quand la ligne est présente:

setcookie("lang", $lang, time()+604800);

J'obtiens l'erreure suivante:

Warning: Cannot modify header information - headers already sent by (output started at /www/index.php:38) in /www/index.php on line 44

Mais si j'enlèves la déclaration du cookie, ca marche bien.

Ce qui est bizarre c'est que j'utilisais easyphp et ca marchait très bien, et là je suis sur un serveur Unix et depuis j'ai cette erreure :D

Merci de votre aide!!!

Lien vers le commentaire
Partager sur d’autres sites

Selon la doc PHP :

setcookie() définit un cookie qui sera envoyé avec le reste des en-têtes. Les cookies doivent passer avant tout autre en-tête (c'est une restriction des cookies, pas de PHP). Cela vous impose d'appeler cette fonction avant toute balise <html> ou <head>.

Ta fonction setcookie est-elle bien appelée avnt tout envoi de données vers le navigateur ?

Lien vers le commentaire
Partager sur d’autres sites

<?php

if(isset($_COOKIE['lang'])) {

$lang = $_COOKIE['lang'];

} else {

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);

}

if ($lang=='fr') {

include('fr/fr-lang-compta.php');

} elseif ($lang=='en') {

include('en/en-lang-compta.php');

}

$expire = 365*24*3600;

setcookie("lang", $lang, time() + $expire);

?>

Voici le code entier, merci pour le coup de main

Lien vers le commentaire
Partager sur d’autres sites

Hummm, et tout ce bloc est bien situé en tout début de la page ? Vérifie qu'il n'y a pas un espace ou une ligne blanche avant le <?php .

De même, vérifie que le fichier 'en/en-lang-compta.php' ne renvoie pas d'informations textuelles (texte, espace, ligne blanche, etc), et qu'il ne positionne pas des headers.

Lien vers le commentaire
Partager sur d’autres sites

Hummm, et tout ce bloc est bien situé en tout début de la page ? Vérifie qu'il n'y a pas un espace ou une ligne blanche avant le <?php .

De même, vérifie que le fichier 'en/en-lang-compta.php' ne renvoie pas d'informations textuelles (texte, espace, ligne blanche, etc), et qu'il ne positionne pas des headers.

Je te reprend : qu'il n'envoie pas de contenu :)

Parce qu'envoyer des entêtes (en plus du cookie) c'est pas trop grave

Lien vers le commentaire
Partager sur d’autres sites

oui donc, j'ai demandé à mon prof :) à priori c'est une entête comme une autre, et y a pas d'ordre. Et en fait, la version anglais de php.net donne la réponse : http://fr.php.net/manual/en/function.setcookie.php

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace. If output exists prior to calling this function, setcookie() will fail and return FALSE. If setcookie() successfully runs, it will return TRUE. This does not indicate whether the user accepted the cookie.

Ce qui n'a pas du tout le même sens :)

Lien vers le commentaire
Partager sur d’autres sites

http://bugs.php.net/bug.php?id=36746

=)

C'est ce qu'on t'explique, oui. Les cookies font partie des entêtes HTTP. Si tu as une sortie texte - ici, du html - alors cela signifie que tu as fini d'envoyer les entêtes et que le client peut commencer à traîter les informations qu'il reçoit comme données, et non plus comme entête.

Faut que tu vérifie dans ton code source où il y a des espaces avant <?php, ou après, ?>, et en fait où il y a des echo/print/espaces/code en dehors de <?php et ?> de manière à supprimer tout espace/etc qui serait avant le setcookie.

Lien vers le commentaire
Partager sur d’autres sites

Marrant, les différences entre la version FR et la version EN :

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction).

setcookie() définit un cookie qui sera envoyé avec le reste des en-têtes. Les cookies doivent passer avant tout autre en-tête (c'est une restriction des cookies, pas de PHP).

Le coup du cookie qui passe avant les autre headers semble donc être une erreur de traduction.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...