Entfernen Sie einen Cookie


260

Wenn ich ein Cookie entfernen möchte, versuche ich es

unset($_COOKIE['hello']);

Ich sehe in meinem Cookie-Browser von Firefox, dass das Cookie noch vorhanden ist. Wie kann ich den Cookie wirklich entfernen?


Sie können $cookie->delete()von github.com/delight-im/PHP-Cookie hilfreich finden. Der Code aus der Frage löscht nur die Eigenschaft, die auf der Serverseite analysiert wurde. Der Cookie wird weiterhin auf der Client-Seite weitergeführt.
Caw

Antworten:


280

Sie können dies versuchen

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

141
Ich verstehe, dass dies ein Beispiel ist, aber bitte speichern Sie niemals Benutzernamen oder Passwort in Cookies.
Tamasd

3
Es ist sinnlos zu unset($_COOKIE['Hello']);. Es ändert nichts, wenn Sie es entfernen.
Machineaddict

30
@machineaddict unset($_COOKIE['Hello']);ist eigentlich wichtig, wenn Sie das Cookie später im Code überprüfen möchten .
Andreas Hultgren

4
funktioniert gut, aber wenn Sie versuchen, die Seite neu zu laden. es sah Cookie mit alten Daten gesetzt, warum?.
Nilesh Patel

9
======= FUNKTIONIERT NICHT IN CHROM ======= Ich habe diesen Code heute ausprobiert und wenn ich mit Google Chrome auf die Website zugreife und dann in Chrome auf Entwicklertools gehe, kann ich sehen, dass die Ablaufzeit abgelaufen ist wird auf 1 Sekunde vor der Epoche gesetzt (z. B. 1969-12-31 23:59:59). Wenn ich die Seite das nächste Mal sende, wird das Cookie an den Server gesendet. Wenn ich -1 in 1 geändert habe (z. B. 1970-01-01 00:00:01), um den folgenden Befehl zu geben: setcookie ('Hallo', null, 1, '/'); dann handelte Chrome wie erwartet und reichte den Cookie nicht ein
Peter Hinds

284

Setzen Sie den Wert auf "" und das Ablaufdatum auf gestern (oder ein Datum in der Vergangenheit).

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

Dann läuft das Cookie beim nächsten Laden der Seite ab.


10
Wie wäre es, wenn Sie die Zeit auf 0 (die Epoche) setzen? =]
Strager

12
Wenn Sie ein Datum zu weit in die Vergangenheit verschoben haben, bellt der IE und igores es, dh der Wert wird nicht entfernt.
Julien

52
@strager Im Handbuch heißt es: Wenn der Wert auf 0 gesetzt oder weggelassen wird, läuft der Cookie am Ende der Sitzung ab (wenn der Browser geschlossen wird). Das löscht den Cookie nicht wirklich. Ich weiß wirklich nicht, ob der IE das tun wird, was Julien gesagt hat, aber es ist mehr als möglich, dass der IE etwas Seltsames tut.
Yannis

31
Vergessen Sie auch nicht, das Kontrollkästchen zu deaktivieren ($ _ COOKIE ["Hallo"]), denn wenn auf der restlichen Seite Code vorhanden ist, der sich mit $ _COOKIE ["Hallo"] befasst, wird es immer noch gesetzt. Ich bin gerade von diesem gebissen worden.
Magmatisch

12
Außerdem ist es eine gute Idee, den Pfad festzulegen, also setcookie ('Hallo', '', Zeit () - 3600, '/');
Stephan Weinhold

226

Eine saubere Möglichkeit, ein Cookie zu löschen, besteht darin, sowohl den $_COOKIEWert als auch die Browser-Cookie-Datei zu löschen :

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

3
Dies ist die beste Methode, da Sie die Seite nicht aktualisieren müssen!
MaxV

19
Ich gehe die Seite weiter durch und die Antworten werden immer besser, lustig. Aber das ist das Beste, hör auf hier zu suchen.
Andrew

23
Zu Ihrer Information, wenn Sie das Cookie über einen Pfad setzen, müssen Sie den Pfad auch in diesen setcookieAufruf aufnehmen:setcookie('key', '', time() - 3600, '/');
Gavin

