ยกเลิกการแสดง error ใน php
เรามาทำการป้องกันเพื่อไม่ให้ PHP แสดง Error ออกมาเวลาที่ทำงานผิดพลาดกันดีกว่า
โดยปกติเวลาที่เราเขียนโปรแกรมโดยใช้ PHP เมื่อมีการทำงานผิดพลาดระบบจะแจ้งให้เราทราบว่ามี Error ที่บรรทัดใดอย่างไร ซึ่งมีประโยชน์มากเวลาเขียนโปรแกรม แต่ถ้าหากว่าข้อมูลของ Error ตัวนั้นไปแสดงที่หน้า Website ที่เรานำขึ้นไปใช้บนโฮสติ้งจริง ๆ คงไม่สนุกแน่ ๆ แล้วลองคิดดู หากว่า Hacker เห็น Error เหล่านี้ และอาจจะอาศัยช่องโหว่เหล่านี้ ในการเข้าโจมตีเว็บไซต์ของคุณ
บางท่านอาจจะคิดว่า เขียนโปรแกรมดีแล้วไม่มี Error แน่นอน เพราะทดสอบมาทุกขั้นตอนแล้ว
ในส่วนนี้ก็อาจจะเป็นไปได้ครับว่าคุณเขียนมาดีแล้ว แต่ถ้าหากว่าวันหนี่ง MySQL ที่ใช้งานอยู่ เกิดหยุดทำงานขึ้นมา คำสั่ง php ที่คุณใช้ในการ Connect MySQL จะต้อง Error ออกมาอย่างแน่นอน
ในการสั่งให้ PHP ไม่แสดง Error เวลาที่โปรแกรมทำงานผิดพลาดสามารถทำได้ 2 วิธีคือ
- สั่งไม่ให้แสดง Error เฉพาะตรงคำสั่งที่ต้องการ โดยการใช้ @
- สั่งไม่ให้แสดง Error ทั้งหมดไม่ว่าจะด้วยกรณีใด ๆ ทั้งสิ้น โดยการใช้ @ini_set(‘display_errors’, ’0′);
การสั่งไม่ให้แสดง Error เฉพาะตรงคำสั่งที่ต้องการ โดยการใช้ @
ในการสั่งให้ php ไม่แสดง Error ออกมาเวลาที่โปรแกรมทำงานผิดพลาดแบบเฉพาะจุด เราสามารถใส่ เครื่องหมาย @ ข้างหน้าคำสั่ง ที่เราต้องการได้ มาดูตัวอย่าง
test.php
<?php
$file = "test.txt";
$handle = fopen($file, "r");
$contents = fread($handle, filesize($file));
fclose($handle);
print $contents;
?>
จากตัวอย่าง Script PHP เพื่ออ่าน File test.txt หากไม่พบ File ก็จะแสดง Error ออกมาดังนี้
Warning: fopen(test.txt) [function.fopen]: failed to open stream: No such file or directory in /home/admin/domains/maeklong.in.th/public_html/test/test.php on line 3
Warning: filesize() [function.filesize]: stat failed for test.txt in /home/admin/domains/maeklong.in.th/public_html/test/test.php on line 4
Warning: fread() expects parameter 1 to be resource, boolean given in /home/admin/domains/maeklong.in.th/public_html/test/test.php on line 4
Warning: fclose() expects parameter 1 to be resource, boolean given in /home/admin/domains/maeklong.in.th/public_html/test/test.php on line 5
จาก Error ที่เราเห็นก็จะทราบได้ว่า มีความผิดพลาดเกิดขึ้นจากทั้งหมด 4 function คือ fopen,filesize,fread,fclose ที่นี้เราก็จะมาใส่ @ ไว้ที่หน้า function เหล่านี้ดูบ้าง
test.php
<?php
$file = "test.txt";
$handle = @fopen($file, "r");
$contents = @fread($handle, @filesize($file));
@fclose($handle);
print $contents;
?>
จากตัวอย่างเวลาที่เรา Run โปรแกรม จะพบว่าไม่มี Error อะไร ขึ้นมาให้เราเห็นเลย
สั่งไม่ให้แสดง Error ทั้งหมดไม่ว่าจะด้วย กรณีใดๆทั้งสิ้น โดยการใช้ @ini_set(‘display_errors’, ’0′);
ในแบบที่ 2 เป็นวิธีการที่จะกำหนดไม่ให้แสดง Error ของทั้งหน้าไม่ว่าจะเป็นที่คำสั่งไหนก็ตาม วิธีนี้สะดวกตรงที่เราไม่ต้องไป นั้งใส่ @ ในทุกๆ function ที่เราต้องการ เพราะว่าเราแค่นำคำสั่ง @ini_set(‘display_errors’, ’0′); ไปไว้ที่บรรทัดแรกสุดของหน้า ที่เราไม่ต้องการให้แสดง Error ก็สามารถที่จะใช้ได้แล้ว ไปดูตัวอย่างกัน
test.php
<?php
@ini_set('display_errors', '0');
$file = "test.txt";
$handle = fopen($file, "r");
$contents = fread($handle, filesize($file));
fclose($handle);
print $contents;
?>
จากตัวอย่างถ้าหากว่าเราเปลี่ยนจาก @ini_set(‘display_errors’, ’0′); ให้เป็น @ini_set(‘display_errors’, ’1′); ก็จะเป็นการสั่งให้ แสดง Error ออกมาตามปกติ
คำแนะนำ : ใน ขณะที่เรากำลังทำการเขียนโปรแกรมอยู่ ก็ควรที่จะกำหนดให้มีการแสดง Error ออกมาตามปกติ เพราะจะได้ทำการแก้ไขได้ง่าย แต่เมื่อไรก็ตามที่ได้นำโปรแกรม นั้นขึ้นไปบน website ที่ใช้งานจริงๆ ก็ควรที่จะกำหนด @ini_set(‘display_errors’, ’0′); ไว้ด้วยเนื่องจากอาจจะมีความผิดพลาดที่ เราเองไม่ทราบล่วงหน้าก็ได้ อย่างเช่นมีการรับค่าตัวแปรเข้ามาผิด หรือว่าตัว Database MySQL หยุดทำงานเป็นต้น