ลบคุกกี้


260

เมื่อฉันต้องการลบคุกกี้ฉันลอง

unset($_COOKIE['hello']);

ฉันเห็นในเบราว์เซอร์คุกกี้จาก Firefox ที่ยังคงมีอยู่ ฉันจะลบคุกกี้ได้อย่างไร


คุณอาจพบ$cookie->delete()จากgithub.com/delight-im/PHP-Cookie มีประโยชน์ รหัสจากคำถามเพียงแค่ลบคุณสมบัติที่ได้รับการแยกวิเคราะห์ในฝั่งเซิร์ฟเวอร์ คุกกี้จะยังคงอยู่ที่ฝั่งไคลเอ็นต์
caw

คำตอบ:


280

คุณอาจลองสิ่งนี้

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

141
ฉันเข้าใจว่านี่เป็นตัวอย่าง แต่โปรดไม่เคยเก็บชื่อผู้ใช้หรือรหัสผ่านไว้ในคุกกี้
tamasd

3
unset($_COOKIE['Hello']);มันไม่มีจุดหมายที่จะ มันไม่มีอะไรเปลี่ยนแปลงถ้าคุณลบมัน
machineaddict

30
@machineaddict unset($_COOKIE['Hello']);มีความสำคัญหากคุณอาจตรวจสอบคุกกี้ที่ใดที่หนึ่งในรหัส
Andreas Hultgren

4
ทำงานได้ดี แต่เมื่อพยายามโหลดหน้าซ้ำ เห็นชุดคุกกี้ที่มีข้อมูลเก่าทำไม
Nilesh patel

9
======= ไม่ทำงานในโครเมี่ยม ======= ฉันลองใช้รหัสนี้ในวันนี้และเมื่อฉันเข้าถึงเว็บไซต์โดยใช้ google chrome แล้วไปที่เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ใน chrome ฉันจะเห็นว่าเวลาหมดอายุ ถูกตั้งค่าเป็น 1 วินาทีก่อนยุค (เช่น 1969-12-31 23:59:59) อย่างไรก็ตามเมื่อฉันส่งหน้าถัดไปคุกกี้จะถูกส่งไปยังเซิร์ฟเวอร์ เมื่อฉันเปลี่ยน -1 เป็น 1 (เช่น 1970-01-01 00:00:01) เพื่อให้คำสั่งต่อไปนี้: setcookie ('Hello', null, 1, '/'); จากนั้น Chrome ก็ทำตามที่คาดไว้และไม่ได้ส่งคุกกี้
Peter Hinds

284

ตั้งค่าเป็น "" และวันที่หมดอายุเป็นเมื่อวาน (หรือวันใด ๆ ในอดีต)

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

จากนั้นคุกกี้จะหมดอายุในครั้งต่อไปที่โหลดหน้าเว็บ


10
วิธีการเกี่ยวกับการตั้งเวลาเป็น 0 (ยุค)? =]
แปลกหน้า

12
หากคุณใส่วันที่ไว้นานเกินไป IE จะเห่าและส่งเสียงดังกล่าวเช่นค่าจะไม่ถูกลบ
Julien

52
@strager สถานะด้วยตนเอง : หากตั้งค่าเป็น 0 หรือไม่ใส่คุกกี้จะหมดอายุเมื่อสิ้นสุดเซสชัน (เมื่อเบราว์เซอร์ปิด) นั่นไม่ใช่การลบคุกกี้จริงๆ ฉันไม่รู้ว่า IE จะทำสิ่งที่ Julien พูดหรือไม่ แต่ก็เป็นไปได้มากกว่าที่ IE จะทำสิ่งที่แปลก
yannis

31
นอกจากนี้อย่าลืมที่จะยกเลิกการตั้งค่า ($ _ COOKIE ["hello"]) ด้วยเช่นกันเพราะหากมีรหัสในส่วนที่เหลือของหน้าเว็บที่ดู $ _COOKIE ["hello"] มันจะยังคงพบอยู่ ฉันเพิ่งได้รับบิตโดยหนึ่งนี้
Magmatic