1
@ Gavin Danke für diesen Tipp. Ich habe mich gefragt, warum es nicht gelöscht wurde, aber unsettingerfolgreich war.
stinkysGTI

1
Für alle, die die Existenz eines Cookies überprüfen und sich um Cookies kümmern , die mit nullWerten vorhanden sind, müssen Sie stattdessen array_key_exists () verwenden, da ein Cookie mit einem nullWert durch eine isset()Prüfung nicht gefunden wird .
Leith

27

Um ein Cookie zuverlässig zu löschen, reicht es nicht aus, es so einzustellen, dass es in der Vergangenheit jederzeit abläuft, wie von Ihrem PHP-Server berechnet. Dies liegt daran, dass Client-Computer Zeiten haben können und oft haben, die von denen Ihres Servers abweichen.

Die beste Vorgehensweise ist es, das aktuelle Cookie mit einem leeren Cookie zu überschreiben , die 1 Sekunde abläuft in der Zukunft nach der Epoche (1. Januar 1970 00.00.00 UTC), wie so:

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

13
Korrigieren Sie mich, wenn ich falsch liege, aber wenn Sie das auf "1" setzen, wird es auf eine Sekunde nach der Epoche gesetzt, nicht auf eine Sekunde in der Zukunft. Ich glaube, Sie haben Recht mit den Zeitzonenunterschieden. Die beste Lösung wäre es, sie auf 2 Tage in der Vergangenheit einzustellen (sodass selbst die am weitesten entfernte Zeitzone den Cookie immer noch deaktivieren würde).
PaulSkinner

@PaulSkinner Das Epochendatum ist unabhängig von Zeitzonen. Der Computer führt diese Berechnung für Sie durch.
AlexR

3
@AlexR Ja. Beantwortet meinen Punkt allerdings nicht wirklich. Zu meinem Verständnis, der obigen Code wird das Cookie gesetzt in der Vergangenheit (eine Sekunde hinter der Epoche) verfallen, wenn ich nicht irre.
PaulSkinner

@ PaulSkinner natürlich, der Rest Ihres Kommentars ist vollkommen in Ordnung.
AlexR

9
+1 für die "1". Ich verstehe nicht, warum alle anderen so darauf fixiert sind, einen gelöschten Cookie genau eine Stunde in der Vergangenheit zu setzen.
Meisner

20

Dadurch wird das Cookie in Ihrem Code deaktiviert. Da die Variable $ _COOKIE jedoch bei jeder Anforderung aktualisiert wird, wird sie bei der Anforderung auf der nächsten Seite erneut angezeigt.

Legen Sie das Ablaufdatum in der Vergangenheit fest, um das Cookie tatsächlich zu entfernen:

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

1
Muss unset()der Cookie nicht gebraucht werden?
Pratik

2
@PratikCJoshi Nur wenn Ihr Code später danach sucht.
AlphaMycelium

14

Ich hatte das gleiche Problem in meinem Code und stellte fest, dass es sich um ein Problem mit dem Cookie-Pfad handelte. Schauen Sie sich diesen Beitrag zum Stapelüberlauf an: PHP-Set-Cookie kann nicht gelöscht werden

Ich hatte das Cookie mit dem Pfadwert "/" gesetzt, hatte aber keinen Pfadwert, als ich versuchte, es zu löschen, sodass es nicht gelöscht wurde. Hier ist ein Beispiel dafür, was funktioniert hat:

Cookie setzen:

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

Cookie löschen:

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

Hoffentlich hilft das.



7

Siehe das Beispiel mit der Bezeichnung " Beispiel # 2 setcookie () delete example " aus den PHP-Dokumenten. Um ein Cookie aus dem Browser zu löschen, müssen Sie dem Browser mitteilen, dass das Cookie abgelaufen ist. Der Browser entfernt es dann. unsetWenn Sie es verwendet haben, wird nur das Hallo-Cookie aus dem COOKIE-Array entfernt.


7

So funktioniert PHP v7 setcookie () Code, wenn Sie Folgendes tun:

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

Aus der Ausgabe von tcpdump sendet der Server beim Sniffing an Port 80 die folgenden HTTP-Header an den Client (Browser):

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

