1 votes

Problème d'envoi de "SetCookie" en premier dans le code php

Selon ce manuel : http://us2.php.net/setcookie, je dois définir le cookie avant toute autre chose.

Voici mon code de cookie :

if (isset($_COOKIE['watched_ads'])){
    $expir = time()+1728000; //20 jours
    $ad_arr = unserialize($_COOKIE['watched_ads']);
    $arr_elem = count($ad_arr);
    if (in_array($ad_id, $ad_arr) == FALSE){
        if ($arr_elem>10){
            array_shift($ad_arr);
        }
        $ad_arr[]=$ad_id;
        setcookie('watched_ads', serialize($ad_arr), $expir, '/');
    }
}
else {
    $expir = time()+1728000; //20 jours
    $ad_arr[] = $ad_id;
    setcookie('watched_ads', serialize($ad_arr), $expir, '/');
}

Comme vous pouvez le voir, j'utilise des variables pour définir le cookie.

Les variables proviennent d'une requête mysql et je dois effectuer la requête d'abord. Cependant, si je le fais, je recevrai un message d'erreur :

Cannot modify header information - headers already sent by ...

L'erreur pointe vers la ligne où je définis le cookie ci-dessus.

Que dois-je faire ?

MISE À JOUR :

Je fais ceci avant la partie setCookie :

$ad_id=$_GET['ad_id'];
$query2 = "SELECT * FROM classified WHERE classified.ad_id = '$ad_id'";
$results2 = mysql_query($query2) or die(mysql_error());
$row2 = mysql_fetch_array($results2);
$cat = $row2['category'];
$action=$row2['action'];
$sql_table='';
$num_rows = mysql_num_rows($query_results);
if ($num_rows != 0){
    ICI VIENT LA PARTIE SETCOOKIE

4voto

Luc Points 989

Comme d'autres l'ont suggéré, assurez-vous de ne pas afficher de html ou d'espaces avant de définir votre cookie.

Cela échouera parce que vous affichez du html avant de définir votre cookie.

Cela échouera également, car vous affichez un espace avant de définir votre cookie.

Aussi

Si vous utilisez un encodage UTF pour votre script php (et si vous n'êtes pas dans un pays anglophone, il est probable que vous le fassiez), assurez-vous que votre éditeur est configuré pour qu'il n'inclue pas de marque d'ordre de byte (BOM) au début de chaque fichier. Voir http://en.wikipedia.org/wiki/Byte_order_mark pour plus de détails sur le BOM.

2voto

Rob Young Points 606

La restriction n'est pas que vous ne devez rien faire avant de définir vos cookies, simplement que vous ne devez rien afficher avant de définir vos cookies.

Par exemple, disons que nous voulons obtenir des données de la base de données, les afficher à l'utilisateur et les définir dans le cookie.

`

Cela échouera car nous avons affiché les données avant de définir le cookie. Nous pouvons le corriger en déplaçant l'affichage après avoir défini le cookie.

`

0voto

Sean Kinsey Points 17117

Assurez-vous de ne pas imprimer rien avant d'ajouter des informations basées sur l'en-tête (comme les cookies sont).

0voto

mqchen Points 3621

Je ne vois aucun problème avec le code, sauf si mysql renvoie une erreur, ce qui pourrait causer cela.

C'est un coup dans le noir, mais assurez-vous de ne pas avoir d'espaces vides (ou quoi que ce soit d'autre d'ailleurs) avant les balises php d'ouverture. Assurez-vous également de ne pas avoir d'espaces vides en fin de fichier après les balises php de fermeture dans les fichiers que vous incluez.

0voto

waiwai933 Points 3598

Le message d'erreur que vous nous avez montré dit que les en-têtes ont été envoyés à la ligne setcookie(). Ainsi, vous pourriez définir des en-têtes ou des cookies plus tard dans le code, ce qui provoque l'erreur. (Enfin, je crois, car je ne me souviens pas de l'erreur mot à mot et vous l'avez coupée au point critique)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X