เอาล่ะหลังจากได้ิแนะนำว่า bug คืออะไร แล้วมันมาอยู่กับโปรแกรมเราอย่างไร และปัญหาที่เจอบ่อยๆ จาก มา debug ด้วยตัวเองกันเถอะ part1 วันนี้ผมจะมาว่ากันต่อถึง bug ที่มือใหม่และมือเก่าเจอกันบ่อยๆเลย หลาย case นะครับผม
ตัวอย่างการ debug ที่ 1
ที่ผมจะยกมาให้ดู ที่หลายๆคนเจอกันบ่อย แม้ว่าทำตามหนังสือแล้วไม่ได้นั้น แบบในหนังสือทำแล้วไม่มี error แต่เราดันมี error คือฟังก์ชั่น header ครับ ฟังก์ชั่น error ที่เจอบ่อยคือ
จากตัวอย่างด้านบนหลายคนคงได้เจอ และงงกับคำตอบที่คนส่วนใหญ่มักจะพูดว่าให้ เอา ฟังก์ชั่นนี้ไปอยู่บนสุด หรือ อย่าให้มีการส่งข้อมูลออกไปก่อน หรือ เอาฟังก์ชั่นนี้ไปไว้บนสุด ob_start(); ซึ่งมือใหม่ที่เขียน php จะไม่เข้าใจว่าอะไรคือการส่งข้อมูลออกไปก่อน หรือว่าในโค้ดของเรานั้นเขียนไปก่อนหน้าฟังก์ชั่นนี้เยอะเยะเช่น
<?php
if(){
}else if() {
} else {
}
header ( ... );
?>
ถ้าเป็นอย่างนี้เราโค้ดไว้จำพวกเช่น เช็คการ login แล้วค่อยอยากให้มันเปลี่ยนหน้าไปโดย automatic แล้วเราก็ทำไม่ได้สิเนี้ย สุดท้ายก็ไปจนต้องเอาฟังก์ัชั่น ob_start(); ไปใส่ทั้งๆที่ไม่รู้ความหมาย ผมก็เคยทำอย่างนั้นมาก่อนครับ จึงอยากรู้อยากเห็นว่าอะไรคือความหมายที่แท้จริงของคำว่า ส่งข้อมูลออกไปก่อน การส่งข้อมูลออกไปนั้นคือการที่หน้าเพจที่ถูก response จาก server แล้วมันมีช่องว่างหรืออะไรที่ถูกส่งออกมาก่อน ไม่ใช่การเขียนโค้ดก่อน เช่น
<?php
echo '';
header("Location " . $_SERVER['PHP_SELF']);
?>
สำหรับการข้างบนแล้วผลออกมาคือ คุณจะได้รับ error อย่างภาพตัวอย่างตอนแรกแต่ถ้าคุณเขียน
<?php
$name = 'firstname';
$lname = 'lastname';
if()
{
//bra bra bra
} else {
header ("Location : " . $_SERVER['PHP_SELF']);
}
?>
โดยก่อนหน้านั้นไม่ได้มีการ echo หรือ print out put ใดๆไปเลยก็ยังสามารถใช้ได้ ส่วนการเอาฟังก์ชั่น ob_start() ไปวางไว้ด้านบนกันคือการแก้ปัญหาอีกแบบหนึ่งที่ไม่แนะนำเพราะ มันเป็นการบอกให้ server เก็บข้อมูลไว้ก่อนโดยยังไม่ีมีการประมวลผล ซึ่งจะเก็บไว้ใน ram ก่อนที่จะส่งให้ฝั่ง client ข้อดี อาจจะเป็นการแก้ปัญหาเรื่องของ header ข้อเสีย คือถ้้าข้อมูลของหน้านั้นเยอะหรือมีรูปมีข้อมูลเยอะจะทำให้ ram หมดซะก่อน
ตัวอย่างการ debug ที่ 2
เป็นตัวอย่างง่ายๆที่หลายคนพลาดแต่แก้ bug ได้ง่ายเหมือนแก้ผ้า นั่นก็คือการลืมเติม “;” เซมิโคลอน ( semicolon) ไว้ตรงการจบบรรทัด เมื่อคุณลืมเติม error ที่แสดงจะเป็นอย่างนี้ครับ
Parse error: syntax error, unexpected ‘;’ in /opt/lampp/htdocs/database/insert.php on line 2
เป็น error ที่เราเจอกันบ่อยๆให้สังเกตุ line ที่เท่าไร แล้วไปดูว่า ฟังก์ชั่น หรือบรรทัดก่อนหน้านั้น หรือบรรทัดนั้น ลืมใส่ “;” หรือไม่
ไว้วันหลังผมจะ update ต่อให้นะครับ แต่ถ้าใครรอไม่ไหวก็ให้ไปดูที่เว็บนี้แล้วกันครับ 13 error ที่เจอบ่อยๆ ( ภาษาอังกฤษนะเธอว์ )