Wenn der Browser Pakete in den folgenden Anforderungen beobachtet, sendet er diese Cookies nicht mehr in den Headern


4

Um ein Cookie zu löschen, müssen Sie nur den Wert auf NULL setzen:

"Wenn Sie ein Cookie mit nicht standardmäßigen Werten für eine Ablaufzeit, einen Pfad oder eine Domäne festgelegt haben, müssen Sie diese Werte erneut angeben, wenn Sie das Cookie löschen, damit das Cookie ordnungsgemäß gelöscht wird." Zitat aus dem Buch "Learning PHP5".

Dieser Code sollte also funktionieren (funktioniert für mich):

Cookie setzen: setcookie('foo', 'bar', time() + 60 * 5);

Cookie löschen: setcookie('foo', '', time() + 60 * 5);

Aber ich habe bemerkt, dass jeder das Ablaufdatum auf Vergangenheit setzt, ist das notwendig und warum?


1
Es ist zuverlässig, deshalb. Eine Kombination aus dem Setzen des Werts auf nichts und einer Zeit in der Vergangenheit (aber nicht zu weit, da der IE ihn gelegentlich nicht zu weit von dem entfernt mag, was ich gelesen habe) funktioniert auf der ganzen Linie.
PaulSkinner

Die leere Zeichenfolge ''ist nicht dasselbe wie null.
Orev

3

So entfernen Sie alle Cookies, die Sie schreiben könnten:

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

3
Dadurch werden die Cookies nur entfernt, wenn sie dieselben Pfad- und Domäneneinstellungen wie die Standardeinstellungen von setcookie haben.
Noishe

2

Stellen Sie einfach das Ablaufdatum auf vor einer Stunde ein, wenn Sie das Cookie wie folgt "entfernen" möchten:

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

oder

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

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

Sie sollten die filter_input()Funktion für alle Globals verwenden, die ein Besucher eingeben / bearbeiten kann, wie folgt:

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

Weitere Informationen finden Sie hier: http://www.php.net/manual/en/function.filter-input.php und hier: http://www.w3schools.com/php/func_filter_input.asp


2

Ich weiß, dass es lange her ist, dass dieses Thema erstellt wurde, aber ich habe einen kleinen Fehler in dieser Lösung gesehen (ich kann es so nennen, weil es ein Detail ist). Ich stimme zu, dass die bessere Lösung wahrscheinlich diese Lösung ist:

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

Im vorliegenden Fall löschen Sie die Cookies jedoch in jedem Fall, in dem die nicht gesetzte Funktion funktioniert, und erstellen sofort neue abgelaufene Cookies, falls die nicht gesetzte Funktion nicht funktioniert.

Das bedeutet, dass selbst wenn die nicht gesetzte Funktion funktioniert, immer noch 2 Cookies auf dem Computer vorhanden sind. Das geforderte Ziel besteht aus logischer Sicht darin, die Cookies zu löschen, wenn dies möglich ist, und wenn dies wirklich nicht der Fall ist, lassen Sie sie ablaufen. um "das sauberste" Ergebnis zu erhalten.

Ich denke, wir sollten es besser machen:

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

Danke und einen schönen Tag :)


Die Funktion unset ist für die PHP-Logik gedacht (wenn Sie die Variable $ _COOKIE ['Hello'] verwenden möchten, können Sie dies nicht, da sie nicht gesetzt ist). Und die Funktion setcookie ist für den Navigator gedacht. Aus verschiedenen Gründen hat die Reihenfolge der Funktionen keinen Einfluss auf den tatsächlichen Code.
Kalzem

Tatsächlich wusste ich es ja, aber wenn Sie unbedingt sicher sein möchten, dass das Cookie nicht gesetzt / gelöscht wurde und Sie die beiden Lösungen direkt verwenden, wäre es sauberer, bevor Sie diese verfallen lassen und dann diese als nicht gesetzte Thesen und nicht setzen Erstellen Sie dann ein abgelaufenes Cookie neu ... wenn Sie sehen, was ich meine?
Greg

Ja, tut mir leid, dass ich gerade geantwortet habe :) Ich habe es gesendet, weil ich Leute gesehen habe, die es auf die andere Weise gemacht haben. Aber es scheint so klüger zu sein, denke ich.
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

