มา Debug ด้วยตัวเองกันเถอะ part2

เอาล่ะหลังจากได้ิแนะนำว่า bug คืออะไร แล้วมันมาอยู่กับโปรแกรมเราอย่างไร และปัญหาที่เจอบ่อยๆ จาก มา debug ด้วยตัวเองกันเถอะ part1 วันนี้ผมจะมาว่ากันต่อถึง bug ที่มือใหม่และมือเก่าเจอกันบ่อยๆเลย หลาย case นะครับผม

ตัวอย่างที่ 1

ที่ผมจะยกมาให้ดู ที่หลายๆคนเจอกันบ่อย แม้ว่าทำตามหนังสือแล้วไม่ได้นั้น แบบในหนังสือทำแล้วไม่มี error แต่เราดันมี error คือฟังก์ชั่น header ครับ ฟังก์ชั่น error ที่เจอบ่อยคือ

จากตัวอย่างด้านบนหลายคนคงได้เจอ และงงกับคำตอบที่คนส่วนใหญ่มักจะพูดว่าให้ เอา ฟังก์ชั่นนี้ไปอยู่บนสุด หรือ อย่าให้มีการส่งข้อมูลออกไปก่อน หรือ เอาฟังก์ชั่นนี้ไปไว้บนสุด ob_start(); ซึ่งมือใหม่ที่เขียน php จะไม่เข้าใจว่าอะไรคือการส่งข้อมูลออกไปก่อน หรือว่าในโค้ดของเรานั้นเขียนไปก่อนหน้าฟังก์ชั่นนี้เยอะเยะเช่น

[php]

<?php

if(){

}else if() {

} else {

}

header ( … );

?>

[/php]

ถ้าเป็นอย่างนี้เราโค้ดไว้จำพวกเช่น เช็คการ login แล้วค่อยอยากให้มันเปลี่ยนหน้าไปโดย automatic แล้วเราก็ทำไม่ได้สิเนี้ย สุดท้ายก็ไปจนต้องเอาฟังก์ัชั่น ob_start(); ไปใส่ทั้งๆที่ไม่รู้ความหมาย ผมก็เคยทำอย่างนั้นมาก่อนครับ จึงอยากรู้อยากเห็นว่าอะไรคือความหมายที่แท้จริงของคำว่า ส่งข้อมูลออกไปก่อน การส่งข้อมูลออกไปนั้นคือการที่หน้าเพจที่ถูก response จาก server แล้วมันมีช่องว่างหรืออะไรที่ถูกส่งออกมาก่อน ไม่ใช่การเขียนโค้ดก่อน เช่น

[php]

<?php

echo ‘ ‘;

header("Location " . $_SERVER[‘PHP_SELF’]);

?>
[/php]

สำหรับการข้างบนแล้วผลออกมาคือ คุณจะได้รับ error อย่างภาพตัวอย่างตอนแรกแต่ถ้าคุณเขียน

[php]

<?php

$name = ‘firstname’;

$lname = ‘lastname’;

if()

{

//bra bra bra

} else {

header ("Location : " . $_SERVER[‘PHP_SELF’]);

}

?>

[/php]

โดยก่อนหน้านั้นไม่ได้มีการ echo หรือ print out put ใดๆไปเลยก็ยังสามารถใช้ได้ ส่วนการเอาฟังก์ชั่น ob_start() ไปวางไว้ด้านบนกันคือการแก้ปัญหาอีกแบบหนึ่งที่ไม่แนะนำเพราะ มันเป็นการบอกให้ server เก็บข้อมูลไว้ก่อนโดยยังไม่ีมีการประมวลผล ซึ่งจะเก็บไว้ใน ram ก่อนที่จะส่งให้ฝั่ง client  ข้อดี อาจจะเป็นการแก้ปัญหาเรื่องของ header ข้อเสีย คือถ้้าข้อมูลของหน้านั้นเยอะหรือมีรูปมีข้อมูลเยอะจะทำให้ ram หมดซะก่อน

ตัวอย่างที่ 2

เป็นตัวอย่างง่ายๆที่หลายคนพลาดแต่แก้  bug ได้ง่ายเหมือนแก้ผ้า นั่นก็คือการลืมเติม “;” เซมิโคลอน ( semicolon) ไว้ตรงการจบบรรทัด เมื่อคุณลืมเติม error ที่แสดงจะเป็นอย่างนี้ครับ

Parse error: syntax error, unexpected ‘;’ in /opt/lampp/htdocs/database/insert.php on line 2

เป็น error ที่เราเจอกันบ่อยๆให้สังเกตุ line ที่เท่าไร แล้วไปดูว่า ฟังก์ชั่น หรือบรรทัดก่อนหน้านั้น หรือบรรทัดนั้น ลืมใส่ “;” หรือไม่

ไว้วันหลังผมจะ update ต่อให้นะครับ แต่ถ้าใครรอไม่ไหวก็ให้ไปดูที่เว็บนี้แล้วกันครับ 13 error ที่เจอบ่อยๆ ( ภาษาอังกฤษนะเธอว์ )