Remover um cookie


260

Quando quero remover um cookie, tento

unset($_COOKIE['hello']);

Vejo no meu navegador de cookies do Firefox que o cookie ainda existe. Como posso realmente remover o cookie?


Você pode encontrar $cookie->delete()em github.com/delight-im/PHP-Cookie útil. O código da pergunta apenas exclui a propriedade que foi analisada no lado do servidor. O cookie continuará ativo no lado do cliente.
caw

Respostas:


280

Você pode tentar isso

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}

141
Entendo que este é um exemplo, mas nunca armazene nome de usuário ou senha em cookies.
tamasd

3
É inútil unset($_COOKIE['Hello']);. Não muda nada se você removê-lo.
Machineaddict

30
@machineaddict unset($_COOKIE['Hello']);é realmente importante se você puder verificar o cookie em algum lugar posteriormente no código.
Andreas Hultgren

4
funcionando bem, mas ao tentar recarregar a página. ele viu o conjunto de cookies com dados antigos, por quê?
Nilesh patel

9
======= NÃO FUNCIONA NO CHROME ======= Tentei esse código hoje e quando acesso o site usando o google chrome, e depois vou para as ferramentas de desenvolvedor no chrome, vejo que o tempo de expiração é definido como 1 segundo antes da época (por exemplo, 1969-12-31 23:59:59), no entanto, quando da próxima vez que envio a página, o cookie é enviado ao servidor. Quando mudei o -1 para 1 (por exemplo, 01-01-2009 00:00:01) para fornecer o seguinte comando: setcookie ('Hello', null, 1, '/'); em seguida, cromo agiu como esperado e não apresentou o cookie
Peter Hinds

284

Defina o valor como "" e a data de validade como ontem (ou qualquer data anterior)

setcookie("hello", "", time()-3600);

O cookie expirará na próxima vez que a página for carregada.


10
Que tal definir o tempo para 0 (a época)? =]
strager

12
Se você colocar uma data muito distante no passado, o IE latirá e a ignorará, ou seja, o valor não será removido.
Julien

52
@strager O manual declara: Se definido como 0 ou omitido, o cookie expirará no final da sessão (quando o navegador fechar). Isso não está realmente excluindo o cookie. Realmente não sei se o IE fará o que Julien disse, mas é mais do que possível que o IE faça algo estranho.
Yannis 23/05

31
Além disso, não se esqueça de desmarcar ($ _ COOKIE ["olá"])) também, porque se houver código no restante da página que analise $ _COOKIE ["olá"], ele ainda o encontrará definido. Eu só fui mordido por este.
Magmatic

12
Além disso, é uma boa ideia definir o caminho, então setcookie ('olá', '', time () - 3600, '/');
Stephan Weinhold

227

Uma maneira limpa de excluir um cookie é limpar o $_COOKIEarquivo de valor e o cookie do navegador:

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}

3
Este é o melhor método, porque você não precisa atualizar a página!
MaxV

19
Eu continuo descendo a página e as respostas estão ficando melhores, engraçadas. Mas este é o melhor, pare de procurar aqui.
Andrew

23
Para sua informação, se você configurar o cookie usando um caminho, também precisará incluir o caminho nesta setcookiechamada:setcookie('key', '', time() - 3600, '/');
Gavin

1
@ Gavin Obrigado por essa dica. Fiquei me perguntando por que não estava excluindo, mas foi unsettingbem-sucedido.
stinkysGTI

1
Para quem está verificando a existência de um cookie e se preocupa com os cookies que existem com nullvalores, você precisará usar array_key_exists () , pois um cookie com um nullvalor não será encontrado por uma isset()verificação.
Leith

27

Para excluir um cookie de forma confiável, não é suficiente configurá-lo para expirar a qualquer momento no passado, conforme calculado pelo seu servidor PHP. Isso ocorre porque os computadores clientes podem e costumam ter horários diferentes dos do seu servidor.

A melhor prática é substituir o cookie atual por um cookie em branco que expire um segundo no futuro após a época (1 de janeiro de 1970 00:00:00 UTC), da seguinte maneira:

setcookie("hello", "", 1);

13
Me corrija se eu estiver errado, mas definir isso como "1" definiria um segundo após a época, e não um segundo no futuro ..? No entanto, acredito que você está correto quanto às diferenças de fuso horário, portanto, a melhor solução seria defini-lo para 2 dias no passado (para que mesmo o fuso horário mais distante ainda desative o cookie).
PaulSkinner

@PaulSkinner a data da época é independente dos fusos horários, o computador faz esse cálculo para você.
AlexR $

