แต่มีใครจะรู้บ้างว่า ความจริงแล้วมันยังมี 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' ] : '' ; |
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 < 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 < 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 ที่ใช้ตัวเลข ไม่ต้องใส่ก็ได้ครับ
----------------------------------------------------------------------------------
cerdit : http://moremeng.blogspot.com/
----------------------------------------------------------------------------------