ข้อผิดพลาด 8 ข้อที่ทำให้เกิด Error บ่อยๆ

ในการเขียนสคริปต์ มีสิ่งหนึ่งที่ค่อนข้างตายตัวเลยว่าคงไม่มีใครสามารถเขียนสคริปต์ออกมาได้ เลิศเลอเพอร์เฟกต์ ขนาดที่ว่าไม่มีข้อผิดพลาดเลย บทความนี้ก็จะมาพูดถึงข้อผิดพลาดเล็กๆน้อยๆ ที่เกิดขึ้นบ่อยครั้ง และมองเห็นได้ยากพอสมควรเคยเป็นบ้างไหมว่ามันน่าเจ็บใจยิ่งนักที่ค้นหาข้อผิดพลาดเป็นชั่วโมงๆ แต่ท้ายสุดเพียงแก้ไขตัวอักษรตัวเดียว สคริปต์ก็ทำงานได้แล้ว
การที่เราให้เวลากับการเขียนสคริปต์เป็นเวลานานๆ อาจทำให้เกิดความมึนงง และสร้างข้อผิดพลาดได้ง่ายขึ้น ซึ่ง 8 ข้อผิดพลาดที่เราจะพูดถึงนี้เป็นข้อผิดพลาดที่เกิดขึ้นบ่อยครั้งกับตัวผม และบางทีผมก็พบว่าเรามองข้ามมันไปได้ง่ายๆ แล้วไปสนใจกับส่วนอื่นๆ ที่อาจไม่มี error เลย ซึ่งทำให้เสียเวลาเป็นอย่างมากเลยทีเดียว
ถึงแม้ว่ามันจะเป็นเรื่องพื้นๆ แต่ผมคิดว่ามันก็สร้างปัญหาได้ไม่น้อยเหมือนกัน

มีอะไรบ้าง?

  • เครื่องหมายอัฒภาค (semicolon ; ) หายไป
  • เครื่องหมายเท่ากับ (= หรือ ==)
  • การพิมพ์ชื่อตัวแปรผิด
  • เครื่องหมายดอลล่าร์ที่หายไป
  • เครื่องหมายอัญประกาศ
  • ฟังค์ชั่นพิเศษ
  • ทำงานกับอะเรย์
  • เครื่องหมายปิดเปิดไม่ครบ

เครื่องหมายอัฒภาค (semicolon ; ) หายไป

การทำงานของ php จะคล้ายกับภาษาจำพวก Java ที่ถือว่าการขึ้นบรรทัดใหม่ ไม่ใช่จุดสิ้นของคำสั่งที่เรียกใช้งาน เมื่อเราต้องการบอก php ว่าคำสั่งนี้สิ้นสุดแล้ว ก็จะต้องใช้เครื่องหมายอัฒภาค ซึ่งในบางโอกาสเราก็ลืมได้ง่าย เช่นการขึ้นบรรทัดใหม่เลยโดยที่ไม่ได้ใช้เครื่องหมาย ; ต่อท้ายบรรทัดก่อนหน้า

เครื่องหมายเท่ากับ

เหตุการณ์นี้เกิดขึ้นกับผมค่อนข้างบ่อย โดยเฉพาะเวลาที่เราใช้ร่วมกับ if เช่น…

<?
if($foo = 'bar')
{
      echo 'equal';

}
?>

ในกรณีด้านบน ไม่ว่าในตัวแปร $foo จะมีอะไร เราก็จะได้ equal ออกมาตลอด เพราะอะไรหรือ?
ในส่วนของข้อกำหนดของ if เราได้ใส่ $foo = ‘bar’ เอาไว้ ซึ่งการใช้เครื่องหมายเท่ากับเพียงอันเดียว เป็นการนำข้อมูลที่อยู่ทางด้านขวา ใส่ลงไปในด้านซ้ายของเครื่องหมายเท่ากับ และในกรณีแบบนี้ ในส่วนของ if ก็จะได้ค่าเป็น TRUE เสมอ เพราะเราสามารถใส่ข้อความลงไปในตัวแปร $foo ได้ มันจึงขึ้นข้อความ equal ออกมาตลอด ถึงแม้ว่า $foo จะไม่เท่ากับ bar
สคริปต์ที่ถูกต้อง จะต้องใช้ $foo == ‘bar’ ซึ่งเป็นเหมือนการถามว่า $foo มีค่าเป็น bar หรือไม่ ถ้าไม่ มันก็จะคืนค่าเป็น FALSE และเมื่อ $foo ไม่เท่ากับ bar มันก็จะไม่แสดงผลลัพธ์ เพราะฉะนั้น ระวังว่าการใช้เครื่องหมายเท่ากับในกรณีไหน ต้องใช้กี่ตัว หากเป็นการกำหนดค่าให้กับตัวแปร ก็ใช้ = ครั้งเดียว แต่ถ้าเป็นการเปรียบเทียบ ต้องเป็น ==

การพิมพ์ชื่อตัวแปรผิด

เนื่องจาก php จะประมวลผลในแบบ case-sensitive ซะส่วนใหญ่ เราจึงต้องมีความระมัดระวังในเรื่องของการใช้ตัวเล็กตัวใหญ่เวลาตั้งชื่อ
$testVariable เป็นคนละตัวแปรกับ $testvariable

