48 votes

Comment puis-je définir un cookie et ensuite rediriger en PHP ?

Après avoir effectué un peu de traitement, je veux définir une valeur de cookie pour l'entrée de l'utilisateur, puis le rediriger vers une nouvelle page. Cependant, le cookie ne s'installe pas. Si je commente la redirection, le cookie est défini avec succès. Je suppose qu'il s'agit d'un problème d'en-tête en quelque sorte. Quelle est la meilleure solution de contournement pour cette situation ?

if($form_submitted) {
    ...
    setcookie('type_id', $new_type_id, time() + 60*60*24*30);
    header("Location: $url");
    exit;
}

Notez que setcookie renvoie true dans les deux cas et je ne reçois aucune erreur/avis/préavis.

EDIT : J'utilise Unix/Apache/MySQL/PHP.

1 votes

Avez-vous essayé de paramétrer le cookie après le header() ?

0 votes

Sikx - Le cookie ne s'installe pas non plus si j'utilise header() en premier.

0 votes

J'ai eu un problème où Location: http://domain.com/asd ne sauverait pas le cookie. En faisant Location: /asd a résolu le problème pour moi.

76voto

Glavić Points 13021

Si vous avez des urls humaines ou des sous-dossiers (comme www.domain.com/path1/path2/), vous devez définir le chemin du cookie sur / pour qu'il fonctionne pour tous les chemins, et pas seulement pour le chemin actuel.

if($form_submitted) {
    ...
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    header("Location: $url");
    exit;
}

Extrait du manuel PHP :

Le chemin sur le serveur dans lequel le cookie sera disponible. Si la valeur est '/', le cookie sera disponible dans l'ensemble du domaine. S'il est défini sur '/foo/', le cookie sera disponible uniquement disponible que dans le répertoire /foo/ et tous les sous-répertoires tels que /foo/bar/ du domaine . La valeur par défaut est le répertoire actuel dans lequel le cookie est placé.

4 votes

Alors vous auriez dû poser la @QuestionMark.

4voto

atonyc Points 762

J'ai pu résoudre ce problème en utilisant un léger retard dans l'en-tête de rafraîchissement. Nous définissons l'en-tête (ce qui doit être fait avant toute méthode susceptible de produire des résultats, comme setcookie), puis nous définissons les cookies. J'ai ajouté un message pour que l'utilisateur ne voie pas un écran vide pendant ces quelques secondes.

    header("refresh: 2; url=$url");
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    echo "Processing, please wait...";

4voto

tkotitan Points 2109

Comment vérifiez-vous si le cookie est installé ? Les cookies sont disponibles sur le site suivant après qu'ils aient été définis.

Les pièges courants :

Les cookies ne seront pas visibles avant le prochain chargement d'une page pour laquelle le cookie doit être visible. Pour vérifier si un cookie a été défini avec succès, recherchez le cookie sur la page de chargement suivante avant qu'il n'expire. Le temps d'expiration est défini par le paramètre expire. Un bon moyen de déboguer l'existence des cookies est d'appeler simplement print_r($_COOKIE) ;.

0 votes

Je vérifiais si le cookie était défini par un plugin de navigateur. Même si je navigue ensuite sur une autre page et que je vérifie mes cookies, il n'est pas activé.

4voto

Daniel Von Fange Points 2739

Je suppose que vous utilisez IIS ? Il existe un bogue connu avec les versions d'IIS inférieures à 7 lorsqu'on tente de définir à la fois un cookie et un en-tête de localisation dans la même requête.

http://support.microsoft.com/kb/q176113/

1 votes

J'utilise IIS et je rencontre exactement le même problème. Connaissez-vous une solution de contournement dans un .php script ?

0voto

Ondrej Konrady Points 1

Utilisez une URL relative dans l'en-tête :

@Header("Location: orders_9090_1.php");

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