Bir çerezi kaldırma


260

Bir Çerezi kaldırmak istediğimde deniyorum

unset($_COOKIE['hello']);

Firefox'tan çerez tarayıcımda çerezin hala var olduğunu görüyorum. Çerezi gerçekten nasıl kaldırabilirim?


Sen bulabilir $cookie->delete()gelen github.com/delight-im/PHP-Cookie yararlı. Sorunun kodu, sunucu tarafında ayrıştırılan özelliği siler. Çerez hala istemci tarafında kalacak.
caw

Yanıtlar:


280

Bunu deneyebilirsin

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

141
Bunun bir örnek olduğunu anlıyorum, ancak lütfen asla kullanıcı adını veya şifreyi çerezlerde saklamayın.
tamasd

3
Anlamsız unset($_COOKIE['Hello']);. Kaldırırsanız hiçbir şey değişmez.
başkanı

30
@machineaddict unset($_COOKIE['Hello']);, çerezi daha sonra kodda bir yerde kontrol edebiliyorsanız önemlidir.
Andreas Hultgren

4
iyi çalışıyor ancak sayfayı yeniden yüklemeye çalıştığınızda. neden eski veri ile çerez kümesi gördüm ?.
Nilesh patel

9
======= KROM ÇALIŞMIYOR ======= Bu kodu bugün denedim ve siteye google chrome kullanarak eriştiğimde ve ardından krom geliştirici araçlarına gittiğimde, sona erme zamanını görebiliyorum çağdan önce 1 saniye olarak ayarlanır (örneğin, 1969-12-31 23:59:59), ancak bir sonraki sayfayı gönderdiğimde çerez sunucuya gönderilir. Aşağıdaki komutu vermek için -1'i 1 olarak değiştirdiğimde (örn. 1970-01-01 00:00:01): setcookie ('Hello', null, 1, '/'); daha sonra krom beklendiği gibi davrandı ve çerezi göndermedi
Peter Hinds

284

Değeri "" ve son kullanma tarihini dün (veya geçmişte herhangi bir tarih) olarak ayarlayın

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

Ardından, sayfanın bir sonraki yüklenmesi sırasında çerezin süresi dolar.


10
Zamanı 0 (çağ) olarak ayarlamaya ne dersiniz? =]
strager

12
Geçmişte çok ileri bir tarih koyarsanız IE havlar ve havlar, yani değer kaldırılmaz.
Julien

52
@strager Kılavuzun durumları: 0 olarak ayarlanırsa veya atlanırsa, oturumun sonunda (tarayıcı kapatıldığında) çerezin süresi dolar. Bu gerçekten çerezi silmiyor. IE'nin Julien'in söylediklerini yapıp yapmayacağını gerçekten bilmiyorum, ancak IE'nin garip bir şey yapması mümkün.
yannis

31
Ayrıca, aslında ($ _ COOKIE ["merhaba"]) ayarını da kaldırmayı unutmayın, çünkü sayfanın geri kalanında $ _COOKIE ["merhaba"] 'ya bakan bir kod varsa, yine de ayarlanmış olarak bulunur. Biraz önce bunu yaptım.
Magmatic

12
Ayrıca yolu ayarlamak iyi bir fikirdir, bu nedenle setcookie ('merhaba', '', zaman () - 3600, '/');
Stephan Weinhold

227

Bir çerezi silmenin temiz bir yolu, hem $_COOKIEdeğeri hem de tarayıcı çerezi dosyasını temizlemektir :

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

3
Bu en iyi yöntemdir, çünkü sayfayı yenilemenize gerek yoktur!
MaxV

19
Sayfadan aşağıya iniyorum ve cevaplar gittikçe daha eğlenceli hale geliyor. Ama bu en iyisi, buraya bakmayı kes.
Andrew

23
Bilginize, çerezi bir yol kullanarak ayarlarsanız, bu setcookiearamaya da yolu eklemeniz gerekir :setcookie('key', '', time() - 3600, '/');
Gavin

1
@Gavin Bu ipucu için teşekkürler. Neden silinmediğini, ama unsettingbaşarılı olduğunu merak ediyordum .
stinkysGTI

1
Bir çerezin varlığını kontrol eden ve nulldeğerlerle var olan çerezleri önemseyen herkes için, değeri olan bir çerez bir çekle bulunamayacağı için bunun yerine array_key_exists () öğesini kullanmanız gerekir . nullisset()
Leith

27

Bir çerezi güvenilir bir şekilde silmek için, PHP sunucunuz tarafından hesaplandığı gibi, geçmişte herhangi bir zamanda sona erecek şekilde ayarlamak yeterli değildir. Bunun nedeni, istemci bilgisayarların sunucunuzdakinden farklı zamanlara sahip olabilmeleridir.

En iyi uygulama, mevcut çerezi , dönemin ardından (1 Ocak 1970 00:00:00 UTC) sonra gelecekte bir saniye süren boş bir çerezle üzerine yazmaktır:

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

