Como posso definir um cookie e, em seguida, redirecionar em PHP?
-
03-07-2019 - |
Pergunta
Depois de fazer um pouco de processamento, eu quero definir um valor de cookie para a entrada do usuário e, em seguida, redirecioná-los para uma nova página. No entanto, o cookie não está sendo definido. Se eu comentar o redirecionamento, então o cookie é definido com sucesso. Suponho que isso é uma questão de cabeçalho de algum tipo. Qual é a melhor solução para essa situação?
if($form_submitted) {
...
setcookie('type_id', $new_type_id, time() + 60*60*24*30);
header("Location: $url");
exit;
}
Note que SetCookie retornos true
em ambos os casos e fico sem erros / avisos / notificações.
EDIT: Eu estou usando Unix / Apache / MySQL / PHP
Solução
Se você tem urls ou subpastas (como www.domain.com/path1/path2/), então você deve definir caminho do cookie para / de trabalho para todos os caminhos, não apenas uma corrente. Humanos
if($form_submitted) {
...
setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
header("Location: $url");
exit;
}
A partir do PHP manual:
O caminho no servidor em que o cookie estará disponível on. Se definido como '/', O cookie estará disponível dentro de todo o domínio. Se definido como '/ Foo /', o cookie só será disponível dentro do diretório / foo / e todos os sub-diretórios como / Foo / bar / de domínio. O padrão valor é o diretório atual que o cookie está sendo definido em.
Outras dicas
Eu estou supondo que você está executando o IIS? Há um bug saber com IIS versões menos de 7 ao tentar tanto definir um cookie e um cabeçalho localização no mesmo pedido.
Como você está testando se o cookie é definido? Biscoitos estão disponíveis no próximo página após eles são definidos.
Problemas comuns:
Os cookies não irá tornar-se visível até o próximo carregamento de uma página que o cookie deve ser visível para. Para testar se um cookie foi definida com êxito, verifique se o cookie em um carregamento da página seguinte, antes de o cookie expira. tempo expirar é definido através do parâmetro expirar. Uma boa forma de depurar a existência de cookies é simplesmente usar print_r ($ _ COOKIE);.
Eu era capaz de resolver esse problema usando um ligeiro atraso no cabeçalho de atualização. Nós definir o cabeçalho (que deve ser feito antes de quaisquer métodos que o resultado pode, como setcookie), e em seguida, definir os cookies. Eu adicionei uma mensagem para que o usuário não ver uma tela em branco para os segundos casal.
header("refresh: 2; url=$url");
setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
echo "Processing, please wait...";
Use um URL relativo no cabeçalho:
@Header("Location: orders_9090_1.php");