如何@include()我的秘密文件没有错误文本(当没有文件时),但如果此文件中有任何错误,则包含错误文本?

时间:2013-09-29 13:13:01

标签: php error-handling include

$admpage=md5($_SERVER[DOCUMENT_ROOT]).'.php';
if(!@include($admpage)){echo "error opening Adminpage";}

因此,如果没有这样的文件,则应该有错误error opening Adminpage

但是如果在代码中包含文件IS错误,它什么都不显示。

换句话说,我需要在包含时关闭错误报告,但在执行包含文件时将其打开。

PS
我试过eval(),但比@include()

更糟糕

PPS
 我需要包含任何文件,但如果错误(在包含或执行时),则显示错误但从不显示文件名

3 个答案:

答案 0 :(得分:2)

看来,您的目标是禁止错误消息包含不存在的文件。

你可以这样做:

$old = ini_set('display_errors', 0);  // Do not show errors to client
$fileExists = file_exists($someFile) && is_readable($someFile);
ini_set('display_errors', $old); // Restore old value
if (!$fileExists)
   die('Error opening admin page');
include($someFile);

为什么要采取多种措施?

file_exists以及is_readable会在某些条件下打印错误消息:可能存在safe_modeopen_basedir限制问题(并非所有人都使用PHP 5.3)。服务器也可能与suPHP一起运行,这也会使文件不可读。

为什么会出错?

您的概念:依赖于隐藏文件的伪身份验证名称称为“默默无闻的安全”。例如,任何有权访问您的浏览器历史记录的人都会知道该URL。这不是很安全......

我的回答:简单地关闭display_errors就像将error_reporing设置为零一样安全:根本不是。例如:一旦安装了自定义错误处理程序,这两个设置都将被“忽略”。自定义错误处理程序负责相应地检查这些值。

您可以考虑为生产和开发环境使用不同的php.ini设置。理想情况下,第一个应该没有任何错误信息,而后者应该溢出所有错误信息。


阅读:

答案 1 :(得分:0)

file_exists是什么?

if(!file_exists($admpage)){echo "error opening Adminpage";}

如果您真的想关闭错误报告,请执行以下操作:@include("script.php"); 然后将代码包装在函数中的文件中,例如myFunc()然后在include之后调用它。

答案 2 :(得分:0)

仅在文件确实存在时使用:

if (file_exists($admpage) && is_readable($admpage)) {
  include($admpage);
}