7/29/2556

วิธีแก้ไข PHP Notice: Undefined index, Notice: Undefined variable

วิธีแก้ไข PHP Notice: Undefined index, Notice: Undefined variable


ก็เขียน php มาตั้งนานและ แต่ใน version เก่าๆ ที่ต่ำกว่า PHP 5.3 มันจะไม่แสดง Error Warning ให้เราเห็น นอกจากเราจะไปกำหนดมันขึ้นมาเอง เพื่อเพิ่มงานให้ตัวเอง 555+ สิ่งแรกที่โปรแกรมเมอร์จะพบเวลาเขียนโปรแกรมเสร็จสิ้น มันจะมี Error หมายถึง Error จริงๆ ที่มีการทำงานผิดพลาด หรือเราเรียกว่า Bug นั่นแหละ อันนี้ก็แก้ไขไปตามเนื้อผ้า Error บรรทัดไหนก็ไปส่องบรรทัดนั้น หรือ scope ของงานนั้น จนแก้เสร็จสมบูรณ์

แต่มีใครจะรู้บ้างว่า ความจริงแล้วมันยังมี Error ที่ sensitive มากกว่านั้น ก็คือ Notice หรือการแจ้งเตือน มัน Sensitive ขนาดที่ว่า ตัวแปรใด ที่เราประกาศขึ้นมา แต่ไม่ได้กำหนดค่า หรือเอามาใช้แบบโท่งๆ มันจะแจ้งเตือนทันที แต่ต้องทำความเข้าใจก่อนว่า มันไม่ใช่ "ข้อผิดพลาด" แต่มันเป็นการ "แจ้งให้ทราบ" ซึ่ง มันก็มักจะแสดงผลให้เรารำคาญใจใน browser อยู่ไม่น้อย ตัวอย่างที่พบง่ายที่สุด อาทิเช่น

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


1
echo $_GET['id'];
แบบนี้ Notice: undefined index

Undefined index  หมายถึง ตัวแปรที่เราเอามาใช้ ยังไม่ได้ประกาศตัวแปร วิธีแก้ไขง่ายที่สุดก็คือใช้ isset() คือถ้ามันมีค่าก็จะ return true ถ้าไม่มีก็จะ return false แค่นั้น ตัวอย่างการแก้ไขปัญหาดังนี้

1
2
3
if (isset($_GET['id'])) {
    echo $_GET['id']
}
* แต่โดยมากแล้วผมจะใช้แบบนี้แทน คือกำหนดตัวแปรให้มันชัดเจนไปเลย ไม่ต้องไปใช้ $_GET, $_POST ดังนี้ครับ


1
$get_id = (isset($_GET['id'])) ? $_GET['id'] : '';

อธิบาย หมายถึง ถ้ามีค่า $_GET['id'] ก็ให้ $get_id = ค่าที่ $_GET มา ถ้าไม่มีก็เป็นค่าว่างไป โดนแบบที่ผมใช้มันจะเป็นแบบย่อ ถ้าเขียนให้ยาวขึ้นก็แบบนี้ครับ


1
2
3
4
5
if (isset($_GET['id'])) {
    $get_id = $_GET['id'];
} else {
    $get_id = '';
}
** ถ้าเราไม่กำหนด $get_id = ''; เดี๋ยวมันจะ Notice: Undefined variable ตอนนำไปใช้อีก!!

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


1
2
3
4
if ($i & lt; 10) {
    echo $i;
    $i++
}
แบบนี้ Notice: Undefined variable
Undefined variable หมายถึง ตัวแปรที่เราประกาศ มันไม่ใช่ตัวแปร (เอ๊ะยังไงวุ้ย) คือเราไม่ได้ระบุค่าให้มันครับ ว่ามันเป็น string,boolean,integer บลาๆ หรือเป็นค่าว่าง ดังนั้นเวลา PHP มันค้น index file มันจะไม่พบชื่อตัวแปรที่เราเอามาใช้ เลยแจ้่งว่า เฮ้ย แกยังไม่ได้กำหนดค่าให้ตัวแปรนะ อยู่จะเอามาใช้อย่างงี้ได้ยังไง มันอันตรายรู็้้มั้ย ว่าถ้า host ที่ใช้ไม่ได้ัตั้ง register_global = off จะโดยคนอื่นเขาสุ่มชื่อตัวแปร เข้ามาแก้ไขการทำงานของระบบเองง่ายๆ นะจ๊ะ เพราะว่ามันไป index ตัวแปรจากที่อื่น ทีไ่หนก็ได้ เพราะเราไม่ได้กำหนดไว้ (งงมะ)

วิธีแก้ไขที่ง่ายที่สุด ก็แค่เติม $i = 0; หรือกำหนดค่า NULL ให้มันก็ได้ครับ

1
2
3
4
5
$i = 0;
if ($i & lt; 10) {
    echo $i;
    $i++
}

แต่ทั้งนี้ทั้งนั้น บางทีเราแก้แล้วจนเหนื่อย มันก็ยังมี Notice ขึ้นมาอีก จนน่าำรำคาญ เพราะบางครั้งเราำจำเป็นต้องใช้ $_SESSION หรืออะไรก็ตามที่เป็นตัวแปรที่ไม่ได้ประกาศไว้แต่ต้น ลองนึกดูซิครับว่า ถ้าเราต้องมาประกาศตัวแปรทั้งหมด ว่าใช้อะไรบ้าง แบบเดียวกับ C,C++ มันจะมากมายขนาดไหน!!!

วิธีแก้ที่กากที่สุดเท่าที่โปรแกรมเมอร์คนนึงจะทำได้ ก็คือ "ปิดมันซะ" ไม่ต้องแจ้งเจิ้งให้รำคาญตา เอาแค่ Error พอแล้ว โดยการใส่


1
error_reporting (E_ALL ^ E_NOTICE);

ไว้บรรทัดบนสุดของไฟล์, ถ้ามี index.php ก็ใส่ไว้ที่นั่นก็ได้ ไม่ต้องไปใส่ซ้ำพร่ำเพรื่อ เพียงเท่านี้มันก็จะไม่สนใจแล้วว่า คุณจะประกาศตัวแปรหรือไม่ประกาศ มันจะซ่อน Notice ทั้งหมดไม่ให้มารบกวนเราอีกต่อไป

หรือ

ไม่ต้องปิด แต่ใส่ @ เข้าไปหน้าตัวแปรนั้น เพื่อบังคับมันทำงานโดยไม่ต้องสนใจว่าจะ error หรือไม่ก็ตาม


1
echo @$id;
-------------

ส่งท้ายหน้าเกี่ยวกับการเขียน $_GET[id] กับ $_GET['id'] มันก็มี Notice นะ แต่จำไม่ได้ว่ามันแจ้งว่าอะไร คือมันจะบอกเราว่า ค่า GET ที่แกส่งมา มันไม่มีชื่อตัวแปรที่ว่านี้นะ


หมายถึง ถ้าเราใส่ว่า id เฉยๆ โดยไม่มี "ฟันหนู" หรือ quote, double qoute มันจะวิ่งไปหา index ตัวแปรที่เป็น defined หรือ ตัวแปรที่เป็นค่า constant ของระบบ อาทิ __FILE__ อะไรทำนองนี้


ทางที่ดี หากเราต้องใช้ ก้ามปู [] ให้เราใส่ '' เข้าไปด้วยครับ


*** ยกเว้น array ที่ใช้ตัวเลข ไม่ต้องใส่ก็ได้ครับ

0 ความคิดเห็น:

แสดงความคิดเห็น