Może się okazać, $cookie->delete()ze github.com/delight-im/PHP-Cookie pomocny. Kod z pytania po prostu usuwa właściwość, która została przeanalizowana po stronie serwera. Plik cookie będzie nadal dostępny po stronie klienta.
Rozumiem, że jest to przykład, ale nigdy nie przechowuj nazwy użytkownika ani hasła w plikach cookie.
tamasd
3
To bez sensu unset($_COOKIE['Hello']);. Nic nie zmieni, jeśli go usuniesz.
machineaddict
30
@machineaddict unset($_COOKIE['Hello']);jest naprawdę ważne, jeśli możesz sprawdzić plik cookie gdzieś później w kodzie.
Andreas Hultgren
4
działa dobrze, ale gdy próbuję ponownie załadować stronę. zobaczył zestaw plików cookie ze starymi danymi dlaczego ?.
Nilesh patel
9
======= NIE DZIAŁA W CHROME ======= Wypróbowałem dzisiaj ten kod, a kiedy wchodzę na stronę za pomocą Google Chrome, a następnie wchodzę do narzędzi programistycznych w Chrome, widzę, że wygasa jest ustawiony na 1 sekundę przed epoką (np. 1969-12-31 23:59:59), jednak kiedy następnym razem przesyłam stronę, plik cookie jest przesyłany na serwer. Kiedy zmieniłem wartość -1 na 1 (np. 1970-01-01 00:00:01), aby wydać następującą komendę: setcookie ('Hello', null, 1, '/'); następnie Chrome działał zgodnie z oczekiwaniami i nie przesłał ciasteczka
Peter Hinds
284
Ustaw wartość na „”, a datę wygaśnięcia na wczoraj (lub dowolną datę z przeszłości)
setcookie("hello","", time()-3600);
Następnie plik cookie wygaśnie przy następnym ładowaniu strony.
Jeśli umieścisz datę zbyt daleko w przeszłości, IE ją zaszczeka i zignoruje, tzn. Wartość nie zostanie usunięta.
Julien
52
@strager W instrukcji podano : Jeśli zostanie ustawiony na 0 lub pominięty, plik cookie wygaśnie pod koniec sesji (po zamknięciu przeglądarki). To tak naprawdę nie usuwa pliku cookie. Naprawdę nie wiem, czy IE zrobi to, co powiedział Julien, ale jest więcej niż możliwe, że IE zrobi coś dziwnego.
yannis
31
Nie zapomnij też zresetować ($ _ COOKIE [„cześć”])), ponieważ jeśli na reszcie strony znajduje się kod, który wygląda na $ _COOKIE [„cześć”], nadal będzie ustawiony. Właśnie mnie to ugryzło.
Magmatic,
12
Ponadto dobrym pomysłem jest ustawienie ścieżki, więc setcookie ('hello', '', time () - 3600, '/');
Stephan Weinhold
226
Prostym sposobem na usunięcie pliku cookie jest wyczyszczenie zarówno $_COOKIEpliku wartości, jak i pliku cookie przeglądarki:
if(isset($_COOKIE['key'])){
unset($_COOKIE['key']);
setcookie('key','', time()-3600,'/');// empty value and old timestamp}
To najlepsza metoda, ponieważ nie musisz odświeżać strony!
MaxV
19
Ciągle przeglądam stronę, a odpowiedzi stają się coraz lepsze, zabawne. Ale to jest najlepsze, przestań szukać tutaj.
Andrew
23
Do Twojej wiadomości, jeśli ustawisz ciasteczko przy użyciu ścieżki, musisz również dołączyć ścieżkę do tego setcookiewywołania:setcookie('key', '', time() - 3600, '/');
Gavin
1
@Gavin Dzięki za tę wskazówkę. Zastanawiałem się, dlaczego nie zostało usunięte, ale unsettingudało się.
stinkysGTI
1
Dla każdego, kto sprawdza istnienie pliku cookie i dba o pliki cookie, które istnieją z nullwartościami, należy zamiast tego użyć array_key_exists () , ponieważ plik cookie z nullwartością nie zostanie znaleziony przez isset()czek.
Leith,
27
Aby niezawodnie usunąć plik cookie, nie wystarczy ustawić, aby wygasł w dowolnym momencie w przeszłości, zgodnie z obliczeniami serwera PHP. Wynika to z faktu, że komputery klienckie mogą i często mają czasy inne niż czasy twojego serwera.
Najlepszym rozwiązaniem jest, aby zastąpić bieżący plik cookie z pustego pliku cookie, który wygasa jedną sekundę w przyszłości po epoce (1 stycznia 1970 00:00:00 UTC), a więc:
Popraw mnie, jeśli się mylę, ale ustawienie tego na „1” ustawiłoby go na sekundę po epoce, a nie na sekundę w przyszłości ..? Uważam, że masz rację co do różnic stref czasowych, więc najlepszym rozwiązaniem byłoby ustawienie go na 2 dni w przeszłości (tak więc nawet najdalej oddalona strefa czasowa nadal rozbroiłaby ciasteczko).
PaulSkinner
@PaulSkinner data epoki jest niezależna od stref czasowych, komputer wykonuje to obliczenie za Ciebie.
AlexR
3
@AlexR Tak. Ale tak naprawdę nie odpowiada na mój punkt. W moim rozumieniu powyższy kod powoduje, że plik cookie wygasa w przeszłości (jedna sekunda po epoce), chyba że się mylę.
PaulSkinner
@PaulSkinner oczywiście, cała reszta twojego komentarza jest w porządku.
AlexR
9
+1 za „1”. Nie rozumiem, dlaczego wszyscy inni tak bardzo skupiają się na ustawianiu usuniętego pliku cookie dokładnie godzinę wcześniej.
Meisner
20
Spowoduje to rozbrojenie pliku cookie w kodzie, ale ponieważ zmienna $ _COOKIE jest odświeżana przy każdym żądaniu, po prostu wróci do żądania na następnej stronie.
Aby faktycznie pozbyć się ciasteczka, ustaw datę ważności w przeszłości:
// set the expiration date to one hour ago
setcookie("hello","", time()-3600);
@PratikCJoshi Tylko jeśli Twój kod będzie go później szukał.
AlphaMycelium
14
Miałem ten sam problem w kodzie i stwierdziłem, że był to problem ze ścieżką pliku cookie. Sprawdź ten post przepełnienia stosu: Nie można usunąć pliku cookie zestawu php
Ustawiłem ciasteczko przy użyciu wartości ścieżki „/”, ale nie miałem żadnej wartości ścieżki, gdy próbowałem go wyczyścić, więc nie wyczyściło się. Oto przykład tego, co zadziałało:
Ustawienie ciasteczka:
$cookiePath ="/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);
Zobacz przykład z etykietą „ Przykład # 2 przykład usuwania setcookie () ” z dokumentacji PHP. Aby usunąć plik cookie z przeglądarki, musisz poinformować przeglądarkę, że plik cookie wygasł ... przeglądarka usunie go. unsetpo jego użyciu po prostu usuwa ciasteczko „hello” z tablicy COOKIE.
Aby usunąć plik cookie, wystarczy ustawić wartość NULL:
„Jeśli ustawiłeś plik cookie z wartościami domyślnymi dla czasu wygaśnięcia, ścieżki lub domeny, musisz podać te same wartości ponownie po usunięciu pliku cookie, aby plik cookie został poprawnie usunięty”. Cytat z książki „Nauka PHP5”.
Jest niezawodny, dlatego. Kombinacja ustawienia wartości na nic i czasu w przeszłości (ale nie za daleko, ponieważ IE czasami nie lubi tego zbyt daleko od tego, co przeczytałem) działa ogólnie.
PaulSkinner,
Pusty ciąg ''nie jest tym samym, co null.
orev
3
Aby usunąć wszystkie pliki cookie, możesz napisać:
foreach($_COOKIE as $key => $value){
unset($value);
setcookie($key,'', time()-3600);}
Wiem, że minęło dużo czasu, odkąd ten temat został stworzony, ale widziałem mały błąd w tym rozwiązaniu (mogę to tak nazwać, ponieważ jest to szczegół). Zgadzam się, że lepszym rozwiązaniem jest prawdopodobnie to rozwiązanie:
Ale w tym przypadku usuwasz pliki cookie w każdym przypadku, w którym działa funkcja rozbrojenia i natychmiast tworzysz nowe pliki cookie, które wygasły, na wypadek, gdyby funkcja rozbrojenia nie działała.
Oznacza to, że nawet jeśli funkcja nieuzbrojona działa, nadal będzie mieć 2 pliki cookie na komputerze. Zadanym celem, z logicznego punktu widzenia, jest usunięcie plików cookie, jeśli jest to możliwe, a jeśli tak naprawdę nie jest, spowodowanie wygaśnięcia; aby uzyskać „najczystszy” wynik.
Funkcja unset jest przeznaczona dla logiki PHP (jeśli chcesz użyć zmiennej $ _COOKIE ['Hello'], nie możesz, ponieważ jest ona rozbrojona). A funkcja setcookie jest przeznaczona dla nawigatora. 2 różne cele, kolejność funkcji nie ma wpływu na rzeczywisty kod.
Kalzem,
Tak naprawdę, wiem, że tak, ale jeśli absolutnie chcesz mieć pewność, że plik cookie został rozbrojony / usunięty, a więc korzystasz z obu rozwiązań od razu, byłoby lepiej, zanim te wygasną, a następnie rozbroić tezy, niż rozbić tezy i następnie odtwórz wygasłe ciasteczko ... jeśli widzisz, co mam na myśli?
Greg
Tak, przepraszam, odpowiadam właśnie teraz :) Wysłałem to, ponieważ widziałem, jak ludzie robią to w inny sposób ... ale wydaje mi się, że jest to bardziej sprytne, tak myślę.
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.
Ten kod całkowicie usunie zmienną cookie z całej domeny, tj. „/” - oznacza wartość tej zmiennej pliku cookie ustawioną dla wszystkich domen, a nie tylko dla bieżącej domeny lub ścieżki. time () - 300 oznacza, że ustawia się na poprzedni czas, więc wygaśnie.
Możesz ustawić zmienną sesji na podstawie wartości plików 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");
function unset_cookie($cookie_name){if(isset($_COOKIE[$cookie_name])){
unset($_COOKIE[$cookie_name]);
setcookie($cookie_name,null,-1);}else{returnfalse;}}
Jeśli chcesz usunąć $ _COOKIE ['user_account'].
Po prostu użyj:
Nie. Po prostu przeczytaj dokumenty. „Jeśli zostanie ustawiony na 0 lub pominięty, plik cookie wygaśnie pod koniec sesji (po zamknięciu przeglądarki).”
DrLightman
@DrLightman Dziękujemy za udział, czy możesz przytoczyć dokumentację?
Amir Fo
function.setcookie.php , parametr wygasa . „Jeśli zostanie ustawiony na 0 lub pominięty, plik cookie wygaśnie pod koniec sesji (po zamknięciu przeglądarki).”
DrLightman
1
Wystarczy ustawić wartość pliku cookie false, aby go rozbroić,
Musisz usunąć pliki cookie z php na swoim serwerze, a także z js dla przeglądarki. (Dokonały one z php, ale pliki cookie są również w kliencie przeglądarki):
Przykład:
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']);
Parametr domain będzie oznaczał bieżącą domenę, jeśli zostanie pominięty.
DustWolf,
Chciałem powiedzieć, że twoja odpowiedź jest nieprawidłowa. Będzie działał dla dowolnej domeny, nie tylko na komputerze lokalnym, ponieważ automatycznie użyje bieżącej domeny. A twój komentarz oznacza, że jesteś obrażony czy coś?
DustWolf,
Czy w ogóle czytasz tekst umieszczony powyżej kodu? przestań mnie wkurzać, pracuję. skończyłem rozmawiać z tobą.
Peter Gruppelaar,
Nie rozumiem, dlaczego denerwujesz się na innych użytkowników, którzy wskazują błąd w odpowiedzi. setcookiedziała dla dowolnej domeny, czy to localhost czy nie.
xorinzor
Więc jeśli wszyscy powiedzą, że tak jest ... to musi być coś ewidentnie nie tak z moją odpowiedzią ... fct hat, który został wskazany w tym poście nie ma znaczenia? ... chcesz tylko pewnego rodzaju odpowiedzi kierunkowych i zignoruj globalnych użytkowników, którzy pracują w podobnej sytuacji ... rozumiem ... przestań mnie denerwować, moja odpowiedź nie jest zła.
$cookie->delete()
ze github.com/delight-im/PHP-Cookie pomocny. Kod z pytania po prostu usuwa właściwość, która została przeanalizowana po stronie serwera. Plik cookie będzie nadal dostępny po stronie klienta.Odpowiedzi:
Możesz tego spróbować
źródło
unset($_COOKIE['Hello']);
. Nic nie zmieni, jeśli go usuniesz.unset($_COOKIE['Hello']);
jest naprawdę ważne, jeśli możesz sprawdzić plik cookie gdzieś później w kodzie.Ustaw wartość na „”, a datę wygaśnięcia na wczoraj (lub dowolną datę z przeszłości)
Następnie plik cookie wygaśnie przy następnym ładowaniu strony.
źródło
Prostym sposobem na usunięcie pliku cookie jest wyczyszczenie zarówno
$_COOKIE
pliku wartości, jak i pliku cookie przeglądarki:źródło
setcookie
wywołania:setcookie('key', '', time() - 3600, '/');
unsetting
udało się.null
wartościami, należy zamiast tego użyć array_key_exists () , ponieważ plik cookie znull
wartością nie zostanie znaleziony przezisset()
czek.Aby niezawodnie usunąć plik cookie, nie wystarczy ustawić, aby wygasł w dowolnym momencie w przeszłości, zgodnie z obliczeniami serwera PHP. Wynika to z faktu, że komputery klienckie mogą i często mają czasy inne niż czasy twojego serwera.
Najlepszym rozwiązaniem jest, aby zastąpić bieżący plik cookie z pustego pliku cookie, który wygasa jedną sekundę
w przyszłościpo epoce (1 stycznia 1970 00:00:00 UTC), a więc:źródło
Spowoduje to rozbrojenie pliku cookie w kodzie, ale ponieważ zmienna $ _COOKIE jest odświeżana przy każdym żądaniu, po prostu wróci do żądania na następnej stronie.
Aby faktycznie pozbyć się ciasteczka, ustaw datę ważności w przeszłości:
źródło
unset()
plik cookie nie jest potrzebny ?Miałem ten sam problem w kodzie i stwierdziłem, że był to problem ze ścieżką pliku cookie. Sprawdź ten post przepełnienia stosu: Nie można usunąć pliku cookie zestawu php
Ustawiłem ciasteczko przy użyciu wartości ścieżki „/”, ale nie miałem żadnej wartości ścieżki, gdy próbowałem go wyczyścić, więc nie wyczyściło się. Oto przykład tego, co zadziałało:
Ustawienie ciasteczka:
Czyszczenie ciasteczka:
Mam nadzieję, że to pomaga.
źródło
Jeśli plik cookie wygasa w przeszłości, przeglądarka go usunie. Zobacz przykład usuwania setcookie () na php.net
źródło
Zobacz przykład z etykietą „ Przykład # 2 przykład usuwania setcookie () ” z dokumentacji PHP. Aby usunąć plik cookie z przeglądarki, musisz poinformować przeglądarkę, że plik cookie wygasł ... przeglądarka usunie go.
unset
po jego użyciu po prostu usuwa ciasteczko „hello” z tablicy COOKIE.źródło
Oto jak działa kod setcookie () PHP v7, gdy wykonujesz:
Z danych wyjściowych programu tcpdump podczas wąchania portu 80 serwer wysyła do klienta (przeglądarki) następujące nagłówki HTTP:
Obserwując pakiety w następujących żądaniach, przeglądarka nie wysyła już tych plików cookie w nagłówkach
źródło
Aby usunąć plik cookie, wystarczy ustawić wartość NULL:
„Jeśli ustawiłeś plik cookie z wartościami domyślnymi dla czasu wygaśnięcia, ścieżki lub domeny, musisz podać te same wartości ponownie po usunięciu pliku cookie, aby plik cookie został poprawnie usunięty”. Cytat z książki „Nauka PHP5”.
Więc ten kod powinien działać (działa dla mnie):
Ustawienie ciasteczka:
setcookie('foo', 'bar', time() + 60 * 5);
Usuwanie ciasteczka:
setcookie('foo', '', time() + 60 * 5);
Zauważyłem jednak, że wszyscy ustawiają datę ważności na przeszłość, czy jest to konieczne i dlaczego?
źródło
''
nie jest tym samym, conull
.Aby usunąć wszystkie pliki cookie, możesz napisać:
źródło
Po prostu ustaw datę ważności na godzinę temu, jeśli chcesz „usunąć” plik cookie, w ten sposób:
lub
Źródło: http://www.php.net/manual/en/function.setcookie.php
Powinieneś użyć tej
filter_input()
funkcji dla wszystkich globali, do których użytkownik może wchodzić / manipulować, w następujący sposób:Możesz przeczytać więcej na ten temat tutaj: http://www.php.net/manual/en/function.filter-input.php i tutaj: http://www.w3schools.com/php/func_filter_input.asp
źródło
Wiem, że minęło dużo czasu, odkąd ten temat został stworzony, ale widziałem mały błąd w tym rozwiązaniu (mogę to tak nazwać, ponieważ jest to szczegół). Zgadzam się, że lepszym rozwiązaniem jest prawdopodobnie to rozwiązanie:
Ale w tym przypadku usuwasz pliki cookie w każdym przypadku, w którym działa funkcja rozbrojenia i natychmiast tworzysz nowe pliki cookie, które wygasły, na wypadek, gdyby funkcja rozbrojenia nie działała.
Oznacza to, że nawet jeśli funkcja nieuzbrojona działa, nadal będzie mieć 2 pliki cookie na komputerze. Zadanym celem, z logicznego punktu widzenia, jest usunięcie plików cookie, jeśli jest to możliwe, a jeśli tak naprawdę nie jest, spowodowanie wygaśnięcia; aby uzyskać „najczystszy” wynik.
Myślę więc, że powinniśmy lepiej:
Dziękuję i miłego dnia :)
źródło
źródło
Jeśli chcesz całkowicie usunąć plik cookie z całej bieżącej domeny, poniższy kod na pewno Ci pomoże.
Ten kod całkowicie usunie zmienną cookie z całej domeny, tj. „/” - oznacza wartość tej zmiennej pliku cookie ustawioną dla wszystkich domen, a nie tylko dla bieżącej domeny lub ścieżki. time () - 300 oznacza, że ustawia się na poprzedni czas, więc wygaśnie.
To jest jak idealnie usunięte.
źródło
Możesz ustawić zmienną sesji na podstawie wartości plików cookie
źródło
Możesz po prostu użyć tej funkcji dostosowywania:
Jeśli chcesz usunąć $ _COOKIE ['user_account'].
Po prostu użyj:
źródło
To proste!
źródło
Po wprowadzeniu
0
czasu masz na myśli „teraz” (+ 0 od teraz jest teraz) dla przeglądarki i usuwa ciasteczko.Sprawdziłem to w przeglądarce Chrome, która daje mi:
źródło
Wystarczy ustawić wartość pliku cookie
false
, aby go rozbroić,PS: - To najłatwiejszy sposób na zrobienie tego.
źródło
Musisz usunąć pliki cookie z php na swoim serwerze, a także z js dla przeglądarki. (Dokonały one z php, ale pliki cookie są również w kliencie przeglądarki):
Przykład:
źródło
Większość z was zapomina, że zadziała to tylko na komputerze lokalnym. W domenie będziesz potrzebować wzorca takiego jak ten przykład.
źródło
setcookie
działa dla dowolnej domeny, czy to localhost czy nie.