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

Foi útil?

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.

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

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");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top