Hapus cookie

260

Ketika saya ingin menghapus Cookie saya coba

unset($_COOKIE['hello']);

Saya melihat di browser cookie saya dari firefox bahwa cookie itu masih ada. Bagaimana saya bisa benar-benar menghapus cookie?

Sanders
sumber
Anda dapat menemukan $cookie->delete()dari github.com/delight-im/PHP-Cookie bermanfaat. Kode dari pertanyaan hanya menghapus properti yang telah diuraikan di sisi server. Cookie akan tetap hidup di sisi klien.
gak

Jawaban:

280

Anda Mungkin Coba ini

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}
Nikunj K.
sumber
141
Saya mengerti bahwa ini adalah contoh, tapi tolong jangan pernah menyimpan nama pengguna atau kata sandi di cookie.
tamasd
3
Tidak ada gunanya untuk unset($_COOKIE['Hello']);. Itu tidak mengubah apa pun jika Anda menghapusnya.
machineaddict
30
@machineaddict unset($_COOKIE['Hello']);sebenarnya penting jika Anda dapat memeriksa cookie di suatu tempat nanti dalam kode.
Andreas Hultgren
4
berfungsi dengan baik tetapi ketika mencoba memuat ulang halaman. melihat cookie diatur dengan data lama mengapa?
Nilesh patel
9
======= TIDAK BEKERJA DI CHROME ======= Saya mencoba kode ini hari ini dan ketika saya mengakses situs menggunakan google chrome, dan kemudian masuk ke alat pengembang di chrome, saya dapat melihat bahwa waktu kedaluwarsa diatur ke 1 detik sebelum zaman (mis. 1969-12-31 23:59:59) namun ketika saya mengirimkan halaman selanjutnya cookie dikirimkan ke server. Ketika saya mengubah -1 ke 1 (mis. 1970-01-01 00:00:01) untuk memberikan perintah berikut: setcookie ('Hello', null, 1, '/'); kemudian chrome bertindak seperti yang diharapkan dan tidak mengirimkan cookie
Peter Hinds
284

Tetapkan nilai ke "" dan tanggal kedaluwarsa menjadi kemarin (atau tanggal apa pun di masa lalu)

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

Maka cookie akan kedaluwarsa saat halaman berikutnya dimuat.

Tanpa cinta
sumber
10
Bagaimana kalau mengatur waktu ke 0 (zaman)? =]
strager
12
Jika Anda menaruh tanggal terlalu jauh di masa lalu, IE akan menggonggong dan mengabaikannya, artinya nilainya tidak akan dihapus.
Julien
52
@strager Status manual : Jika diatur ke 0, atau dihilangkan, cookie akan kedaluwarsa pada akhir sesi (ketika browser ditutup). Itu tidak benar-benar menghapus cookie. Saya benar-benar tidak tahu apakah IE akan melakukan apa yang dikatakan Julien, tetapi mungkin IE akan melakukan sesuatu yang aneh.
yannis
31
Juga, jangan lupa untuk benar-benar tidak disetel ($ _ COOKIE ["halo"]) juga, karena jika ada kode pada halaman lainnya yang terlihat pada $ _COOKIE ["halo"], ia masih akan menemukan pengaturannya. Saya baru saja mendapatkan yang ini.
Magmatik
12
Plus itu ide yang baik untuk mengatur jalur, jadi setcookie ('halo', '', waktu () - 3600, '/');
Stephan Weinhold
227

Cara bersih untuk menghapus cookie adalah dengan menghapus $_COOKIEnilai dan file cookie browser:

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}
Mouloud
sumber
3
Ini adalah metode terbaik, karena Anda tidak perlu me-refresh halaman!
Maks.
19
Saya terus menelusuri halaman dan jawabannya terus menjadi lebih baik, lucu. Tapi ini yang terbaik, berhentilah mencari di sini.
Andrew
23
FYI, jika Anda mengatur cookie menggunakan jalur, Anda harus menyertakan jalur dalam setcookiepanggilan ini juga:setcookie('key', '', time() - 3600, '/');
Gavin
1
@ Gavin Terima kasih atas tipnya. Saya bertanya-tanya mengapa itu tidak dihapus, tetapi unsettingberhasil.
stinkysGTI
1
Untuk siapa pun yang memeriksa keberadaan cookie dan peduli tentang cookie yang ada dengan nullnilai, Anda harus menggunakan array_key_exists () , karena cookie dengan nullnilai tidak akan ditemukan oleh isset()cek.
Leith
27

