Posts Tagged ‘ session

[PHP] ปัญหา Cannot send session cache limiter headers already sent

เนื่องจากเวลาทำเว็บ PHP มักนิยม encoding ด้วย UTF-8 เสมอไม่เคยเจอปัญหา เพิ่งจะมาเจอก็ตอนเปลี่ยนมาใช้ Notepad++ ในการเขียน PHP แทน Adobe Dreamweaver เพราะไม่ค่อยได้ใช้ในการ Design แค่ Code อย่างเดียว ปัญหาที่เจอเคือการใช้งาน Session ดังนี้

<?php
session_start();
echo "Session Start...";
?>

ดูผ่านๆ ไม่น่ามีปัญหาอะไร แต่เจอ Errorแบบนี้

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at xxx) in xxx

ก็หน้ามืดไปเกือบ ชั่วโมงได้ สุดท้ายพบว่าเป็นที่ Notepad++ เนื่องจาก Default Encoding ผมกำหนดเป็น UTF-8 ดังรูป
php-utf8-encoding-problem
ตัว Notepad++ เพิ่มข้อความอะไรสักอย่างในไฟล์ ดังนี้ (เปิดจากไฟล์ปกติจะไม่เจอ ที่เจอเนื่องจากลองใช้ Java อ่านข้อมูลออกมา)

๏ปฟ<?php
session_start();
echo "Session Start...";
?>

ทำให้เกิด error ดังกล่าว วิธีแก้ไขให้ บันทึกรูปแบบ Encoding เป็น Encoding UTF-8 Without BOM ดังรูป
php-utf8-encoding-problem
หวังว่าคนที่เจอปัญหาเดียวกันจะได้แก้ไขได้ถูกทางครับ
เพิ่มเติม 08-02-2011 : เพื่อนที่ทำงานแนะนำว่าให้เพิ่ม ob_start(); ในบรรทัดแรกก็แก้ปัญหาได้เหมือนกัน

ข้อแตกต่างระหว่าง getSession(boolean) กับ getSession()

Note ไว้เป็นข้อจดจำเนื่องจากความจำไม่ดี เวลามีการดึงข้อมูลที่ถูกเก็บไว้ใน session มาใช้งานนั้น จะเห็นว่ามี method ในการ getSession อยู่สองตัวก็คือ getSession(boolean) กับ getSession() ข้อแตกต่างของ method ทั้งสองเป็นดังนี้
1. getSession() ถ้า request ที่เข้ามานั้นมี session อยู่แล้วก็จะทำการส่ง session นั้นคืนมาให้ผู้เรียก แต่ถ้ายังไม่มีก็จะทำการสร้าง sesion ใหม่พร้อมกับสร้าง session id ให้ด้วย ตัวอย่างเช่น

protected void doGet(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException {
		
	HttpSession ss = request.getSession();
	String data = (String) ss.getAttribute("data");
	System.out.println("session data : "+data);
}

ดังนั้นในบรรทัดที่ 5 จะไม่เกิด Error ขึ้นเวลาให้ ss.getAttribute(“xx”);
2. ส่วน getSession(boolean) นั้น parameter boolean ที่ส่งเข้ามาเป็นตัวบ่งบอกว่า ในกรณีที่ยังไม่มี session มาก่อนจะให้สร้าง session ขึ้นมาใหม่หรือไม่ ถ้าเป็น true จะสร้างใหม่ ถ้าเป็น false จะม่มีการสร้าง session ใหม่กรณีที่ยังไม่มี session ตัวอย่างเช่น (Code จากข้อ 1 เปลี่ยนแค่ บรรทัดที่ 5)

HttpSession ss = request.getSession(true);

จะไม่เกิดข้อผิดพลาดในบบรทัดที่ 5 แต่ถ้าเป็นเปลี่ยนเป็น

HttpSession ss = request.getSession(false);

จะเกิด error เป็น java.lang.NullPointerException ที่บรรทัดที่ 5
หมายเหตุ : โดยปกติ session จะถูกสร้างโดยอัตโนมัติ อยู่แล้ว อยากอยากเห็นผลการทำงานให้ทำการ Disable cookies ใน browser ที่ใช้งานก่อน