13
Eğer yanılıyorsam beni düzeltin, ama bunu "1" olarak ayarlamak, çağdan sonra bir saniyeye, gelecekte bir saniyeye değil. Zaman dilimi farkları hakkında doğru olduğuna inanıyorum, bu yüzden en iyi çözüm geçmişte 2 güne ayarlamak olacaktır (bu yüzden en uzak zaman dilimi bile çerezi unset olurdu).
PaulSkinner

@PaulSkinner dönem tarihi saat dilimlerinden bağımsızdır, bilgisayar bu hesaplamayı sizin için yapar.
AlexR

3
@AlexR Evet. Benim açımdan gerçekten cevap vermiyor. Benim anlayış için, kod yukarıdaki gelmez ben yanlış sürece, geçmişte sona erecek çerez (dönemin geçmiş bir saniye) olarak ayarlayın.
PaulSkinner

@PaulSkinner, elbette, yorumunuzun geri kalanı gayet iyi.
AlexR

9
"1" için +1. Diğerlerinin neden silinmiş bir çerezi geçmişte tam olarak bir saat ayarlamaya karar verdiğini anlamıyorum.
Meisner

20

Bu, kodunuzdaki çerezi unset edecektir, ancak her istekte $ _COOKIE değişkeni yenilendiğinden, bir sonraki sayfa isteğine geri dönecektir.

Tanımlama bilgisinden gerçekten kurtulmak için geçmişte son kullanma tarihini ayarlayın:

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

1
Çereze gerek yok unset()mu?
Pratik

2
@PratikCJoshi Yalnızca kodunuz daha sonra ararsa.
AlphaMycelium

14

Kodumda aynı sorunu vardı ve bunun bir çerez yolu sorunu olduğunu gördüm. Bu yığın taşması gönderisine göz atın: Php set çerezi silinemiyor

Çerez "/" bir yol değeri kullanarak ayarlamıştı, ama temizlemeye çalıştığımda herhangi bir yol değeri yoktu, bu yüzden net değildi. İşte işe yarayan şeyin bir örneği:

Çerezin ayarlanması:

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

Çerezi temizleme:

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

Umarım yardımcı olur.



7

PHP belgelerinden " Örnek # 2 setcookie () silme örneği " etiketli örneğe bakın . Bir çerezi tarayıcıdan temizlemek için tarayıcıya çerezin süresinin dolduğunu söylemeniz gerekir ... tarayıcı daha sonra onu kaldıracaktır. unsetkullandığınız gibi 'merhaba' çerezini COOKIE dizisinden kaldırır.


7

PHP v7 setcookie () kodu şu şekilde çalışır:

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

80 numaralı bağlantı noktasını koklarken, tcpdump çıktısından, sunucu istemciye (Tarayıcı) aşağıdaki HTTP başlıklarını gönderir:

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

Aşağıdaki isteklerdeki paketleri gözlemlemek Tarayıcı artık bu çerezleri başlıklara göndermiyor


4

Çerezi silmek için değeri NULL olarak ayarlamanız yeterlidir:

"Bir sona erme süresi, yol veya alan adı için varsayılan olmayan değerlere sahip bir çerez ayarladıysanız, çerezin düzgün bir şekilde silinmesi için çerezleri sildiğinizde aynı değerleri tekrar sağlamanız gerekir." "PHP5 Öğrenme" kitabından alıntı.

Yani bu kod çalışmalı (benim için çalışıyor):

Çerezin ayarlanması: setcookie('foo', 'bar', time() + 60 * 5);

Çerezin silinmesi: setcookie('foo', '', time() + 60 * 5);

Ama herkesin son kullanma tarihini geçmişe getirdiğini fark ettim, bu gerekli mi ve neden?


1
Güvenilir, bu yüzden. Değeri geçmişte hiçbir şeye ve bir zamana ayarlamanın bir kombinasyonu (ancak IE ara sıra çok okuduğumdan çok uzak değil gibi) tahta üzerinde çalışır.
PaulSkinner

Boş dize ''ile aynı şey değildir null.
orev

3

Yazabileceğiniz tüm çerezleri kaldırmak için:

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

3
Bu, setcookie varsayılanlarıyla aynı yol ve etki alanı ayarlarına sahip olmadıkça çerezleri kaldırmaz.
Noishe

2

Çerezi "kaldırmak" istiyorsanız, son kullanma tarihini bir saat öncesine ayarlamanız yeterlidir:

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

veya

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

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

Bu filter_input()işlevi, bir ziyaretçinin girebileceği / değiştirebileceği tüm global kullanıcılar için kullanmalısınız :

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

Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: http://www.php.net/manual/en/function.filter-input.php burada: http://www.w3schools.com/php/func_filter_input.asp


2

Bu konunun yaratılmasından bu yana uzun zaman geçtiğini biliyorum, ancak bu çözümde küçük bir hata gördüm (buna böyle diyebilirim, çünkü bir detay). Daha iyi çözümün muhtemelen bu çözüm olduğuna katılıyorum:

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

Ancak, bu durumda, unset işlevinin çalıştığı her durumda çerezleri siler ve unset işlevinin çalışmadığı durumlarda derhal yeni süresi dolmuş çerezler oluşturursunuz.

