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.