ถูกถามหลายครั้งสำหรับคำสั่ง session_start และ header ซึ่งเมื่อวางไว้ไม่ถูกที่ทำใช้เกิดข้อผิดพลาดแสดงออกมา และไม่สามารถตอบคำถามได้ด้วยตนเอง
หลายคนที่เคยประสบปัญหาและถ้าไปถามในเว็บบอร์ด ก็จะมีคนบอกว่าให้วางไว้บนสุดของไฟล์
ทำไม??? ทราบไหมครับ วันนี้เรามาดูกัน
PHP ที่ถูกนำมาใช้กันเพื่อพัฒนาเว็บไซท์/แอปปลิเคชั่น ทำงานอยู่บน http protocol (หวังว่าคงรู้อยู่แล้ว) http เป็นลักษณะของการสื่อสารของ text (ทั้งหมดสามารถแทนด้วยอักขระได้/อ่านออกได้) แต่จะแบ่งออกเป็น 2 ส่วน คือ
- header เป็นส่วนที่ใช้ในการอธิบายเอกสาร เช่น encoding, mime type, status ฯลฯ เพื่อให้โปรแกรมที่เรียกใช้/เปิดอ่านเอกสาร แสดงผลได้อย่างถูกต้อง
- content เป็นส่วนที่เป็นข้อมูลในการแสดงผล (ในที่นี้ก็คือ code html นั่นเอง)
ทุกๆ ครั้งหลังจากการร้องขอ (request) เอกสารไปยังเซิร์ฟเวอร์นั้น จะมีการตอบรับกลับมายังโปรแกรมที่ร้องขอ (ในที่นี้ก็คือ web browser นั้นเอง) โดยเรียงลำดับจาก header แล้วตามด้วย content
มาถึงตรงนี้หลายคนคงทราบแล้ว่าทำไม header ถึงต้องวางไว้ต้นๆ ของเอกสาร
แล้ว session_start ล่ะ??session เป็นการทำงานร่วมกันของ Server และ Browser ซึ่ง Server จะมีการบอกให้ Browser เก็บข้อมูลเกี่ยวกับ Session ไว้ด้วยซึ่งข้อมูลเหล่านี้ไม่ใช่ content ดังนั้นการบอกให้ Browser ทำงานเพื่อเอาข้อมูลหล่านั้นไปใช้กับเอกสาร จึงจำเป็นต้องส่งไปในส่วนของ header ของเอกสาร นี่จึงเป็นคำตอบว่าทำไมต้องวางไว้ส่วนต้นของเอกสาร
ปัญหาคือควรวางไว้ตรงไหนดี บางคนคงเคยพบว่าวางไว้ส่วนต้นของเอกสารแล้ว แต่บางครั้งก็ยังแสดงข้อผิดพลาดอีก ในบางครั้ง เท่าที่เคยพบมักจะเขียนเช่น
PHP
<?
include("conn.php");
?>
<html>
.....
ก็คงคิดว่านี่ก็ส่วนต้นของเอกสารแล้วนี่ ก่อน tag html แล้วทำไมยังแจ้งผิดพลาดอีก ก็เพราะว่าไฟล์ conn.php มีข้อผิดพลาด เมื่อมีข้อผิดพลาดตัวแปลภาษา PHP จะทำการสร้างข้อความบอกความผิดพลาดให้แสดงผล นั่นก็คือ PHP เริ่มทำการส่งข้อมูลในส่วนของ content แล้ว หมายความว่าทั้ง session_start และ header ของคุณอยู่ในส่วนของ content แล้ว
วิธีแก้ก็อาจจะเปลี่ยนเป็น
PHP
<?
include("conn.php");
?>
<html>
.....
แต่จริงๆก็ไม่ใช่คำตอบที่ตรงคำถามเท่าไหร่ เพราะยังไง conn.php ก็ยังผิดพลาดอยู่ดี ซึ่งแก้ที่ conn.php น่าจะตรงคำถามมากกว่า
เขียนเมื่อ 2009.07.04 โดย
Sheroku