Rimuovi un cookie


260

Quando voglio rimuovere un cookie, provo

unset($_COOKIE['hello']);

Vedo nel mio browser dei cookie di Firefox che il cookie esiste ancora. Come posso veramente rimuovere il cookie?


Si possono trovare $cookie->delete()da github.com/delight-im/PHP-Cookie utile. Il codice dalla domanda elimina solo la proprietà che è stata analizzata sul lato server. Il cookie continuerà a vivere sul lato client.
Caw

Risposte:


280

Puoi provare questo

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

141
Comprendo che questo è un esempio, ma per favore non archiviare mai nome utente o password nei cookie.
tamasd,

3
È inutile unset($_COOKIE['Hello']);. Non cambia nulla se lo rimuovi.
machineaddict

30
@machineaddict unset($_COOKIE['Hello']);è in realtà importante se è possibile controllare il cookie da qualche parte nel codice.
Andreas Hultgren,

4
funziona bene ma quando prova a ricaricare la pagina. ha visto cookie impostato con vecchi dati perché ?.
Nilesh patel,

9
======= NON FUNZIONA IN CHROME ======= Ho provato questo codice oggi e quando accedo al sito utilizzando Google Chrome, e poi vado negli strumenti di sviluppo in Chrome, posso vedere che il tempo di scadenza è impostato su 1 secondo prima dell'epoca (ad es. 1969-12-31 23:59:59) tuttavia quando inoltro successivamente la pagina il cookie viene inviato al server. Quando ho cambiato -1 in 1 (ad es. 1970-01-01 00:00:01) per dare il seguente comando: setcookie ('Hello', null, 1, '/'); quindi Chrome ha agito come previsto e non ha inviato il cookie
Peter Hinds,

284

Impostare il valore su "" e la data di scadenza su ieri (o qualsiasi data nel passato)

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

Quindi il cookie scadrà al successivo caricamento della pagina.


10
Che ne dici di impostare l'ora su 0 (l'epoca)? =]
strager

12
Se hai messo una data troppo lontano in passato, IE abbaia e la ignora, cioè il valore non verrà rimosso.
Julien,

52
@strager Il manuale afferma: Se impostato su 0 o omesso, il cookie scadrà alla fine della sessione (alla chiusura del browser). Questo non sta davvero cancellando il cookie. Non so davvero se IE farà ciò che Julien ha detto, ma è più che possibile che IE farà qualcosa di strano.
yannis,

31
Inoltre, non dimenticare di annullare effettivamente l'impostazione ($ _ COOKIE ["ciao"]), perché se sul resto della pagina è presente un codice che guarda $ _COOKIE ["ciao"], lo troverà comunque impostato. Mi è appena stato morso questo.
Magmatic,

12
Inoltre è una buona idea impostare il percorso, quindi setcookie ('hello', '', time () - 3600, '/');
Stephan Weinhold, il

227

Un modo chiaro per eliminare un cookie è quello di cancellare sia il $_COOKIEvalore sia il file cookie del browser:

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

3
Questo è il metodo migliore, perché non è necessario aggiornare la pagina!
MaxV,

19
Continuo a scorrere la pagina e le risposte continuano a migliorare, divertenti. Ma questo è il migliore, smetti di cercare qui.
Andrew,

23
Cordiali saluti, se imposti il ​​cookie utilizzando un percorso, dovrai includere anche il percorso in questa setcookiechiamata:setcookie('key', '', time() - 3600, '/');
Gavin

1
@Gavin Grazie per questo suggerimento. Mi chiedevo perché non fosse stato cancellato, ma unsettingcon successo.
stinkysGTI,

1
Per chiunque stia verificando l'esistenza di un cookie e si preoccupi dei cookie che esistono con nullvalori, dovrai invece utilizzare array_key_exists () , poiché un controllo con un nullvalore non verrà trovato da un isset()controllo.
Leith

27

Per eliminare in modo affidabile un cookie non è sufficiente impostarlo in modo che scada in qualsiasi momento nel passato, come calcolato dal tuo server PHP. Questo perché i computer client possono e spesso hanno tempi diversi da quelli del tuo server.

La migliore pratica è quella di sovrascrivere il cookie corrente con un cookie vuoto che scade un secondo in futuro dopo l'epoca (1 gennaio 1970 00:00:00 UTC), in questo modo:

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