12
รวมทั้งเป็นความคิดที่ดีในการกำหนดเส้นทางดังนั้น setcookie ('hello', '', time () - 3600, '/');
Stephan Weinhold

226

วิธีที่สะอาดในการลบคุกกี้คือการล้าง$_COOKIEค่าและไฟล์คุกกี้ของเบราว์เซอร์:

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

3
นี่เป็นวิธีที่ดีที่สุดเพราะคุณไม่จำเป็นต้องรีเฟรชหน้า!
MaxV

19
ฉันลงไปเรื่อย ๆ และคำตอบก็ดีขึ้นตลกขึ้น แต่นี่คือสิ่งที่ดีที่สุดหยุดดูที่นี่
Andrew

23
หากคุณตั้งค่าคุกกี้โดยใช้เส้นทางคุณจะต้องรวมเส้นทางในการsetcookieโทรนี้ด้วย:setcookie('key', '', time() - 3600, '/');
Gavin

1
@ กาวินขอบคุณสำหรับเคล็ดลับนั้น ฉันสงสัยว่าทำไมมันถึงไม่ลบ แต่ก็unsettingประสบความสำเร็จ
stinkysGTI

1
สำหรับใครก็ตามที่กำลังตรวจสอบการมีอยู่ของคุกกี้และใส่ใจเกี่ยวกับคุกกี้ที่มีnullค่าคุณจะต้องใช้array_key_exists ()แทนเนื่องจากคุกกี้ที่มีnullค่าจะไม่ถูกisset()ตรวจสอบ
Leith

27

หากต้องการลบคุกกี้ที่เชื่อถือได้จะไม่เพียงพอที่จะตั้งค่าให้หมดอายุเมื่อใดก็ได้ในอดีตซึ่งคำนวณโดยเซิร์ฟเวอร์ PHP ของคุณ เนื่องจากคอมพิวเตอร์ไคลเอนต์สามารถและมักจะมีเวลาที่แตกต่างจากเซิร์ฟเวอร์ของคุณ

แนวทางปฏิบัติที่ดีที่สุดคือการเขียนทับคุกกี้ปัจจุบันด้วยคุกกี้ว่างเปล่าซึ่งจะหมดอายุหนึ่งวินาทีในอนาคตหลังจากยุค (1 มกราคม 1970 00:00:00 UTC) ดังนี้:

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

13
ถูกต้องฉันถ้าฉันผิด แต่การตั้งค่าเป็น "1" จะตั้งค่าเป็นวินาทีหลังจากยุคไม่ใช่หนึ่งวินาทีในอนาคต .. ? ฉันเชื่อว่าคุณถูกต้องเกี่ยวกับความแตกต่างของเขตเวลาดังนั้นวิธีแก้ไขปัญหาที่ดีที่สุดคือการตั้งค่าเป็น 2 วันในอดีต
PaulSkinner

@PaulSkinner วันที่ในยุคเป็นอิสระจากโซนเวลาคอมพิวเตอร์ทำการคำนวณนั้นสำหรับคุณ
AlexR

3
@AlexR ใช่ ไม่ตอบคำถามของฉันจริงๆ เพื่อความเข้าใจของฉันรหัสด้านบนจะตั้งค่าคุกกี้ให้หมดอายุในอดีต (หนึ่งวินาทีที่ผ่านมาในอดีต) เว้นแต่ว่าฉันเข้าใจผิด
PaulSkinner

@ PaulSkinner แน่นอนความคิดเห็นที่เหลือของคุณนั้นดีมาก
AlexR

9
+1 สำหรับ "1" ฉันไม่เข้าใจว่าทำไมคนอื่น ๆ ถึงได้รับการแก้ไขในการตั้งค่าคุกกี้ที่ถูกลบอย่างแน่นอนในหนึ่งชั่วโมงที่ผ่านมา
Meisner

20

นั่นจะเป็นการยกเลิกการตั้งค่าคุกกี้ในรหัสของคุณ แต่เนื่องจากตัวแปร $ _COOKIE ถูกรีเฟรชในแต่ละคำขอมันจะกลับมาที่หน้าถัดไป

หากต้องการกำจัดคุกกี้จริงๆให้ตั้งค่าวันหมดอายุในอดีต:

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

