ความแตกต่างระหว่าง session_unset () และ session_destroy () ใน PHP คืออะไร?


88

จากเอกสารphp.net :

session_destroy - ทำลายข้อมูลทั้งหมดที่ลงทะเบียนกับเซสชัน

session_unset - ฟรีตัวแปรเซสชันทั้งหมด

คำถามสามส่วนของฉันคือ:

ทั้งสองฟังก์ชั่นดูเหมือนกันมาก
อะไรคือความแตกต่างระหว่างทั้งสอง?

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

ถูกต้องหรือไม่ที่ทั้งสองฟังก์ชันไม่ลบคุกกี้เซสชันที่ไคลเอนต์

คำตอบ:


145

session_unsetเพียงแค่ล้าง$_SESSIONตัวแปร เทียบเท่ากับการทำ:

$_SESSION = array();

ดังนั้นสิ่งนี้จึงมีผลกับ$_SESSIONอินสแตนซ์ตัวแปรภายในเครื่องเท่านั้น แต่จะไม่ส่งผลต่อข้อมูลเซสชันในที่จัดเก็บเซสชัน

ในทางตรงกันข้ามจะsession_destroyทำลายข้อมูลเซสชันที่เก็บไว้ในที่จัดเก็บเซสชัน (เช่นไฟล์เซสชันในระบบไฟล์)

ทุกสิ่งทุกอย่างยังคงไม่เปลี่ยนแปลง


@Gumbo ไม่มีปัญหากับ session_unset () ที่เลิกใช้งานตอนนี้หรือ? ฉันตรวจสอบสิ่งนี้แล้วและมันไม่ได้ผลสำหรับฉัน
Navneet

@hakre มีอะไรเตือน?
GoTo

4
@GoTo: session_unset นั้นถูกใช้เพื่อยกเลิกการตั้งค่าตัวแปรส่วนกลางที่ลงทะเบียนเป็นตัวแปรเซสชันเหมือนที่ใช้กันทั่วไปใน PHP 4 การใช้ฟังก์ชันดังกล่าว ณ วันนี้เป็นไปตามกาลเวลาและไม่จำเป็น เหตุผลเดียวที่ยังคงอยู่ใน PHP คือความเข้ากันได้แบบย้อนหลังและไม่มีอะไรอื่น หากคุณเขียนโค้ดใหม่คุณไม่ควรใช้ หากคุณพบว่าอยู่ในโค้ดคุณควรลบออกพร้อมกับการเรียกใช้ session_register () และฟังก์ชันการจัดการตัวแปรเซสชัน PHP 4 ที่เหลือเว้นแต่คุณจะจัดการกับโค้ด PHP 4 อย่างชัดเจน
hakre

5
ยังคงเป็นความสับสน: local $_SESSION variable instance vs session data in the session storageโปรดอธิบาย อย่างที่ฉันรู้ว่ามีคนแบบฉัน 1,000 คนที่ไม่เข้าใจประเด็นของคุณ ขอบคุณ
Pratik

1
คำตอบของคุณสับสนเกินไป โปรดพิจารณาแก้ไขเพราะฉันยังคิดว่าทั้งสองกำลังทำลายเซสชั่น
Pratik

17

session_destroy(); กำลังลบทั้งเซสชัน

session_unset();ลบเฉพาะตัวแปรจากเซสชัน - เซสชันยังคงมีอยู่ มีเพียงข้อมูลเท่านั้นที่ถูกตัดทอน


15
session_unset();

เพียงแค่ล้างข้อมูลทั้งหมดของตัวแปรเซสชันทั้งหมด


session_destroy();

ลบเซสชันทั้งหมด


ตัวอย่าง :

session_start();
session_destroy();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]คือNULL.


session_start();
session_unset();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]คือ1234.


ดังนั้นฉันจะใช้:

session_start();
session_destroy();   
session_start();  
$a = "1234";
$_SESSION[a] = $a;