Wenn Sie das Cookie vollständig aus Ihrer gesamten aktuellen Domain löschen möchten, hilft Ihnen der folgende Code auf jeden Fall.

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

Dieser Code löscht die Cookie-Variable vollständig aus Ihrer gesamten Domain, dh; "/" - Gibt an, dass der Wert der Cookie-Variablen für alle Domänen festgelegt wurde, nicht nur für die aktuelle Domäne oder den aktuellen Pfad. time () - 300 bedeutet, dass es auf eine vorherige Zeit eingestellt ist, sodass es abläuft.

So wird es perfekt gelöscht.


1

Sie können eine Sitzungsvariable basierend auf Cookie-Werten festlegen

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

Sie können einfach diese Anpassungsfunktion verwenden:

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

Wenn Sie $ _COOKIE ['user_account'] entfernen möchten.
Benutz einfach:

unset_cookie('user_account');

1

Es ist einfach!

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

Es ist nicht erforderlich, einen Wert für das Löschen eines Cookies festzulegen!
Amir Fo

1

Wenn Sie 0für die Zeit eingeben , meinen Sie "jetzt" (+ 0s von jetzt ist eigentlich jetzt) ​​für den Browser und es löscht das Cookie.

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

Ich habe es im Chrome-Browser überprüft, der mir Folgendes gibt:

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

Lesen Sie einfach die Dokumente. "Wenn auf 0 gesetzt oder weggelassen, läuft das Cookie am Ende der Sitzung ab (wenn der Browser geschlossen wird)."
DrLightman

@ DrLightman Vielen Dank für Ihre Teilnahme. Können Sie bitte die Dokumentation zitieren?
Amir Fo

function.setcookie.php , Parameter läuft ab . "Wenn auf 0 gesetzt oder weggelassen, läuft das Cookie am Ende der Sitzung ab (wenn der Browser geschlossen wird)."
DrLightman

1

Setzen Sie einfach den Wert des Cookies auf, falseum ihn zu deaktivieren.

setcookie('cookiename', false);

PS: - Das ist der einfachste Weg.


-1

Sie müssen Cookies mit PHP auf Ihrem Server und auch mit JS für Ihren Browser löschen. (Sie haben mit PHP erstellt, aber Cookie-Dateien befinden sich auch im Browser-Client.):

Ein Beispiel:

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

Sie benötigen kein JavaScript, um den Cookie-Wert festzulegen / zu löschen. Die PHP-Funktion setcookie erledigt das für Sie php.net/manual/en/function.setcookie.php
Michael Khalili

-5

Die meisten von Ihnen vergessen, dass dies nur auf einem lokalen Computer funktioniert. Für eine Domain benötigen Sie ein Muster wie dieses Beispiel.

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

1
Der Domänenparameter bezeichnet die aktuelle Domäne, wenn sie weggelassen wird.
DustWolf

Ich wollte damit sagen, dass Ihre Antwort falsch ist. Es funktioniert für jede Domäne, nicht nur für den lokalen Computer, da automatisch die aktuelle Domäne verwendet wird. Und dein Kommentar bedeutet zu sagen, dass du beleidigt bist oder so?
DustWolf

Lesen Sie überhaupt den Text, der über dem Code steht? Hör auf mich zu nerven, ich arbeite. Ich bin fertig mit dir zu reden.
Peter Gruppelaar

Ich verstehe nicht, warum Sie sich über andere Benutzer ärgern, wenn diese auf einen Fehler in Ihrer Antwort hinweisen. setcookiefunktioniert für jede Domain, egal ob localhost oder nicht.
Xorinzor

Wenn also alle sagen, dass dies der Fall ist ... dann muss etwas offensichtlich falsch mit meiner Antwort sein ... der fct-Hut, auf den in diesem Beitrag hingewiesen wurde, spielt keine Rolle? ... Sie möchten nur eine Art Richtungsantwort und ignoriere alle globalen Benutzer, die an einer ähnlichen Situation arbeiten ... ich verstehe ... hör auf mich zu nerven, meine Antwort ist nicht falsch.
Peter Gruppelaar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.