3
@AlexR Sim. Realmente não responde ao meu argumento. Para meu entendimento, o código acima não definir o cookie para expirar no passado (um segundo passado a época), se não me engano.
PaulSkinner

@PaulSkinner, é claro, o restante do seu comentário está perfeitamente bem.
AlexR # 26/14

9
+1 para o "1". Não entendo por que todos os outros estão tão empenhados em definir um cookie excluído exatamente uma hora no passado.
Meisner

20

Isso desmarca o cookie no seu código, mas como a variável $ _COOKIE é atualizada a cada solicitação, ela volta à próxima solicitação da página.

Para realmente se livrar do cookie, defina a data de validade no passado:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);

1
Não há necessidade unset()do cookie?
Pratik

2
@PratikCJoshi Somente se o seu código o procurar posteriormente.
AlphaMycelium

14

Eu tive o mesmo problema no meu código e descobri que era um problema de caminho do cookie. Verifique esta postagem de estouro de pilha: Não é possível excluir o conjunto de php

Eu havia definido o cookie usando um valor de caminho de "/", mas não tinha nenhum valor de caminho quando tentei limpá-lo, por isso não foi limpo. Então, aqui está um exemplo do que funcionou:

Configurando o cookie:

$cookiePath = "/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);

Limpando o cookie:

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);

Espero que ajude.




7

É assim que o código PHP v7 setcookie () funciona quando você faz:

<?php
    setcookie('user_id','');
    setcookie('session','');
?>

Na saída do tcpdump enquanto fareja a porta 80, o servidor envia ao cliente (navegador) os seguintes cabeçalhos HTTP:

Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

Observando pacotes nas solicitações a seguir, o Navegador não envia mais esses cookies nos cabeçalhos


4

Para excluir o cookie, basta definir o valor como NULL:

"Se você definiu um cookie com valores não padrão para um tempo de expiração, caminho ou domínio, deverá fornecer esses mesmos valores novamente quando excluir o cookie para que o cookie seja excluído corretamente." Cite o livro "Aprendendo PHP5".

Portanto, este código deve funcionar (funciona para mim):

Configurando o cookie: setcookie('foo', 'bar', time() + 60 * 5);

Excluindo o cookie: setcookie('foo', '', time() + 60 * 5);

Mas notei que todo mundo está definindo o prazo de validade como passado, isso é necessário e por quê?


1
É confiável, é por isso. Uma combinação de definir o valor para nada e um tempo no passado (mas não muito longe, pois o IE ocasionalmente não gosta muito do que eu li) funciona de maneira geral.
PaulSkinner

A cadeia vazia ''não é a mesma coisa que null.
orev 30/07

3

Para remover todos os cookies, você pode escrever:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}

3
Na verdade, isso não removerá os cookies, a menos que eles tenham as mesmas configurações de caminho e domínio que os padrões para setcookie.
Noishe

2

Basta definir a data de validade como uma hora atrás, se você quiser "remover" o cookie, desta forma:

setcookie ("TestCookie", "", time() - 3600);

ou

setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);

Fonte: http://www.php.net/manual/en/function.setcookie.php

Você deve usar a filter_input()função para todas as globais em que um visitante pode entrar / manipular, assim:

$visitors_ip = filter_input(INPUT_COOKIE, 'id');

Você pode ler mais sobre isso aqui: http://www.php.net/manual/en/function.filter-input.php e aqui: http://www.w3schools.com/php/func_filter_input.asp


2

Eu sei que já faz muito tempo desde que este tópico foi criado, mas vi um pequeno erro nessa solução (posso chamá-lo assim, porque é um detalhe). Concordo que a melhor solução é provavelmente esta:

if (isset($_COOKIE['remember_user'])) {
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            return true;
        } else {
            return false;
        }

Porém, no presente caso, você exclui os cookies em todos os casos em que a função não configurada funciona e imediatamente cria novos cookies expirados, caso a função não configurada não funcione.

Isso significa que, mesmo que a função não configurada funcione, ela ainda terá 2 cookies no computador. O objetivo solicitado, do ponto de vista lógico, é excluir os cookies, se possível e se não for, fazê-lo expirar; para obter o resultado "mais limpo".

Então, acho que devemos fazer:

if (isset($_COOKIE['remember_user'])) {
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            return true;
        } else {
            return false;
        }

Obrigado e tenha um bom dia :)


A função unset é destinada à lógica do PHP (se você deseja usar a variável $ _COOKIE ['Hello'], não pode, pois está desmarcada). E a função setcookie é para o navegador. Em duas finalidades diferentes, a ordem das funções não afeta o código real.
Kalzem

