Comment définir un cookie, puis rediriger en PHP?
-
03-07-2019 - |
Question
Après un peu de traitement, je souhaite définir une valeur de cookie pour la saisie 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 renvoie true
dans l'un ou l'autre cas et je ne reçois aucune erreur / avertissements / avis.
EDIT: j'utilise Unix / Apache / MySQL / PHP
La solution
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;
}
Extrait 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é à '/ foo /', le cookie sera seulement 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 courant le cookie est en cours d’installation.
Autres conseils
Je suppose que vous utilisez IIS? Il existe un bogue connu avec les versions IIS inférieures à 7 lorsque vous tentez à la fois de définir un cookie et un en-tête d’emplacement dans la même demande.
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é configuré 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 déboguer sur l’existence de cookies consiste simplement à appeler print_r ($ _ COOKIE);.
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 afin 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...";
Utilisez une URL relative dans l'en-tête:
@Header("Location: orders_9090_1.php");