โดยปกติแล้ว เวลาที่เราเขียนโปรแรกมโดยใช้ php เมื่อมันทำงานผิดพลาดมันจะแจ้งให้เราทราบว่ามี Error ตรงบรรทัดไหนอย่างไร ซึ่งมีประโยชน์มากเวลาเขียนโปรแกรม แต่ถ้าหากว่าข้อมูลของ Error ตัวนั้นไปแสดงที่หน้า website ที่เราเอาขึ้นไปใช้จริงๆ แล้วจะเกิดอะไรขึ้นหากว่า hacker ได้ข้อมูลพวกนี้ไป วันนี้เรามาทำการป้องกันไม่ให้ php แสดง Error ออกมาเวลาที่ทำงานผิดพลาดกันดีกว่า
วันนี้มาทำการป้องกันไม่ให้ php แสดง Error ออกมาเวลาที่ทำงานผิดพลาดกันดีกว่า โดยปกติแล้ว เวลาที่เราเขียนโปรแกรมโดยใช้ php เมื่อมันทำงานผิดพลาดมันจะแจ้งให้เราทราบว่า ผิดที่บรรทัดไหน เพราะอะไร ซึ่งจะเป็นการช่วยเราได้มากเวลาที่เขียนโปรแกรม
แต่ถ่าหากว่า เวลาที่เราเอาขึ้นไปใช้จริงๆ บน website แล้วและเกิดว่ามี Error ขึ้นมาก็อาจจะทำให้ มีผู้ที่ไม่หวังดี หรือพวก hacker นั้นแหละ รู้ระบบการทำงานของโปรแกรมของเราได้ ดังนั้นวันนี้เราจะมาเรียนรู้วิธีการสังไม่ให้ php แสดง Error ออกมา
บาง คนอาจจะบอกว่า ผมเขียนโปรแกรมดีแล้วไม่มี Error เหรอกเพราะทดสอบมาทุกขั้นตอนแล้ว มันก็คงจะจริงครับว่าคุณเขียนมาดีแล้ว แต่ถ้าหากว่าวันหนึง Database ที่คุณใช้ เกิดหยุดทำงานขึ้นมา ไม่ว่าจะด้วยอะไรก็ตาม รับรองได้ว่าคำสั่ง php ที่คุณใช้ในการ connect database จะต้อง Error ออกมาอย่างแน่นอน
ในการสังให้ php ไม่แสดง Error เวลาที่โปรแกรมทำงานผิดพลาดสามารถทำได้ 2 วิธีคือ
1.ไม่ให้แสดง Error เฉพาะตรงคำสั่งที่ต้องการ โดยการใช้ @
2.ไม่ให้แสดง Error ทั้งหมดไม่ว่าจะด้วย กรณีใดๆทั้งสิ้น โดยการใช้ @ini_set(‘display_errors’, ‘0’);
ไม่ให้แสดง Error เฉพาะตรงคำสั่งที่ต้องการ โดยการใช้ @
ในการสั่งให้ php ไม่ต้องแสดง Error ออกมาเวลาที่โปรแกรมทำงานผิดพลาดแบบเฉพาะจุด เราสามารถใส่ เครื่องหมาย @ ข้างหน้าคำสั่ง ที่เราต้องการได้ มาดูตัวอย่าง
error1.php
1 2 3 4 5 6 7 8 | <?php $filename = "test.txt"; $handle = fopen($filename, "r"); $contents = fread($handle, filesize($filename)); fclose($handle); print $contents; ?> |
จากตัวอย่างเป็นการอ่าน file test.txt ซึ่งหากว่าไม่พบ file นี้ก็จะแสดง error ออกมาแบบนี้
1 2 3 4 5 6 7 | Warning: fopen(test.txt): failed to open stream: No such file or directory in D:exampleerror1.php on line 3 Warning: filesize(): Stat failed for test.txt (errno=2 - No such file or directory) in D:exampleerror1.php on line 4 Warning: fread(): supplied argument is not a valid stream resource in D:exampleerror1.php on line 4 Warning: fclose(): supplied argument is not a valid stream resource in D:exampleerror1.php on line 5 |
จาก Error ที่เราเห็นก็จะทราบได้ว่า มีความผิดพลาดเกิดขึ้นจากทั้งหมด 5 function คือ fopen,filesize,fread,fclose ที่นี้เราก็จะมาใส่ @ ไว้ที่หน้า function เหล่านี้ดูบ้าง
error2.php
1 2 3 4 5 6 7 8 9 | <?php $filename = "test.txt"; $handle = @fopen($filename, "r"); $contents = @fread($handle, @filesize($filename)); @fclose($handle); print $contents; ?> |
จากตัวอย่างเวลาที่เรา run โปรแกรม จะพบว่าไม่มี Error อะไร ขึ้นมาให้เราเห็นเลย
ไม่ให้แสดง Error ทั้งหมดไม่ว่าจะด้วย กรณีใดๆทั้งสิ้น โดยการใช้ @ini_set(‘display_errors’, ‘0’);
ในแบบที่ 2 เป็นวิธีการที่จะกำหนดไม่ให้แสดง Error ของทั้งหน้าไม่ว่าจะเป็นที่คำสั่งไหนก็ตาม วิธีนี้สะดวกตรงที่เราไม่ต้องไป นั้งใส่ @ ในทุกๆ function ที่เราต้องการ เพราะว่าเราแค่นำคำสั่ง @ini_set(‘display_errors’, ‘0’); ไปไว้ที่บรรทัดแรกสุดของหน้า ที่เราไม่ต้องการให้แสดง Error ก็สามารถที่จะใช้ได้แล้ว ไปดูตัวอย่างกัน
error3.php
1 2 3 4 5 6 7 8 9 10 | <?php @ini_set('display_errors', '0'); $filename = "test.txt"; $handle = fopen($filename, "r"); $contents = fread($handle, filesize($filename)); fclose($handle); print $contents; ?> |
จากตัวอย่างถ้าหากว่าเราเปลี่ยนจาก @ini_set(‘display_errors’, ‘0’); ให้เป็น @ini_set(‘display_errors’, ‘1’); ก็จะเป็นการสั่งให้ แสดง Error ออกมาตามปกติ
คำแนะนำ : ใน ขณะที่เรากำลังทำการเขียนโปรแกรมอยู่ ก็ควรที่จะกำหนดให้มีการแสดง Error ออกมาตามปกติ เพราะจะได้ทำการแก้ไขได้ง่าย แต่เมื่อไรก็ตามที่ได้นำโปรแกรม นั้นขึ้นไปบน website ที่ใช้งานจริงๆ ก็ควรที่จะกำหนด @ini_set(‘display_errors’, ‘0’); ไว้ด้วยเนื่องจากอาจจะมีความผิดพลาดที่ เราเองไม่ทราบล่วงหน้าก็ได้ อย่างเช่นมีการรับค่าตัวแปรเข้ามาผิด หรือว่าตัว Database MySQL หยุดทำงานเป็นต้น