ปัญหาการใช้ session_start() และ header() เขียนเมื่อ 2009.07.04 โดย

ถูกถามหลายครั้งสำหรับคำสั่ง session_start และ header ซึ่งเมื่อวางไว้ไม่ถูกที่ทำใช้เกิดข้อผิดพลาดแสดงออกมา และไม่สามารถตอบคำถามได้ด้วยตนเอง

หลายคนที่เคยประสบปัญหาและถ้าไปถามในเว็บบอร์ด ก็จะมีคนบอกว่าให้วางไว้บนสุดของไฟล์ ทำไม??? ทราบไหมครับ วันนี้เรามาดูกัน

PHP ที่ถูกนำมาใช้กันเพื่อพัฒนาเว็บไซท์/แอปปลิเคชั่น ทำงานอยู่บน http protocol (หวังว่าคงรู้อยู่แล้ว) http เป็นลักษณะของการสื่อสารของ text (ทั้งหมดสามารถแทนด้วยอักขระได้/อ่านออกได้) แต่จะแบ่งออกเป็น 2 ส่วน คือ
  1. header เป็นส่วนที่ใช้ในการอธิบายเอกสาร เช่น encoding, mime type, status ฯลฯ เพื่อให้โปรแกรมที่เรียกใช้/เปิดอ่านเอกสาร แสดงผลได้อย่างถูกต้อง
  2. content เป็นส่วนที่เป็นข้อมูลในการแสดงผล (ในที่นี้ก็คือ code html นั่นเอง)
ทุกๆ ครั้งหลังจากการร้องขอ (request) เอกสารไปยังเซิร์ฟเวอร์นั้น จะมีการตอบรับกลับมายังโปรแกรมที่ร้องขอ (ในที่นี้ก็คือ web browser นั้นเอง) โดยเรียงลำดับจาก header แล้วตามด้วย content

มาถึงตรงนี้หลายคนคงทราบแล้ว่าทำไม header ถึงต้องวางไว้ต้นๆ ของเอกสาร แล้ว session_start ล่ะ??

session เป็นการทำงานร่วมกันของ Server และ Browser ซึ่ง Server จะมีการบอกให้ Browser เก็บข้อมูลเกี่ยวกับ Session ไว้ด้วยซึ่งข้อมูลเหล่านี้ไม่ใช่ content ดังนั้นการบอกให้ Browser ทำงานเพื่อเอาข้อมูลหล่านั้นไปใช้กับเอกสาร จึงจำเป็นต้องส่งไปในส่วนของ header ของเอกสาร นี่จึงเป็นคำตอบว่าทำไมต้องวางไว้ส่วนต้นของเอกสาร

ปัญหาคือควรวางไว้ตรงไหนดี บางคนคงเคยพบว่าวางไว้ส่วนต้นของเอกสารแล้ว แต่บางครั้งก็ยังแสดงข้อผิดพลาดอีก ในบางครั้ง เท่าที่เคยพบมักจะเขียนเช่น
PHP
  1. <?
  2. include("conn.php");
  3. header("...");
  4. ?>
  5. <html>
  6. .....

ก็คงคิดว่านี่ก็ส่วนต้นของเอกสารแล้วนี่ ก่อน tag html แล้วทำไมยังแจ้งผิดพลาดอีก ก็เพราะว่าไฟล์ conn.php มีข้อผิดพลาด เมื่อมีข้อผิดพลาดตัวแปลภาษา PHP จะทำการสร้างข้อความบอกความผิดพลาดให้แสดงผล นั่นก็คือ PHP เริ่มทำการส่งข้อมูลในส่วนของ content แล้ว หมายความว่าทั้ง session_start และ header ของคุณอยู่ในส่วนของ content แล้ว

วิธีแก้ก็อาจจะเปลี่ยนเป็น
PHP
  1. <?
  2. header("...");
  3. include("conn.php");
  4. ?>
  5. <html>
  6. .....

แต่จริงๆก็ไม่ใช่คำตอบที่ตรงคำถามเท่าไหร่ เพราะยังไง conn.php ก็ยังผิดพลาดอยู่ดี ซึ่งแก้ที่ conn.php น่าจะตรงคำถามมากกว่า



คำเตือนคำเตือน เนื้อหาต่างๆ ในบทความ รวมถึงรูปภาพทั้งหมดในบทความนี้ เป็นความเห็นส่วนตัวของผู้เขียนแต่ละคน ซึ่งแต่ละคนได้ทำการลงทะเบียน และเขียนบทความลงใน Modoeye Articles นี้โดยไม่มีค่าธรรมเนียมใดๆ บทความเหล่านี้เป้าหมายเพื่อการศึกษา และความบันเทิงเท่านั้น การนำส่วนหนึ่งส่วนใดของบทความไปใช้งาน ควรทำการอ้างอิงถึงผู้เขียนและแหล่งที่มาด้วย