Untuk menghapus cookie dengan andal, itu tidak cukup untuk mengaturnya agar kadaluwarsa di masa lalu, seperti yang dihitung oleh server PHP Anda. Ini karena komputer klien dapat dan seringkali memiliki waktu yang berbeda dari server Anda.

Praktik terbaik adalah menimpa cookie saat ini dengan cookie kosong yang kedaluwarsa satu detik di masa mendatang setelah zaman (1 Januari 1970 00:00:00 UTC), seperti:

setcookie("hello", "", 1);
Thejoker123
sumber
13
Koreksi saya jika saya salah, tetapi menetapkan bahwa ke "1" akan menetapkannya menjadi satu detik setelah zaman, bukan satu detik di masa depan ..? Saya percaya Anda benar tentang perbedaan zona waktu, jadi solusi terbaik adalah mengaturnya menjadi 2 hari di masa lalu (jadi bahkan zona waktu terjauh pun masih belum mengatur cookie).
PaulSkinner
@PaulSkinner tanggal zaman tidak tergantung pada zona waktu, komputer melakukan perhitungan itu untuk Anda.
AlexR
3
@AlexR Ya. Tidak benar-benar menjawab maksud saya. Untuk pemahaman saya, kode di atas memang mengatur cookie untuk kedaluwarsa di masa lalu (satu detik melewati zaman), kecuali saya salah.
PaulSkinner
@PaulSkinner tentu saja, sisa komentar Anda baik-baik saja.
AlexR
9
+1 untuk "1". Saya tidak mengerti mengapa semua orang lain begitu terpaku pada pengaturan cookie yang dihapus tepat satu jam di masa lalu.
Meisner
20

Itu akan menghapus cookie dalam kode Anda, tetapi karena variabel $ _COOKIE di-refresh pada setiap permintaan, itu hanya akan kembali pada permintaan halaman berikutnya.

Untuk benar-benar menyingkirkan cookie, tetapkan tanggal kedaluwarsa di masa lalu:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);
Eric Petroelje
sumber
1
Apakah tidak perlu unset()cookie?
Pratik
2
@PratikCJoshi Hanya jika kode Anda mencarinya nanti.
AlphaMycelium
14

Saya memiliki masalah yang sama dalam kode saya dan menemukan bahwa itu adalah masalah jalur cookie. Lihat posting stack overflow ini: Tidak dapat menghapus set cookie php

Saya telah menetapkan cookie menggunakan nilai jalur "/", tetapi tidak memiliki nilai jalur ketika saya mencoba untuk menghapusnya, jadi itu tidak jelas. Jadi di sini adalah contoh dari apa yang berhasil:

Pengaturan cookie:

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

Menghapus cookie:

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

Semoga itu bisa membantu.

pengguna3285097
sumber
7

Lihat sampel berlabel " Contoh # 2 setcookie () hapus contoh " dari dokumen PHP. Untuk menghapus cookie dari browser, Anda harus memberi tahu browser bahwa cookie telah kedaluwarsa ... browser kemudian akan menghapusnya. unsetkarena Anda telah menggunakannya, hanya menghapus cookie 'halo' dari array COOKIE.

Jarret Hardie
sumber
7

Ini adalah cara kerja kode PHP v7 setcookie () saat Anda melakukannya:

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

Dari output tcpdump saat mengendus port 80, server mengirim ke HTTP header berikut:

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

Mengamati paket dalam permintaan berikut ini Browser tidak lagi mengirim cookie ini di header

