<?php
/////////////////////////////////////////////
ini_set("display_errors" , "0");
/////////////////////////////////////////////
$html = '
<table>
<tr>
<td><img src="img0.gif" /></td>
<td><img src="img1.gif" /></td>
<td><img src="img2.gif" /></td>
</tr>
</table>
';
/////////////////////////////////////////////
$dom = new domDocument();
$dom -> loadHTML($html);
$xpath = new domXPath($dom);
/////////////////////////////////////////////
$query = $xpath->query('.//table/tr/td');
$image = $query->item(1000000000); // <<---- item number
$img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src');
echo $img_src;
/////////////////////////////////////////////
?>
该代码中的因为没有item(1000000000)
,所以会导致错误。
并且会导致display_errors" , "0"
所有错误被隐藏并且页面被损坏
那么,如何防止这种损害呢?
我知道我可以通过增加简单的条件来防止它,如:
在if( $image <1 ){ die('error msg'); }
var之前$img_src
但是,如果我有一个更大的代码10000行,我不知道究竟什么代码会导致错误!!
我们可以通过httaccess阻止它吗?通过检查页面源是否为空重定向到错误页面。
或者我们可以通过php本身的某些功能来阻止它吗?
有任何想法吗 ?
答案 0 :(得分:2)
您可以使用set_error_handler。要设置一个错误的回调离案例,可以在此处终止脚本执行。
<强>更新强>
刚发现自定义错误处理程序不适用于E_ERROR和其他错误类型。这是在PHP文档
使用用户定义无法处理以下错误类型 功能:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING, E_COMPILE_ERROR,E_COMPILE_WARNING和大多数E_STRICT在 调用set_error_handler()的文件。
所以这是我在互联网上找到的解决方法,我已经用你的脚本进行了测试,并且工作正常 将以下代码添加到脚本的开头:
// execute on shutdown
function shutdown_handle(){
// get last error details if any
$lerror = error_get_last();
// if there is a Fatal (E_ERROR Type) las error then redirect to error page
if($lerror && $lerror['type'] == E_ERROR)
header('Location:error_page.php');
}
// register our shutdown handler
register_shutdown_function('shutdown_handle');
这将注册一个关闭函数,该函数在脚本终止时从致命错误执行,无论display_errors是打开还是关闭。
我们检查上一个错误是否是致命错误,如果是,我们将重定向到error_page.php。
注意:需要注意的一点是,如果display_errors为ON,则重定向仍然有效。我测试了它,它工作正常。这可能是因为我的服务器上启用了output_buffering。
更新2:
这是完整的PHP文件,其中包含添加了关闭处理程序的代码。这很好用,并重定向到error_page.php。将其更改为您要重定向到的页面:
<?php
////////////////////////////////////////////////
// Shutdown handler to catch E_ERROR on shutdown
// even with display_errors OFF
// function which will execute on shutdown
function shutdown_handle(){
// get last error details if any
$lerror = error_get_last();
// if there is a Fatal (E_ERROR Type) last error
// then redirect to error page
if($lerror && $lerror['type'] == E_ERROR)
header('Location:error_page.php');
}
// register our shutdown handler
register_shutdown_function('shutdown_handle');
//////////////////////////////////////////////////
/////////////////////////////////////////////
ini_set("display_errors" , "1");
/////////////////////////////////////////////
$html = '
<table>
<tr>
<td><img src="img0.gif" /></td>
<td><img src="img1.gif" /></td>
<td><img src="img2.gif" /></td>
</tr>
</table>
';
/////////////////////////////////////////////
$dom = new domDocument();
$dom -> loadHTML($html);
$xpath = new domXPath($dom);
/////////////////////////////////////////////
$query = $xpath->query('.//table/tr/td');
$image = $query->item(1000000000); // <<---- item number
$img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src');
echo $img_src;
/////////////////////////////////////////////
?>
答案 1 :(得分:0)
如果要隐藏用户的所有错误,请启用error_reporting(以便仍然记录错误)并禁用display_errors。
如果您希望所有错误都是致命的(即停止页面处理),您可以设置一个自定义错误处理程序,该处理程序会因每个错误而死亡。