PHP set_error_handler()函数的使用_PHP教程
我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的。
但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。
有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。
那么,有啥解决办法呢?
set_error_handler()
PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler(),但很少数脚本编写者知道。set_error_handler这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用。
- 可以用来屏蔽错误。 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来让用户觉得你的水平很挫。
- 可以记下错误的信息, 及时发现一些生产环境的出现的问题。
- 可以做相应的处理, 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。
- 可以作为调试工具, 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。
- 。。。。
set_error_handler的使用方法如下:
string set_error_handler ( callback error_handler [, int error_types])
现在我们就用自定义的错误处理把实际路径过滤掉。假设有一个变量$admin,我们是用来判断访问者是否是管理员的(可以通过IP或者登录的用户id来做这个判断)
//admin为管理员的身份判定,true为管理员。 //自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。 function my_error_handler($errno,$errstr,$errfile,$errline) { //如果不是管理员就过滤实际路径 if(!admin) { $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); } switch($errno) { case E_ERROR: echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n"; echo "程序已经停止运行,请联系管理员。"; //遇到Error级错误时退出脚本 exit; break; case E_WARNING: echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n"; break; default: //不显示Notice级的错误 break; } }
这样就自定义了一个错误处理函数,那么怎么把错误的处理交给这个自定义函数呢?
// 应用到类 set_error_handler(array(&$this,"appError")); //示例的做法 set_error_handler("my_error_handler");
so easy,这样,就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思,使错误提示更加美观以配合网站的风格。
原作者给出了两点需要注意的地方,我也放出来吧,希望引起广大同胞们的注意:
- E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编 译或PHP内核出错,在通常情况下不会发生。
- 使用set_error_handler()后,error_reporting ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。
最后,原作者又给出了一个示例(真是个认真负责的好人哈。)
//先定义一个函数,也可以定义在其他的文件中,再用require()调用 function myErrorHandler($errno, $errstr, $errfile, $errline) { //为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径 $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } //下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。 $link_id=@mysql_pconnect("localhost:3333","root","password"); set_error_handler(myErrorHandler); if (!$link_id) { trigger_error("出错了", E_USER_ERROR); }
好了,总结一下,下面是 set_error_handler 三种用法:
class CallbackClass { function CallbackFunction() { // refers to $this } function StaticFunction() { // doesn't refer to $this } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } // 三种方法如下: 1: set_error_handler('NonClassFunction'); // 直接转到一个普通的函数 NonClassFunction 2: set_error_handler(array('CallbackClass', 'StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction 3: $o =& new CallbackClass(); set_error_handler(array($o, 'CallbackFunction')); // 转到类的构造函数,其实本质上跟下面的第四条一样。 4. $o = new CallbackClass(); // The following may also prove useful: class CallbackClass { function CallbackClass() { set_error_handler(array(&$this, 'CallbackFunction')); // the & is important } function CallbackFunction() { // refers to $this } }

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Cara menyelesaikan ralat MySQL: Bilangan lajur tidak sepadan dengan nilai Contoh kod khusus diperlukan Apabila menggunakan pangkalan data MySQL untuk operasi data, kadangkala anda akan menemui mesej ralat: "Columncountdoesn'tmatchvaluecountatrow1", yang bermaksud nombor itu. daripada lajur tidak sepadan dengan bilangan nilai padanan. Ralat ini biasanya berlaku apabila memasukkan data dan bilangan lajur yang dinyatakan tidak konsisten dengan bilangan nilai yang dimasukkan. Artikel ini menerangkan penyelesaian khusus dan menyediakan contoh kod. meneliti

Bagaimana untuk menyelesaikan ralat MySQL: Takrif jadual yang salah hanya boleh ada satu lajur automatik dan ia mesti ditakrifkan sebagai kunci Contoh kod khusus diperlukan Dalam beberapa tahun kebelakangan ini, pangkalan data MySQL telah digunakan secara meluas, tetapi semasa penggunaan , kami sering menghadapi Pelbagai laporan ralat. Antaranya, ralat biasa ialah "takrif jadual yang salah; hanya boleh ada satu lajur automatik dan ia mesti ditakrifkan sebagai kunci". Ralat ini biasanya berlaku apabila kami membuat jadual, yang mungkin menyakitkan kepala untuk pemula. Artikel ini akan memberi anda analisis terperinci tentang sebab ralat ini dan memberikan yang khusus

Penyelesaian kepada ralat mysql 10060 termasuk menyemak sama ada pelayan MySQL berjalan seperti biasa, menyemak sambungan rangkaian, menyemak tetapan firewall, menyemak konfigurasi pelayan MySQL, menyemak kebenaran pengguna MySQL, menyemak konfigurasi rangkaian, menyemak had bilangan maksimum sambungan pelayan MySQL, dan menggunakan alamat IP dan bukannya Nama hos dan mulakan semula pelayan MySQL, dsb. Pengenalan terperinci: 1. Periksa sama ada pelayan MySQL berjalan seperti biasa Pertama, pastikan pelayan MySQL berjalan dan mendengar port yang betul, dsb.

Pengenalan ringkas kepada sebab ralat permintaan http: 504GatewayTimeout: Semasa komunikasi rangkaian, pelanggan berinteraksi dengan pelayan dengan menghantar permintaan HTTP. Walau bagaimanapun, kadangkala kami mungkin menghadapi beberapa mesej ralat semasa proses menghantar permintaan. Salah satunya ialah ralat 504GatewayTimeout. Artikel ini akan meneroka punca dan penyelesaian kepada ralat ini. Apakah ralat 504GatewayTimeout? GatewayTimeo

Ralat permintaan http: Penyelesaian kepada SocketError Apabila membuat permintaan rangkaian, kita sering menghadapi pelbagai ralat Salah satu masalah biasa ialah SocketError. Ralat ini dilemparkan apabila aplikasi kami tidak dapat mewujudkan sambungan dengan pelayan. Dalam artikel ini, kami akan membincangkan beberapa punca dan penyelesaian biasa SocketError. Pertama, kita perlu memahami apa itu Socket. Soket ialah protokol komunikasi yang membolehkan aplikasi untuk

Jika anda belajar Python dan ingin membangunkan aplikasi GUI, PyQt5 ialah pilihan yang sangat baik. Ia adalah versi terikat perpustakaan PyQt di bawah Python, yang menjadikannya sangat mudah untuk memanggil dan membangunkan perpustakaan grafik Qt. Walau bagaimanapun, kadangkala anda mungkin menghadapi beberapa masalah semasa memasang PyQt5. Panduan ini akan memberikan anda beberapa langkah untuk menyelesaikan masalah ralat pemasangan dengan cepat, dan juga melampirkan contoh kod tertentu. Pastikan versi Python adalah betul PyQt5 ialah perpustakaan berasaskan Python, jadi pertama sekali

Unknowncolumn'column_name'in'whereclause'-Cara menyelesaikan ralat MySQL: lajur tidak diketahui dalam klausa di mana, contoh kod khusus diperlukan MySQL ialah sistem pengurusan pangkalan data hubungan yang digunakan secara meluas yang menyokong penggunaan Bahasa Pertanyaan Berstruktur (SQL). Penyimpanan, pengurusan dan pengambilan semula data. Walau bagaimanapun, apabila menggunakan MySQL untuk membuat pertanyaan, kadangkala kita akan menghadapi ralat Salah satu ralat yang biasa ialah: Unkno

Pangkalan data tidak diketahui 'database_name' - Cara menyelesaikan ralat MySQL: Nama pangkalan data tidak diketahui, contoh kod khusus diperlukan Apabila menggunakan MySQL, kadangkala anda akan menemui mesej ralat: Pangkalan data tidak diketahui 'database_name'. Mesej ralat ini menunjukkan bahawa MySQL tidak dapat mencari pangkalan data yang anda tentukan. Ini mungkin kerana pangkalan data tidak wujud atau anda tidak mempunyai kebenaran untuk mengakses pangkalan data. Di bawah ini kami akan meneroka beberapa kemungkinan punca dan memberikan contoh kod khusus untuk menyelesaikan isu tersebut. data
