Eliminar una cookie

260

Cuando quiero eliminar una cookie, intento

unset($_COOKIE['hello']);

Veo en mi navegador de cookies de firefox que la cookie todavía existe. ¿Cómo puedo realmente eliminar la cookie?

lijadoras
fuente
Usted puede encontrar $cookie->delete()a partir github.com/delight-im/PHP-Cookie útil. El código de la pregunta simplemente elimina la propiedad que se ha analizado en el lado del servidor. La cookie seguirá viva en el lado del cliente.
grazna el

Respuestas:

280

Puedes probar esto

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}
Nikunj K.
fuente
141
Entiendo que este es un ejemplo, pero nunca almacene el nombre de usuario o la contraseña en las cookies.
tamasd
3
No tiene sentido unset($_COOKIE['Hello']);. No cambia nada si lo elimina.
Machineaddict
30
@machineaddict unset($_COOKIE['Hello']);es realmente importante si puede verificar la cookie en algún lugar más adelante en el código.
Andreas Hultgren
44
funciona bien pero cuando intenta volver a cargar la página. vio la cookie establecida con datos antiguos ¿por qué?
Nilesh patel
9
======= NO FUNCIONA EN CHROME ======= Intenté este código hoy y cuando accedo al sitio usando google chrome, y luego entro en herramientas de desarrollador en chrome, puedo ver que el tiempo de caducidad se establece en 1 segundo antes de la época (por ejemplo, 1969-12-31 23:59:59), sin embargo, la próxima vez que envíe la página, la cookie se enviará al servidor. Cuando cambié el -1 a 1 (por ejemplo, 1970-01-01 00:00:01) para dar el siguiente comando: setcookie ('Hola', nulo, 1, '/'); luego Chrome actuó como se esperaba y no envió la cookie
Peter Hinds,
284

Establezca el valor en "" y la fecha de caducidad como ayer (o cualquier fecha anterior)

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

Luego, la cookie caducará la próxima vez que se cargue la página.

Re0sless
fuente
10
¿Qué tal establecer el tiempo a 0 (la época)? =]
extraño
12
Si pone una fecha demasiado lejana en el pasado, IE la ladrará y la quemará, es decir, el valor no se eliminará.
Julien el
52
@strager El manual dice: si se establece en 0 o se omite, la cookie caducará al final de la sesión (cuando el navegador se cierre). Eso no es realmente eliminar la cookie. Realmente no sé si IE hará lo que dijo Julien, pero es más que posible que IE haga algo extraño.
Yannis
31
Además, no olvide desarmar también ($ _ COOKIE ["hola"]), porque si hay código en el resto de la página que mira $ _COOKIE ["hola"], todavía lo encontrará establecido. Acabo de ser mordido por este.
Magmatic
12
Además, es una buena idea establecer el camino, entonces setcookie ('hola', '', time () - 3600, '/');
Stephan Weinhold
227

Una forma limpia de eliminar una cookie es borrar tanto el $_COOKIEvalor como el archivo de cookies del navegador:

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}
Mouloud
fuente
3
¡Este es el mejor método, porque no necesita actualizar la página!
MaxV
19
Sigo bajando la página y las respuestas siguen mejorando, divertido. Pero este es el mejor, deja de mirar aquí.
Andrew
23
Para su información, si configura la cookie utilizando una ruta, también deberá incluir la ruta en esta setcookiellamada:setcookie('key', '', time() - 3600, '/');
Gavin
1
@Gavin Gracias por ese consejo. Me preguntaba por qué no se borraba, pero sí con unsettingéxito.
stinkysGTI
1
Para cualquier persona que esté verificando la existencia de una cookie y se preocupe por las cookies que existen con nullvalores, deberá usar array_key_exists () , ya que una cookie con un nullvalor no será encontrada por un isset()cheque.
Leith
27

Para eliminar una cookie de manera confiable, no es suficiente configurarla para que caduque en cualquier momento en el pasado, como lo calculó su servidor PHP. Esto se debe a que las computadoras cliente pueden tener, y a menudo tienen, tiempos que difieren de los de su servidor.

La mejor práctica es sobrescribir la cookie actual con una cookie en blanco que caduque un segundo en el futuro después de la época (1 de enero de 1970 00:00:00 UTC), de la siguiente manera:

setcookie("hello", "", 1);
Thejoker123
fuente
13
Corrígeme si me equivoco, pero establecer eso en "1" lo establecería en un segundo después de la época, ¿no un segundo en el futuro ...? Sin embargo, creo que tiene razón sobre las diferencias de zona horaria, por lo que la mejor solución sería establecerlo en 2 días en el pasado (por lo que incluso la zona horaria más lejana aún desarmaría la cookie).
PaulSkinner
@PaulSkinner la fecha de la época es independiente de las zonas horarias, la computadora hace ese cálculo por usted.
AlexR
3
@AlexR Sí. Aunque realmente no responde mi punto. A mi entender, el código anterior no establece la cookie expira en el pasado (un segundo más allá de la época), si no me engaño.
PaulSkinner
@PaulSkinner, por supuesto, el resto de tu comentario está perfectamente bien.
AlexR
9
+1 para el "1". No entiendo por qué todos los demás están tan obsesionados con configurar una cookie eliminada exactamente una hora antes.
Meisner
20

Eso deshabilitará la cookie en su código, pero como la variable $ _COOKIE se actualiza en cada solicitud, volverá a aparecer en la siguiente solicitud de página.

Para deshacerse de la cookie, establezca la fecha de vencimiento en el pasado:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);
Eric Petroelje
fuente
1
¿No hay ninguna necesidad de unset()la cookie?
Pratik
2
@PratikCJoshi Solo si su código lo busca más adelante.
AlphaMycelium
14

Tuve el mismo problema en mi código y descubrí que era un problema de ruta de cookies. Echa un vistazo a esta publicación de desbordamiento de pila: no se puede eliminar la cookie set php

Había configurado la cookie usando un valor de ruta de "/", pero no tenía ningún valor de ruta cuando intenté borrarla, por lo que no se borró. Así que aquí hay un ejemplo de lo que funcionó:

Configuración de la cookie:

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

Borrar la cookie:

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

Espero que ayude.

usuario3285097
fuente
7

Vea la muestra etiquetada " Ejemplo # 2 setcookie () delete example " de los documentos PHP. Para borrar una cookie del navegador, debe decirle al navegador que la cookie ha caducado ... el navegador la eliminará. unsetcomo lo ha usado, solo elimina la cookie 'hola' de la matriz COOKIE.

Jarret Hardie
fuente
7

Así es como funciona el código PHP v7 setcookie () cuando lo haces:

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

Desde la salida de tcpdump mientras olfatea en el puerto 80, el servidor envía al cliente (navegador) los siguientes encabezados 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

Al observar los paquetes en las siguientes solicitudes, el navegador ya no envía estas cookies en los encabezados

Nulik
fuente
4

Para eliminar la cookie solo necesita establecer el valor en NULL:

"Si ha configurado una cookie con valores no predeterminados para un tiempo de vencimiento, ruta o dominio, debe proporcionar esos mismos valores nuevamente cuando elimine la cookie para que la cookie se elimine correctamente". Cita del libro "Learning PHP5".

Entonces este código debería funcionar (funciona para mí):

Configuración de la cookie: setcookie('foo', 'bar', time() + 60 * 5);

Eliminar la cookie: setcookie('foo', '', time() + 60 * 5);

Pero me di cuenta de que todo el mundo está fijando la fecha de vencimiento como pasada, ¿es necesario y por qué?

boksa
fuente
1
Es confiable, por eso. Una combinación de establecer el valor en nada y un tiempo en el pasado (pero no demasiado lejos ya que a veces a IE no le gusta demasiado de lo que he leído) funciona en todos los ámbitos.
PaulSkinner
La cadena vacía ''no es lo mismo que null.
orev
3

Para eliminar todas las cookies, puede escribir:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}
Ralphe Samson
fuente
3
En realidad, esto no eliminará las cookies a menos que tengan la misma ruta y la misma configuración de dominio que los valores predeterminados de setcookie.
Noishe
2

Simplemente configure la fecha de vencimiento a una hora atrás, si desea "eliminar" la cookie, de esta manera:

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

o

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

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

Debe usar la filter_input()función para todos los globales que un visitante puede ingresar / manipular, de esta manera:

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

Puede leer más sobre esto aquí: http://www.php.net/manual/en/function.filter-input.php y aquí: http://www.w3schools.com/php/func_filter_input.asp

Jo Smo
fuente
2

Sé que ha pasado mucho tiempo desde que se creó este tema, pero vi un pequeño error en esta solución (puedo llamarlo así, porque es un detalle). Estoy de acuerdo en que la mejor solución es probablemente esta solución:

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

Pero, en el presente caso, elimina las cookies en todos los casos en que funciona la función no establecida e inmediatamente crea nuevas cookies caducadas en caso de que la función no establecida no funcione.