Bu, unset işlevi çalışsa bile, bilgisayarda hala 2 çerez olacağı anlamına gelir. Sorulan amaç, mantıklı bir bakış açısıyla, mümkünse çerezleri silmektir ve gerçekten değilse, süresinin dolmasını sağlayın; "en temiz" sonucu elde etmek için.

Yani, bence yapmalıyız:

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

Teşekkürler ve iyi günler :)


Fonksiyon unset, PHP'nin mantığı içindir ($ _COOKIE ['Hello'] değişkenini kullanmak istiyorsanız, ayarlandığı gibi yapamazsınız). Ve setcookie işlevi navigatör içindir. 2 farklı amaç, fonksiyonların sırasının gerçek kod üzerinde hiçbir etkisi yoktur.
Haziran'da Kalzem

Aslında, evet biliyorum ama kesinlikle çerez unset / silindiğinden emin olmak istiyorsanız ve bu yüzden iki çözümü yukarı doğru kullanırsanız, tezlerin süresinin dolmasını ve daha sonra tezleri unset tezlerinden daha önce yapmak daha temiz olurdu ve süresi dolan bir çerezi yeniden oluşturun ... ne demek istediğimi anlarsanız?
Greg

Evet, şu anda cevapladığım için özür dilerim :) Gönderdim çünkü başka şekilde yapan insanlar gördüm .. ama bence daha zekice görünüyor.
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

Çerezi mevcut alanınızdan tamamen silmek istiyorsanız, aşağıdaki kod kesinlikle size yardımcı olacaktır.

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

Bu kod, çerez değişkenini tüm alan adınızdan tamamen silecektir; "/" - çerez değişkeninin değerinin yalnızca geçerli alan veya yol için değil, tüm alan adı için ayarlandığı anlamına gelir. time () - 300, süresinin dolması için önceki bir süreye ayarlandığını belirtir.

Bu nasıl mükemmel bir şekilde silinir.


1

Çerez değerlerine dayalı olarak bir oturum değişkeni ayarlayabilirsiniz

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

Bu özelleştirme işlevini kullanabilirsiniz:

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

$ _COOKIE ['user_account'] öğesini kaldırmak istiyorsanız.
Sadece kullan:

unset_cookie('user_account');

1

Basit!

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

Silme çerezi için değer ayarlamanız gerekmez!
Amir Fo

1

Zaman için girdiğinizde , tarayıcı için "şimdi" (şu andan itibaren + 0s aslında şimdi) 0anlamına gelir ve çerezi siler.

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

Bana veren krom tarayıcıda kontrol ettim:

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

Hayır. Sadece belgeleri okuyun. "0 olarak ayarlanırsa veya atlanırsa, oturumun sonunda çerezin süresi dolar (tarayıcı kapandığında)."
DrLightman

@DrLightman Katılımınız için teşekkür ederiz, Lütfen dokümantasyona atıf yapabilir misiniz?
Amir Fo

function.setcookie.php , parametre sona erer . "0 olarak ayarlanırsa veya atlanırsa, oturumun sonunda çerezin süresi dolar (tarayıcı kapandığında)."
DrLightman

1

Ayarı kaldırmak için çerezin değerini ayarlamanız falseyeterlidir,

setcookie('cookiename', false);

PS: - Bunu yapmanın en kolay yolu.


-1

Sunucunuzda php ve ayrıca tarayıcınız için js ile çerezleri silmek zorunda .. (Php ile yaptılar, ancak çerez dosyaları da tarayıcı istemcisinde):

Bir örnek:

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

Çerez değerini ayarlamak / silmek için JavaScript'e ihtiyacınız yoktur. Php fonksiyonu setcookie bunu sizin için yapacak php.net/manual/en/function.setcookie.php
Michael Khalili

-5

Çoğunuz bunun sadece yerel bir makinede çalışacağını unutuyorsunuz. Bir alanda bu örnek gibi bir desene ihtiyacınız olacaktır.

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

1
Domain parametresi, atlanırsa geçerli domain anlamına gelir.
DustWolf

Cevabınızın yanlış olduğunu söylemek istedim. Geçerli etki alanını otomatik olarak kullanacağı için yalnızca yerel makine için değil, herhangi bir etki alanı için çalışır. Ve yorumunuz kırgın veya başka bir şey olduğunu söylemek anlamına mı geliyor?
DustWolf

Kodun üstünde yer alan metni bile okuyor musunuz? beni rahatsız etmeyi bırak, çalışıyorum. seninle konuşmayı bitirdim
Peter Gruppelaar

Cevabınızda bir hata gösteriyorlarsa diğer kullanıcılara neden sinirlendiğinizi anlamıyorum. setcookielocalhost olsun veya olmasın, herhangi bir alan için çalışır.
xorinzor

Eğer herkes diyorsa, durum budur ... o zaman cevabımla ilgili açıkça yanlış bir şey olmalı ... bu yazı boyunca işaret edilen fct şapka önemli değil mi? ... u sadece bir tür yön cevapları istiyorum ve simüler bir durum üzerinde çalışan global kullanıcıları görmezden geliyorum ... anlıyorum ... beni rahatsız etmeyi bırak, cevabım yanlış değil.
Peter Gruppelaar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.