1
ไม่จำเป็นต้องunset()มีคุกกี้หรือไม่?
Pratik

2
@PratikCJoshi เฉพาะในกรณีที่รหัสของคุณค้นหาในภายหลัง
AlphaMycelium

14

ฉันมีปัญหาเดียวกันในรหัสของฉันและพบว่ามันเป็นปัญหาเส้นทางคุกกี้ ลองดูโพสต์ล้นสแต็กนี้: ไม่สามารถลบคุกกี้ชุด php

ฉันตั้งค่าคุกกี้โดยใช้ค่าพา ธ เป็น "/" แต่ไม่มีค่าพา ธ ใด ๆ เมื่อฉันพยายามล้างค่าดังนั้นจึงไม่ได้ล้างค่า ดังนั้นนี่คือตัวอย่างของการทำงาน:

การตั้งค่าคุกกี้:

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

การล้างคุกกี้:

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

หวังว่าจะช่วย



7

ดูตัวอย่างที่มีข้อความ " ตัวอย่าง # 2 setcookie () ลบตัวอย่าง " จากเอกสาร PHP ในการล้างคุกกี้จากเบราว์เซอร์คุณต้องแจ้งให้เบราว์เซอร์ทราบว่าคุกกี้หมดอายุ ... เบราว์เซอร์จะลบออก unsetเช่นเดียวกับที่คุณใช้มันเพียงแค่ลบคุกกี้ 'hello' ออกจากอาร์เรย์ COOKIE


7

นี่คือการทำงานของโค้ด PHP v7 setcookie ()

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

จากเอาต์พุตของ tcpdump ขณะดมบนพอร์ต 80 เซิร์ฟเวอร์ส่งไปยังไคลเอ็นต์ (เบราว์เซอร์) ส่วนหัว 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

การสังเกตแพ็กเก็ตในคำขอต่อไปนี้เบราว์เซอร์จะไม่ส่งคุกกี้เหล่านี้ในส่วนหัวอีกต่อไป


4

ในการลบคุกกี้คุณเพียงแค่ตั้งค่าเป็น NULL:

"หากคุณตั้งค่าคุกกี้ด้วยค่าที่ไม่ใช่ค่าเริ่มต้นสำหรับเวลาหมดอายุเส้นทางหรือโดเมนคุณจะต้องระบุค่าเดิมอีกครั้งเมื่อคุณลบคุกกี้เพื่อให้คุกกี้ถูกลบอย่างถูกต้อง" อ้างอิงจากหนังสือ "Learning PHP5"

ดังนั้นรหัสนี้ควรใช้งานได้ (เหมาะสำหรับฉัน):

การตั้งค่าคุกกี้: setcookie('foo', 'bar', time() + 60 * 5);

การลบคุกกี้: setcookie('foo', '', time() + 60 * 5);

แต่ฉันสังเกตเห็นว่าทุกคนกำลังกำหนดวันหมดอายุที่ผ่านมาเป็นสิ่งที่จำเป็นและทำไม?


1
มันมีความน่าเชื่อถือนั่นเป็นเหตุผล การรวมกันของการตั้งค่าเป็นอะไรและเวลาในอดีต (แต่ไม่ไกลเกินไปเพราะบางครั้ง IE ไม่ชอบมันกลับไปไกลจากสิ่งที่ฉันอ่าน) ทำงานได้ทั่วทั้งกระดาน
PaulSkinner

สตริงที่ว่างเปล่าไม่ได้เป็นสิ่งเดียวกับ'' null
orev

3

หากต้องการลบคุกกี้ทั้งหมดคุณสามารถเขียน:

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

3
การดำเนินการนี้จะไม่ลบคุกกี้เว้นแต่ว่าพวกเขามีเส้นทางและการตั้งค่าโดเมนเดียวกันกับค่าเริ่มต้นสำหรับ setcookie
Noishe

2

เพียงตั้งวันหมดอายุเป็นหนึ่งชั่วโมงที่ผ่านมาหากคุณต้องการ "ลบ" คุกกี้เช่นนี้:

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

หรือ

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

ที่มา: http://www.php.net/manual/en/function.setcookie.php

