web-dev-qa-db-fra.com

Comment définir un cookie, puis rediriger en PHP?

Après un peu de traitement, je souhaite définir une valeur de cookie pour l’entrée de l’utilisateur, puis la rediriger vers une nouvelle page. Cependant, le cookie n'est pas en cours d'installation. Si je commente la redirection, le cookie est défini avec succès. Je suppose que c'est un problème d'en-tête. 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 retourne true dans les deux cas et je n’obtiens aucune erreur/avertissements/avis.

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

41
Wickethewok

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

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

Du manuel PHP:

Le chemin sur le serveur dans lequel le cookie sera disponible sur. Si réglé à '/', le cookie sera disponible dans tout le domaine. Si réglé à '/ toto /', le cookie ne sera que disponible dans le répertoire/foo/ et tous les sous-répertoires tels que /foo/bar/du domaine. Le défaut valeur est le répertoire en cours que le cookie est en cours d'installation.

71
Glavić

Je suppose que vous utilisez IIS? Il existe un bogue connu avec les versions IIS inférieures à 7 lorsque vous essayez de définir un cookie et un en-tête d'emplacement dans la même demande.

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

4
Daniel Von Fange

J'ai pu résoudre ce problème en utilisant un léger retard dans l'en-tête d'actualisation. Nous définissons l'en-tête (ce qui doit être fait avant toute méthode pouvant générer des résultats, comme setcookie), puis définissons les cookies. J'ai ajouté un message pour que l'utilisateur ne voie pas d'é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...";
2
atonyc

Comment testez-vous si le cookie est défini? Les cookies sont disponibles sur la page suivante après leur configuration.

Pièges courants:

Les cookies ne deviendront visibles qu'au prochain chargement d'une page pour laquelle le cookie devrait être visible. Pour vérifier si un cookie a été défini avec succès, recherchez le cookie sur une page de chargement suivante avant son expiration. Le délai d'expiration est défini via le paramètre expire. Un bon moyen de corriger l'existence de cookies consiste simplement à appeler print_r ($ _ COOKIE) ;.

2
tkotitan

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

@Header("Location: orders_9090_1.php");
0
Ondrej Konrady