2
ในตัวอย่างตรงกลางของคุณ -> session_unset();คุณไม่ได้ทำอะไรเลยเนื่องจากคุณยังสามารถใช้เซสชันได้$_SESSION["a"] ดังนั้นสิ่งที่ใช้มันคืออะไร?
Pratik

1
$_SESSION[a]ควรจะเป็น$_SESSION['a'] และไม่เหมือนที่คุณบอกว่านี่ไม่ใช่ NULL ในตัวอย่างแรกของคุณ
Istiaque Ahmed

6

session_unset()จะล้าง$_SESSIONตัวแปร (เหมือนในarray()) แต่จะไม่แตะไฟล์เซสชัน แต่เมื่อสคริปต์จบลง; สถานะของ$_SESSIONจะถูกเขียนลงในไฟล์ จากนั้นจะล้างไฟล์ แต่จะไม่ลบ เมื่อคุณใช้session_destroy()มันจะไม่แตะ$_SESSION(ใช้var_dump($_SESSION)หลังsession_destroy()) แต่จะลบไฟล์เซสชันดังนั้นเมื่อสคริปต์ออกจะไม่มีไฟล์ให้เขียนสถานะของไฟล์$_SESSION.


1

ฉันพยายามใช้การsession_unset($_SESSION['session_name'])คิดว่ามันจะยกเลิกการตั้งค่าเฉพาะหรือชื่อเซสชันเดี่ยว / เดี่ยว แต่การใช้session_unset($_SESSION['session_name'])จะเป็นการยกเลิกการตั้งค่าชื่อเซสชันทั้งหมดเท่านั้น รหัสที่เหมาะสมที่จะใช้คือunset($_SESSION['session_name'])เมื่อคุณต้องการยกเลิกการตั้งชื่อเซสชันเดียว



0

session_start (); #it ​​จะสร้างอาร์เรย์เสมือน (เชื่อมโยง) ในหน่วยความจำเรียลไทม์ของเบราว์เซอร์

เพิ่มสองรายการ

> $_SESSION['me'] = "Yadab";  
> $_SESSION['you'] = "Avi";
>
> print_r($_SESSION); #will give, array( "me"=>"Yadab", "you"=>"Avi" )

ทดสอบ 1

> unset($_SESSION['me']); #only 'me' variable is removed fully (index & value) 
> print_r($_SESSION); #now the array is Array("you"=>"Avi")

ทดสอบ 2

> session_destroy(); #will unset the values of all session variables, but indexes exists 
> print_r($_SESSION); #Output, Array("you"=>undefined)
> #but some browser can store the value in cookies

ทดสอบ 3

> session_unset(); #will unset all the main variables not only the values 
> print_r($_SESSION); #that means session array is now empty, like Array()

ทดสอบบล็อก 1, 2 หรือ 3 ทีละรายการโดยแสดงความคิดเห็นจากผู้อื่น


-2

ฉันคิดว่าควรใช้ session_destroy () และ session_unset () ในเวลาเดียวกันเพื่อให้แน่ใจว่าข้อมูลเซสชันจะถูกลบอย่างแน่นอน


ฉันคิดว่าคุณไม่แน่ใจเกี่ยวกับคำตอบนี่ควรเป็นความคิดเห็นไม่ใช่คำตอบ
Shaiful Islam

4
session_unset()หลังจากนั้นsession_destroy()จะไม่มีจุดหมาย ใช้session_unset()เพื่อล้างคีย์และค่าทั้งหมดจาก superglobal $ _SESSION หรือใช้session_destroy()เพื่อลบเซสชันทั้งหมด อย่าใช้ทั้งสองอย่างเพื่อ "ตรวจสอบ" เชื่อมั่นว่าฟังก์ชันจะทำงานได้
redburn

@redburn session_destroy()จะไม่ยกเลิกการตั้งค่า sess superglobal var จนกว่าจะออกจากหน้าปัจจุบัน
Yousha Aleayoub
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.