คุณควรใช้filter_input()ฟังก์ชั่นสำหรับทุกคนที่ผู้เข้าชมสามารถป้อน / จัดการเช่นนี้:

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

คุณสามารถอ่านเพิ่มเติมได้ที่นี่: http://www.php.net/manual/en/function.filter-input.phpและที่นี่: http://www.w3schools.com/php/func_filter_input.asp


2

ฉันรู้ว่ามีมานานแล้วนับตั้งแต่มีการสร้างหัวข้อนี้ แต่ฉันเห็นข้อผิดพลาดเล็กน้อยในโซลูชันนี้ (ฉันเรียกได้ว่าเป็นอย่างนั้นเพราะรายละเอียด) ฉันยอมรับว่าทางออกที่ดีกว่าน่าจะเป็นวิธีนี้:

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

แต่ในกรณีปัจจุบันคุณลบคุกกี้ในทุกกรณีที่ฟังก์ชัน unset ทำงานและคุณสร้างคุกกี้ที่หมดอายุใหม่ทันทีในกรณีที่ฟังก์ชัน unset ไม่ทำงาน

นั่นหมายความว่าแม้ว่าฟังก์ชั่น unset จะยังคงมีคุกกี้ 2 ตัวในคอมพิวเตอร์ เป้าหมายที่ถามในมุมมองแบบลอจิคัลคือการลบคุกกี้หากเป็นไปได้และหากไม่เป็นจริงทำให้หมดอายุ เพื่อให้ได้ผลลัพธ์ที่ "สะอาด"

ดังนั้นฉันคิดว่าเราควรทำ:

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

ขอขอบคุณและขอให้เป็นวันที่ดี :)


ฟังก์ชัน unset นั้นใช้สำหรับตรรกะของ PHP (ถ้าคุณต้องการใช้ตัวแปร $ _COOKIE ['Hello'] คุณไม่สามารถทำได้เนื่องจากไม่ได้ตั้งค่า) และฟังก์ชั่น setcookie นั้นมีไว้สำหรับเนวิเกเตอร์ 2 วัตถุประสงค์ที่แตกต่างกันลำดับของฟังก์ชั่นไม่มีผลกระทบกับรหัสจริง
Kalzem

ในความเป็นจริงฉันรู้ว่ามันใช่ แต่ถ้าคุณต้องการให้แน่ใจว่าคุกกี้ได้ถูกยกเลิกการตั้งค่า / ลบและเพื่อให้คุณใช้สองโซลูชั่นขวาขึ้นมันจะสะอาดกว่าก่อนที่จะทำให้วิทยานิพนธ์เหล่านี้หมดอายุแล้วยกเลิกการตั้งค่าเหล่านั้น ถ้าเช่นนั้นคุณจะสร้างคุกกี้ที่หมดอายุอีกครั้ง ...
เกร็ก

ใช่ขอโทษตอบกลับตอนนี้ :) ฉันส่งเพราะฉันเห็นคนทำมันในทางอื่น .. แต่ดูเหมือนฉลาดมากขึ้นเช่นนั้นฉันคิดว่า
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

หากคุณต้องการลบคุกกี้ทั้งหมดจากโดเมนปัจจุบันของคุณรหัสต่อไปนี้จะช่วยคุณได้อย่างแน่นอน

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

รหัสนี้จะลบตัวแปรคุกกี้ออกจากโดเมนของคุณทั้งหมดเช่น; "/" - มันหมายถึงค่าของตัวแปรคุกกี้ที่ตั้งค่าไว้สำหรับโดเมนทั้งหมดไม่เพียง แต่สำหรับโดเมนหรือเส้นทางปัจจุบัน time () - 300 หมายถึงมันตั้งค่าเป็นเวลาก่อนหน้าดังนั้นมันจะหมดอายุ

นั่นคือวิธีที่มันถูกลบอย่างสมบูรณ์แบบ


1

คุณสามารถตั้งค่าตัวแปรเซสชันตามค่าคุกกี้

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

คุณสามารถใช้ฟังก์ชั่นปรับแต่งนี้:

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']
เพียงใช้:

unset_cookie('user_account');