13
Correggimi se sbaglio, ma impostandolo su "1" lo imposterebbe su un secondo dopo l'epoca, non un secondo in futuro ..? Ritengo che tu abbia ragione riguardo alle differenze di fuso orario, quindi la soluzione migliore sarebbe quella di impostarlo su 2 giorni in passato (quindi anche il fuso orario più lontano disinserirebbe ancora il cookie).
PaulSkinner,

@PaulSkinner la data dell'epoca è indipendente dai fusi orari, il computer fa quel calcolo per te.
AlexR,

3
@AlexR Sì. In realtà non risponde al mio punto. Per quanto ne so , il codice sopra impostato fa scadere il cookie in passato (un secondo oltre l'epoca), a meno che non mi sbagli.
PaulSkinner,

@PaulSkinner ovviamente, il resto del tuo commento va benissimo.
AlexR,

9
+1 per "1". Non capisco perché tutti gli altri siano così fissati sull'impostazione di un cookie eliminato esattamente un'ora nel passato.
Meisner,

20

Ciò disinserirà il cookie nel codice, ma poiché la variabile $ _COOKIE viene aggiornata su ogni richiesta, tornerà alla richiesta della pagina successiva.

Per eliminare effettivamente il cookie, imposta la data di scadenza in passato:

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

1
Non c'è bisogno unset()del cookie?
Pratik,

2
@PratikCJoshi Solo se il tuo codice lo cercherà in seguito.
AlphaMycelium,

14

Ho avuto lo stesso problema nel mio codice e ho scoperto che si trattava di un problema relativo al percorso dei cookie. Dai un'occhiata a questo post di overflow dello stack: Impossibile eliminare il cookie di php set

Avevo impostato il cookie utilizzando un valore di percorso "/", ma non avevo alcun valore di percorso quando ho provato a cancellarlo, quindi non è stato cancellato. Quindi, ecco un esempio di ciò che ha funzionato:

Impostazione del cookie:

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

Cancellazione del cookie:

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

Spero che aiuti.




7

Ecco come funziona il codice setcookie () di PHP v7 quando si esegue:

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

Dall'output di tcpdump durante lo sniffing sulla porta 80, il server invia al client (Browser) le seguenti intestazioni 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

Osservando i pacchetti nelle seguenti richieste, il Browser non invia più questi cookie nelle intestazioni


4

Per eliminare i cookie è sufficiente impostare il valore su NULL:

"Se hai impostato un cookie con valori non predefiniti per un tempo di scadenza, percorso o dominio, devi fornire nuovamente gli stessi valori quando elimini il cookie affinché il cookie venga eliminato correttamente." Citazione dal libro "Learning PHP5".

Quindi questo codice dovrebbe funzionare (funziona per me):

Impostazione del cookie: setcookie('foo', 'bar', time() + 60 * 5);

Eliminazione del cookie: setcookie('foo', '', time() + 60 * 5);

Ma ho notato che tutti stanno impostando la data di scadenza al passato, è necessario e perché?


1
È affidabile, ecco perché. Una combinazione di impostazione del valore su niente e un tempo nel passato (ma non troppo lontano come IE occasionalmente non piace troppo lontano da quello che ho letto) funziona su tutta la linea.
PaulSkinner,

La stringa vuota ''non è la stessa cosa di null.
orev

3

Per rimuovere tutti i cookie è possibile scrivere:

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

3
Questo in realtà non rimuoverà i cookie a meno che non abbiano lo stesso percorso e le stesse impostazioni del dominio di default su setcookie.
Noishe

2

Basta impostare la data di scadenza a un'ora fa, se si desidera "rimuovere" il cookie, in questo modo:

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

o

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

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

Dovresti usare la filter_input()funzione per tutti i globi che un visitatore può inserire / manipolare, in questo modo:

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

Puoi leggere di più qui: http://www.php.net/manual/en/function.filter-input.php e qui: http://www.w3schools.com/php/func_filter_input.asp


2

So che è passato molto tempo da quando questo argomento è stato creato, ma ho visto un piccolo errore all'interno di questa soluzione (posso chiamarlo così, perché è un dettaglio). Sono d'accordo che la soluzione migliore è probabilmente questa soluzione:

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

Ma, nel caso presente, si eliminano i cookie in tutti i casi in cui la funzione unset funziona e si creano immediatamente nuovi cookie scaduti nel caso in cui la funzione unset non funzioni.

Ciò significa che anche se la funzione unset funziona, avrà comunque 2 cookie sul computer. L'obiettivo richiesto, dal punto di vista logico, è quello di eliminare i cookie se è possibile e, in caso contrario, farli scadere; per ottenere il risultato "più pulito".

Quindi, penso che dovremmo fare meglio:

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

Grazie e buona giornata :)