เครื่องหมายดอลล่าร์ที่หายไป

เคยบ้างไหมเวลาที่เราลืมตัว แล้วลืมพิมพ์เครื่องหมาย $ ด้านหน้าตัวแปร ซึ่งทำให้ php เกิด error ขึ้นได้ ถ้ามันเป็น constant ก็ว่าไปอีกเรื่องหนึ่ง แต่ถ้าหากเป็นตัวแปร จะต้องมี $ อยู่ด้านหน้าชื่อตัวแปรเสมอ

เครื่องหมายอัญประกาศ

การกำหนดข้อความให้เป็น string ใน php มีอยู่สองแบบ คือการล้อมรอบข้อความด้วย ‘ ขีดเดียว หรือ ” แบบสองขีด ซึ่งจะให้ความหมายค่อนข่างต่างกัน
ในส่วนของ ‘ ขีดเดียว เราจะไม่สามารถใส่ escape character ได้ และไม่มีความจำเป็นที่จะต้อง escape ตัวอักษรจำพวก \t \n ฯลฯ แต่ถ้าหากคุณต้องการเชื่อมตัวแปรกับเข้ากับข้อความ ก็จะต้องมีการปิดเครื่องหมายก่อน แล้วตามด้วยเครื่องหมายเชื่อมข้อความ นั่นคือ . เช่น…

<?
$foo = 'bar ' . $text . ' bar';

?>

แต่ เมื่อคุณใช้ ” สองขีด หากคุณต้องใช้เครื่องหมายจำพวก /n แต่ไม่ต้องการให้เป็นการขึ้นบรรทัดใหม่ การใส่เครื่องหมายคำพูดลงในข้อความ ก็จะต้องมีการ escape ก่อน
ใส่ / ไว้ที่ด้านหน้าของตัวอักษรที่ต้องการ escape เช่น ใช้ /” แทน ” ธรรมดา

ฟังค์ชั่นพิเศษ

ฟังค์ชั่นบางอย่าง อาจจะมีความต้องการมากกว่าฟังค์ชั่นทั่วๆไป เช่น บางฟังค์ชั่นจะใช้ได้ก็ต่อเมื่อเราลง library เพิ่ม เช่นการใช้งาน GD หากเราไม่ได้ลงไว้ แต่เรียกใช้ฟังค์ชั่น มันก็จะขึ้น error
ฟังค์ชั่นอีกจำพวกนึงที่มีความต้องการพิเศษ ก็จำพวก header() ที่จะต้องใช้ในส่วนบนสุดของไฟล์ เช่น

<?

header("Location: http://www.21nu.net");
?>

โค๊ด ด้านบนจะเห็นได้ว่ามีบรรทัดว่างๆอยู่ก่อนหน้าที่เราจะเปิด <? ซึ่งจะทำให้เกิด error ทันที เพราะ header จะต้องอยู่ส่วนบนสุด ห้ามไม่ให้มีข้อความใดๆถูกส่งไปก่อน ถึงแม้ว่าจะเป็นช่องว่างก็ตาม โค๊ดที่ทำงานได้จะต้องเป็นดังนี้…

<?
header("Location: http://www.21nu.net");
?>

ทำงานกับอะเรย์

การนับเลขในอะเรย์ เริ่มจาก 0 เสมอ ไม่ใช่หนึ่ง เช่น

<?
$foo = array("apple", "banana", "coconut");
?>

หากเราต้องการเรียกใช้ apple ก็จะต้องเรียก $foo[0] หากเรียก $foo[1] ก็จะได้ banana ครับ

เครื่องหมายปิดเปิดไม่ครบ

เมื่อเราต้องใช้ control structures บวกกับฟังค์ชั่นอื่นๆหลายๆอัน อาจทำให้เกิดความสับสน และปิดวงเล็บไม่ครบด้วย จึงต้องระวังเอาไว้ นับวงเล็บเปิดกับปิดให้ดี

<?
if(isset($foo)
{
       echo '$foo is set';
} else {

      for($i=0;$i < 5; $i++)
      {
             echo '$foo is not set';

}
?>

หาเจอหรือไม่ ว่าปิดไม่ครบตรงไหนบ้าง

Comments (3)

MegaGodOctober 5th, 2008 at 6:18 pm

พวก escape เค้าใช้ \ ไม่ใช่เหรอคับ ไม่น่าจะเป็น / นะ
ถ้าผมเข้าใจผิด โปรดชี้แนะด้วย

[Reply]

nattsterOctober 5th, 2008 at 9:20 pm

ขอบคุณครับ…ผิดพลาดในบทความจริงๆ ด้วย

[Reply]

winmaxJanuary 5th, 2009 at 12:08 am

เหอะ ส่วนตัวผมจะมีข้อผิดพลาดมากกว่านี้อีกคับ เขียนฟังชั่นแล้วลืมสั่งให้มันทำงานหนะ เหอๆ บ่อยมากๆ

ว่่าแต่ คิดถึง try2hack จังคับ เว็บผู้มีพระคุณ ถ้าไม่มี try2hack ก็ไม่มีผมวันนี้อ่ะ อย่าทิ้งนะคับ

[Reply]

Leave a comment

Your comment