Eso significa que, incluso si la función de desactivación funciona, seguirá teniendo 2 cookies en la computadora. El objetivo solicitado, en un punto de vista lógico, es eliminar las cookies si es posible y si realmente no lo es, hacer que caduque; para obtener el resultado "más limpio".

Entonces, creo que mejor deberíamos hacer:

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

Gracias y que tenga un buen día :)

Greg
fuente
La función no establecida está pensada para la lógica de PHP (si desea utilizar la variable $ _COOKIE ['Hola'], no puede, ya que no está establecida). Y la función setcookie está pensada para el navegador. 2 propósitos diferentes, el orden de las funciones no tiene impacto en el código real.
Kalzem
De hecho, lo sabía, pero si quieres estar seguro de que la cookie ha sido desarmada / eliminada y usas las dos soluciones de inmediato, sería más claro antes de que expiren estas tesis y luego desarmarlas que desarmarlas. luego recrear una cookie caducada ... si ves lo que quiero decir?
Greg
Sí, lo siento, respondí hace un momento :) Lo envié porque había visto a personas hacerlo de otra manera ... pero parece más inteligente así, creo.
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.
Sumudu Sahan Weerasuriya
fuente
2

Si desea eliminar la cookie por completo de todo su dominio actual, entonces el siguiente código definitivamente lo ayudará.

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

Este código eliminará la variable de cookies por completo de todo su dominio, es decir; "/": indica que el valor de la variable de cookie está configurado para todos los dominios, no solo para el dominio o ruta actual. time (): 300 indica que se establece en un tiempo anterior, por lo que caducará.

Así es como se elimina perfectamente.

Soumen Pasari
fuente
1

Puede establecer una variable de sesión basada en valores de cookies

session_start();

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

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

Simplemente puede usar esta función de personalización:

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

Si desea eliminar $ _COOKIE ['user_account'].
Solo usa:

unset_cookie('user_account');
Kenny
fuente
1

¡Es sencillo!

setcookie("cookiename", "cookievalue", 1);
LF
fuente
¡No es necesario establecer el valor para eliminar una cookie!
Amir Fo
1

Cuando ingresas 0por tiempo, te refieres a "ahora" (+ 0s desde ahora es en realidad ahora) para el navegador y elimina la cookie.

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

Lo revisé en el navegador Chrome que me da:

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM
Amir Fo
fuente
No. Solo lee los documentos. "Si se establece en 0 o se omite, la cookie caducará al final de la sesión (cuando el navegador se cierre)".
DrLightman
@DrLightman Gracias por su asistencia. ¿Puede por favor citar la documentación?
Amir Fo
function.setcookie.php , caduca el parámetro. "Si se establece en 0 o se omite, la cookie caducará al final de la sesión (cuando el navegador se cierre)".
DrLightman
1

Simplemente configure el valor de cookie falseen para desarmarlo,

setcookie('cookiename', false);

PD: - Esa es la forma más fácil de hacerlo.

Comerciante Amit
fuente
-1

Debe eliminar las cookies con php en su servidor y también con js para su navegador ... (Se han hecho con php, pero los archivos de cookies también están en el cliente del navegador):

Un ejemplo:

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']);
Poncho_333
fuente
No necesita JavaScript para establecer / eliminar el valor de la cookie. La función php setcookie lo hará por usted php.net/manual/en/function.setcookie.php
Michael Khalili
-5

La mayoría de ustedes olvida que esto solo funcionará en una máquina local. En un dominio necesitará un patrón como este ejemplo.

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);
Peter Gruppelaar
fuente
1
El parámetro de dominio significará el dominio actual si se omite.
DustWolf
Quise decir que tu respuesta es incorrecta. Funcionará para cualquier dominio, no solo para la máquina local, ya que usará automáticamente el dominio actual. ¿Y tu comentario significa decir que estás ofendido o algo así?
DustWolf
¿Estás leyendo el texto que se encuentra arriba del código? deja de molestarme, estoy trabajando. Ya terminé de hablar contigo.
Peter Gruppelaar
No entiendo por qué te molestas con otros usuarios si señalan un error en tu respuesta. setcookiefunciona para cualquier dominio, localhost o no.
xorinzor
Entonces, si todo el mundo dice, ese es el caso ... entonces debe haber algo obviamente incorrecto con mi respuesta ... el hecho que se ha señalado en esta publicación no importa ... solo quieres algún tipo de respuesta de dirección e ignoro a cualquier usuario global que esté trabajando en una situación simular ... lo entiendo ... deja de molestarme, mi respuesta no es incorrecta.
Peter Gruppelaar