Aller au contenu

[PHP]Erreur avec un cookie

Featured Replies

Posté(e)

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

Posté(e)

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 ?

Posté(e)
  • Auteur
<?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

Posté(e)

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.

Posté(e)

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

Posté(e)

nan !:)

C'est pas les données les entêtes :p tout ce que tu envoie via header (ou setcookie), ce sont des entêtes. Le reste des données ;)

Posté(e)

Je persiste : si, c'est grave :p

Les cookies doivent passer avant tout autre en-tête (c'est une restriction des cookies, pas de PHP)

(tiré de la doc PHP)

Posté(e)

Ca m'étonne quand même comme restriction (j'admet avoir perdu), puisque c'est un entête comme une autre ... (Cookie: xxx; etc)

Posté(e)
  • Auteur

En faisant des recherches sur Google j'avais vu que c'était peut-etre des espaces en trop et j'ai enlever tout ce que je pouvais mais ca n'a rien changer :p

Pour votre débat euhhhhh je comprends pas donc allez-y défoulez vous :transpi:

Posté(e)

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

Posté(e)
  • Auteur

Si je comprends bien il faut que je mettes mon code php au tout début, avant <html>?? :transpi:

Posté(e)

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.

Modifié par Baldurien

Posté(e)

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.

Posté(e)

Faut pas s'en faire :) ça devrait être corrigé (j'ai reçu un mail disant que mon bug avait été corrigé)

Archivé

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