1

มันง่ายมาก!

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

ไม่จำเป็นต้องตั้งค่าสำหรับการลบคุกกี้!
Amir Fo

1

เมื่อคุณป้อน0เวลาคุณหมายถึง"ตอนนี้" (+ 0s นับจากนี้เป็นจริงในตอนนี้) สำหรับเบราว์เซอร์และจะลบคุกกี้

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

ฉันตรวจสอบในเบราว์เซอร์ chrome ที่ให้ฉัน:

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

ไม่เพียงแค่อ่านเอกสาร "หากตั้งค่าเป็น 0 หรือไม่ใส่คุกกี้จะหมดอายุเมื่อสิ้นสุดเซสชัน (เมื่อเบราว์เซอร์ปิด)"
DrLightman

@DLLightman ขอบคุณสำหรับการเข้าร่วมของคุณคุณช่วยอ้างอิงเอกสารได้ไหม?
Amir Fo

function.setcookie.php , หมดอายุพารามิเตอร์ "หากตั้งค่าเป็น 0 หรือไม่ใส่คุกกี้จะหมดอายุเมื่อสิ้นสุดเซสชัน (เมื่อเบราว์เซอร์ปิด)"
DrLightman

1

เพียงแค่ตั้งค่าของคุกกี้เป็นfalseเพื่อยกเลิกการตั้งค่า

setcookie('cookiename', false);

PS: - นั่นเป็นวิธีที่ง่ายที่สุดที่จะทำ


-1

คุณต้องลบคุกกี้ที่มี php ในเซิร์ฟเวอร์ของคุณและใช้ js สำหรับเบราว์เซอร์ของคุณด้วย (ทำโดยใช้ php แต่ไฟล์คุกกี้อยู่ในเบราว์เซอร์ไคลเอ็นต์ด้วย):

ตัวอย่าง:

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

คุณไม่จำเป็นต้องใช้ JavaScript เพื่อตั้งค่า / ลบค่าคุกกี้ ฟังก์ชั่น setcookie php จะทำเพื่อคุณphp.net/manual/en/function.setcookie.php
Michael Khalili

-5

พวกคุณส่วนใหญ่ลืมว่านี่จะใช้งานได้กับเครื่องท้องถิ่นเท่านั้น ในโดเมนคุณจะต้องมีรูปแบบเช่นนี้

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

1
พารามิเตอร์โดเมนจะหมายถึงโดเมนปัจจุบันหากไม่ได้ระบุไว้
DustWolf

ฉันตั้งใจจะบอกว่าคำตอบของคุณไม่ถูกต้อง มันจะทำงานให้กับโดเมนใด ๆ ไม่เพียง แต่เครื่องท้องถิ่นเพราะมันจะใช้โดเมนปัจจุบันโดยอัตโนมัติ และความคิดเห็นของคุณหมายความว่าคุณโกรธเคืองหรืออะไรนะ?
DustWolf

คุณยังอ่านข้อความที่อยู่เหนือโค้ดหรือไม่ หยุดดักฉันฉันกำลังทำงานอยู่ ฉันคุยกับคุณเสร็จแล้ว
Peter Gruppelaar

ฉันไม่เข้าใจว่าทำไมคุณถึงได้รำคาญผู้ใช้คนอื่น ๆ หากพวกเขาชี้ให้เห็นข้อผิดพลาดในคำตอบของคุณ setcookieใช้ได้กับทุกโดเมนไม่ว่าจะเป็น localhost หรือไม่ก็ตาม
xorinzor

ดังนั้นถ้าทุกคนพูดว่านั่นคือกรณี ... ถ้างั้นก็ต้องมีอะไรผิดปกติกับคำตอบของฉัน ... หมวก fct มันถูกชี้ให้เห็นในโพสต์นี้ไม่สำคัญ? ... คุณต้องการคำตอบทิศทางเดียว และเพิกเฉยต่อผู้ใช้ทั่วโลกที่กำลังทำงานในสถานการณ์ที่คล้ายกัน ... ฉันเข้าใจแล้ว ... หยุดดักฟังฉันคำตอบของฉันไม่ผิด
Peter Gruppelaar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.