วิธีแก้ไข 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
แบบนี้ 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 หรือไม่ก็ตาม
-------------
ส่งท้ายหน้าเกี่ยวกับการเขียน $_GET[id] กับ $_GET['id'] มันก็มี Notice นะ
แต่จำไม่ได้ว่ามันแจ้งว่าอะไร คือมันจะบอกเราว่า ค่า GET ที่แกส่งมา
มันไม่มีชื่อตัวแปรที่ว่านี้นะ
หมายถึง ถ้าเราใส่ว่า id เฉยๆ โดยไม่มี "ฟันหนู" หรือ quote, double qoute
มันจะวิ่งไปหา index ตัวแปรที่เป็น defined หรือ ตัวแปรที่เป็นค่า constant
ของระบบ อาทิ __FILE__ อะไรทำนองนี้
ทางที่ดี หากเราต้องใช้ ก้ามปู [] ให้เราใส่ '' เข้าไปด้วยครับ
*** ยกเว้น array ที่ใช้ตัวเลข ไม่ต้องใส่ก็ได้ครับ