La funzione unset è pensata per la logica di PHP (se si desidera utilizzare la variabile $ _COOKIE ['Hello'], non è possibile poiché non è impostata). E la funzione setcookie è pensata per il navigatore. 2 scopi diversi, l'ordine delle funzioni non ha alcun impatto sul codice effettivo.
Kalzem,

In effetti, lo sapevo già, ma se vuoi assolutamente essere sicuro che il cookie sia stato disattivato / eliminato e quindi utilizzi le due soluzioni in modo corretto, sarebbe più pulito prima che scadessero le tesi e quindi annullasse le tesi rispetto a quelle non impostate e quindi ricreare un cookie scaduto ... se vedi cosa intendo?
Greg,

Sì, mi dispiace rispondere solo ora :) L'ho inviato perché avevo visto persone farlo nell'altro modo .. ma mi sembra più intelligente del genere.
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 vuoi eliminare completamente il cookie da tutto il tuo dominio attuale, il seguente codice ti aiuterà sicuramente.

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

Questo codice eliminerà completamente la variabile cookie da tutto il tuo dominio; "/" - indica che il valore della variabile cookie è impostato per tutto il dominio non solo per il dominio o il percorso corrente. time () - 300 indica che è impostato su una volta precedente, quindi scadrà.

Ecco come è perfettamente cancellato.


1

È possibile impostare una variabile di sessione in base ai valori dei 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

Puoi semplicemente usare questa funzione di personalizzazione:

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

Se desideri rimuovere $ _COOKIE ['account_utente'].
Usa solo:

unset_cookie('user_account');

1

È semplice!

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

Non è necessario impostare un valore per l'eliminazione di un cookie!
Amir Fo

1

Quando inserisci l' 0ora, intendi "ora" (+ 0s da adesso è in realtà ora) per il browser ed elimina il cookie.

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

L'ho controllato nel browser Chrome che mi 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

No. Hai appena letto i documenti. "Se impostato su 0 o omesso, il cookie scadrà alla fine della sessione (alla chiusura del browser)."
DrLightman,

@DrLightman Grazie per la tua presenza, puoi per favore citare la documentazione?
Amir Fo

function.setcookie.php , scade il parametro. "Se impostato su 0 o omesso, il cookie scadrà alla fine della sessione (alla chiusura del browser)."
DrLightman,

1

Basta impostare il valore di cookie su falseper disinserirlo,

setcookie('cookiename', false);

PS: - Questo è il modo più semplice per farlo.


-1

Devi eliminare i cookie con php nel tuo server e anche con js per il tuo browser .. (Hanno creato con php, ma anche i file dei cookie sono nel client del browser):

Un esempio:

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']);

Non è necessario JavaScript per impostare / eliminare il valore del cookie. La funzione php setcookie lo farà per te php.net/manual/en/function.setcookie.php
Michael Khalili,

-5

Molti di voi dimenticano che funzionerà solo su un computer locale. Su un dominio avrai bisogno di un modello come questo esempio.

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

1
Il parametro domain indica il dominio corrente se viene omesso.
DustWolf il

Intendevo dire che la tua risposta non è corretta. Funzionerà per qualsiasi dominio, non solo per il computer locale, poiché utilizzerà automaticamente il dominio corrente. E il tuo commento significa dire che sei offeso o qualcosa del genere?
DustWolf

Stai addirittura leggendo il testo sopra il codice? smettila di infastidirmi, sto lavorando. ho finito di parlare con te.
Peter Gruppelaar,

Non capisco perché ti arrabbi con gli altri utenti se stanno segnalando un errore nella tua risposta. setcookiefunziona per qualsiasi dominio, sia localhost o meno.
Xorinzor,

Quindi, se tutti dicono, è questo il caso ... allora deve esserci qualcosa di ovviamente sbagliato nella mia risposta ... il cappello fct che è stato sottolineato in questo post non ha importanza? ... vuoi solo un qualche tipo di risposta direzionale e ignora tutti gli utenti globali che stanno lavorando a una situazione simile ... ho capito ... smettila di infastidirmi, la mia risposta non è sbagliata.
Peter Gruppelaar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.