Na verdade, eu sabia que sim, mas se você quiser ter certeza absoluta de que o cookie foi desconfigurado / excluído e, portanto, use as duas soluções imediatamente, seria mais limpo antes que as teses expirem e depois desfeitas que teses não definidas e depois recrie um cookie expirado ... se você entende o que eu quero dizer?
Greg

Sim, desculpe responder agora :) Enviei porque vi pessoas fazendo isso de outra maneira .. mas parece mais inteligente assim, eu acho.
Greg

2
$cookie_name = "my cookie";
$cookie_value = "my value";
$cookie_new_value = "my new value";

// Create a cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds

// Get value in a cookie,
$cookie_value = $_COOKIE[$cookie_name];

// Update a cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");

// Delete a cookie,
setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.

2

Se você deseja excluir completamente o cookie de todo o seu domínio atual, o código a seguir certamente o ajudará.

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");

Este código excluirá completamente a variável de cookie de todo o seu domínio, ou seja; "/" - indica que o valor da variável de cookie está definido para todo o domínio, não apenas para o domínio ou caminho atual. time () - 300 indica que foi definido para um horário anterior e expirará.

É assim que é perfeitamente excluído.


1

Você pode definir uma variável de sessão com base nos valores do cookie

session_start();

if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
$_SESSION['loggedin'] = "true";
}

echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");

1

Você pode simplesmente usar esta função de personalização:

function unset_cookie($cookie_name) {
    if (isset($_COOKIE[$cookie_name])) {
        unset($_COOKIE[$cookie_name]);
        setcookie($cookie_name, null, -1);
    } else { return false; }
}

Se você deseja remover $ _COOKIE ['user_account'].
Apenas use:

unset_cookie('user_account');

1

É simples!

setcookie("cookiename", "cookievalue", 1);

Não é necessário definir valor para um cookie de exclusão!
Amir Fo

1

Quando você entra 0para o horário, significa "agora" (+ 0s a partir de agora é agora) para o navegador e ele exclui o cookie.

setcookie("key", NULL, 0, "/");

Eu verifiquei no navegador Chrome que me dá:

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM

Não. Basta ler os documentos. "Se definido como 0 ou omitido, o cookie expirará no final da sessão (quando o navegador fechar)."
DrLightman 5/01

@DrLightman Obrigado por sua participação. Você pode citar a documentação?
Amir Fo

function.setcookie.php , expira o parâmetro. "Se definido como 0 ou omitido, o cookie expirará no final da sessão (quando o navegador fechar)."
DrLightman 6/01

1

Basta definir o valor do cookie para false, para desmarcá-lo,

setcookie('cookiename', false);

PS: - Essa é a maneira mais fácil de fazer isso.


-1

Você precisa excluir os cookies com php no servidor e também com js no navegador. (Eles foram criados com php, mas os arquivos de cookies também estão no cliente do navegador):

Um exemplo:

if ($_GET['action'] == 'exit'){
            // delete cookies with js and then in server with php:
            echo '
            <script type="text/javascript">
                var delete_cookie = function(name) {
                     document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                };
                delete_cookie("madw");
                delete_cookie("usdw");
            </script>
            ';
unset($_COOKIE['cookie_name']);
unset($_COOKIE['cookie_time']);

Você não precisa de JavaScript para definir / excluir o valor do cookie. A função php setcookie vai fazer isso por você php.net/manual/en/function.setcookie.php
Michael Khalili

-5

Muitos de vocês estão esquecendo que isso só funcionará em uma máquina local. Em um domínio, você precisará de um padrão como este exemplo.

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);

1
O parâmetro domain significará o domínio atual se for omitido.
DustWolf

Eu quis dizer que sua resposta está incorreta. Funcionará para qualquer domínio, não apenas para a máquina local, pois usará automaticamente o domínio atual. E seu comentário significa dizer que você está ofendido ou algo assim?
DustWolf 8/08

Você está lendo o texto fornecido acima do código? pare de me incomodar, estou trabalhando. Eu terminei de falar com você.
Peter Gruppelaar

Não entendo por que você fica irritado com outros usuários se eles apontam um erro na sua resposta. setcookiefunciona para qualquer domínio, localhost ou não.
xorinzor

Então, se todo mundo diz que é esse o caso ... então deve haver algo obviamente errado com a minha resposta ... não importa o chapéu que foi apontado neste post? ... você só quer algum tipo de resposta de direção e ignore qualquer usuário global que esteja trabalhando em uma situação semelhante ... entendi ... pare de me incomodar, minha resposta não está errada.
Peter Gruppelaar 01/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.