Nulik
sumber
4

Untuk menghapus cookie, Anda hanya perlu mengatur nilai ke NULL:

"Jika Anda menetapkan cookie dengan nilai tidak cacat untuk waktu, jalur, atau domain kedaluwarsa, Anda harus memberikan nilai-nilai yang sama lagi ketika Anda menghapus cookie agar cookie dihapus dengan benar." Kutipan dari buku "Belajar PHP5".

Jadi kode ini harus bekerja (berfungsi untuk saya):

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

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

Tetapi saya perhatikan bahwa semua orang menetapkan tanggal kedaluwarsa ke masa lalu, apakah itu perlu, dan mengapa?

boksa
sumber
1
Itu bisa diandalkan, itu sebabnya. Kombinasi pengaturan nilai ke nol dan waktu di masa lalu (tapi tidak terlalu jauh seperti IE kadang-kadang tidak suka terlalu jauh dari apa yang saya baca) bekerja di seluruh papan.
PaulSkinner
String kosong ''bukanlah hal yang sama dengan null.
orev
3

Untuk menghapus semua cookie, Anda dapat menulis:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}
Ralphe Samson
sumber
3
Ini tidak akan benar-benar menghapus cookie kecuali mereka memiliki jalur dan pengaturan domain yang sama dengan default untuk setcookie.
Noishe
2

Cukup atur tanggal kedaluwarsa ke satu jam yang lalu, jika Anda ingin "menghapus" cookie, seperti ini:

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

atau

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

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

Anda harus menggunakan filter_input()fungsi untuk semua global yang dapat dimasukkan / dimanipulasi pengunjung, seperti ini:

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

Anda dapat membaca lebih lanjut tentang ini di sini: http://www.php.net/manual/en/function.filter-input.php dan di sini: http://www.w3schools.com/php/func_filter_input.asp

Jo Smo
sumber
2

Saya tahu bahwa sudah lama sejak topik ini dibuat, tetapi saya melihat sedikit kesalahan dalam solusi ini (saya bisa menyebutnya seperti itu, karena ini detail). Saya setuju bahwa solusi yang lebih baik mungkin adalah solusi ini:

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

Tetapi, dalam kasus ini, Anda menghapus cookie di setiap kasus di mana fungsi yang tidak disetel bekerja dan segera Anda membuat cookie yang kadaluwarsa jika fungsi yang tidak disetel tidak berfungsi.

Itu berarti bahwa meskipun fungsi yang tidak disetel bekerja, masih ada 2 cookie di komputer. Tujuan yang diminta, dalam sudut pandang logis, adalah untuk menghapus cookie jika memungkinkan dan jika sebenarnya tidak, buatlah itu kedaluwarsa; untuk mendapatkan hasil "terbersih".

Jadi, saya pikir sebaiknya kita lakukan:

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

Terima kasih dan semoga harimu menyenangkan :)

Greg
sumber
Fungsi tidak disetel dimaksudkan untuk logika PHP (jika Anda ingin menggunakan variabel $ _COOKIE ['Halo'], Anda tidak bisa karena tidak disetel). Dan fungsi setcookie dimaksudkan untuk navigator. 2 tujuan berbeda, urutan fungsi tidak berdampak pada kode aktual.
Kalzem
Sebenarnya, saya mengetahuinya, tetapi jika Anda benar-benar ingin memastikan bahwa kuki telah disetel / dihapus dan jadi Anda menggunakan dua solusi di atas, akan lebih bersih untuk sebelum membuat tesis kedaluwarsa dan kemudian mengeset tesis daripada mengeset tesis dan lalu buat ulang cookie yang kedaluwarsa ... jika Anda mengerti maksud saya?
Greg
Yap, maaf baru saja menjawab :) Saya sudah mengirimnya karena saya pernah melihat orang melakukannya dengan cara lain .. tapi sepertinya lebih pintar seperti itu, saya pikir.
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
sumber
2

Jika Anda ingin menghapus cookie sepenuhnya dari semua domain Anda saat ini maka kode berikut pasti akan membantu Anda.

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

Kode ini akan menghapus variabel cookie sepenuhnya dari semua domain Anda yaitu; "/" - ini menunjukkan bahwa nilai variabel cookie siap untuk semua domain, bukan hanya untuk domain atau jalur saat ini. time () - 300 menunjukkan bahwa ia diset ke waktu sebelumnya sehingga akan kedaluwarsa.

Itulah cara itu dihapus dengan sempurna.

Soumen Pasari
sumber
1

Anda bisa mengatur variabel sesi berdasarkan nilai 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");
Jason Plank
sumber
1

Anda cukup menggunakan fungsi penyesuaian ini:

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

Jika Anda ingin menghapus $ _COOKIE ['user_account'].
Cukup gunakan:

unset_cookie('user_account');
Kenny
sumber
1

Itu mudah!

setcookie("cookiename", "cookievalue", 1);
LF
sumber
Tidak perlu menetapkan nilai untuk cookie yang dihapus!
Amir Fo
1

Ketika Anda memasukkan 0waktu, maksud Anda "sekarang" (+ 0 dari sekarang sebenarnya sekarang) untuk browser dan menghapus cookie.

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

Saya memeriksanya di browser chrome yang memberi saya:

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
sumber
Tidak. Hanya membaca dokumen. "Jika diatur ke 0, atau dihilangkan, cookie akan kedaluwarsa pada akhir sesi (ketika browser ditutup)."
DrLightman
@DrLightman Terima kasih atas kehadiran Anda, bisakah Anda mengutip dokumentasi?
Amir Fo
function.setcookie.php , kedaluwarsa parameter. "Jika diatur ke 0, atau dihilangkan, cookie akan kedaluwarsa pada akhir sesi (ketika browser ditutup)."
DrLightman
1

Cukup atur nilai cookie falseuntuk menghapusnya,

setcookie('cookiename', false);

PS: - Itu cara termudah untuk melakukannya.

Amit Merchant
sumber
-1

Anda harus menghapus cookie dengan php di server Anda dan juga dengan js untuk browser Anda .. (Mereka telah dibuat dengan php, tetapi file cookie juga ada di klien browser):

Sebuah contoh:

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']);
Ponco_333
sumber
Anda tidak perlu JavaScript untuk mengatur / menghapus nilai cookie. Fungsi php setcookie akan melakukannya untuk Anda php.net/manual/en/function.setcookie.php
Michael Khalili
-5

Sebagian besar dari Anda lupa bahwa ini hanya akan bekerja pada mesin lokal. Pada domain Anda akan membutuhkan pola seperti contoh ini.

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);
Peter Gruppelaar
sumber
1
Parameter domain akan berarti domain saat ini jika dihilangkan.
DustWolf
Saya bermaksud mengatakan bahwa jawaban Anda salah. Ini akan berfungsi untuk domain apa pun, bukan hanya mesin lokal, karena akan secara otomatis menggunakan domain saat ini. Dan komentar Anda berarti mengatakan Anda tersinggung atau semacamnya?
DustWolf
Apakah Anda bahkan membaca teks yang ada di atas kode? berhenti menggangguku, aku sedang bekerja. saya selesai berbicara dengan kamu.
Peter Gruppelaar
Saya tidak mengerti mengapa Anda merasa jengkel pada pengguna lain jika mereka menunjukkan kesalahan dalam jawaban Anda. setcookieberfungsi untuk domain apa pun, baik localhost atau tidak.
xorinzor
Jadi jika semua orang mengatakan, itu yang terjadi ... maka pasti ada sesuatu yang salah dengan jawaban saya ... topi pertama yang ditunjukkan di pos ini tidak masalah? ... Anda hanya ingin semacam jawaban arah , dan abaikan setiap pengguna global yang bekerja pada situasi simular ... saya mengerti ... berhenti menggangguku, jawaban saya tidak salah.
Peter Gruppelaar