我编写了以下代码段来处理错误。
(Page.php包含在索引页面中:array(falseNamePage => page.php,.... ect))
通过一些测试来看看它是如何反应的,我从public_html中删除了一个page.php。
结果:
-error logging ok
-alert email send ok
- DB中的记录:错误:
注意:未定义的变量:第40行的/home/.../public_html/index.php中的$ database
警告:mysql_query()期望参数2为资源,在第40行的/home/.../public_html/index.php中给出null“无法与DB2连接”
我不明白为什么在这种情况下它无法连接到DB并发回错误。
DB Connection在其他所有情况下都能正常工作(删除,选择,更新,插入......)
function errorHandler($errno, $errstr, $errfile, $errline)
{
require_once('connection.php');
$now = time();
$date = date("Y-m-d H:i:s",$now);
switch ($errno) {
case E_NOTICE:
case E_USER_NOTICE:
case E_DEPRECATED:
case E_USER_DEPRECATED:
case E_STRICT:
............ 5 first cases code...............
case E_WARNING:
case E_USER_WARNING:
$message_warning = "Warning : ".$errno." : ".$errstr." : ".$errfile." : ".$errline;
error_log ( $message_warning ,0);
$mail = 'my_mail@yahoo.com'; $sujet = $message_warning; $body_warning = $date." : ".$message_warning;
mail($mail,'=?UTF-8?B?'.base64_encode($sujet).'?=',stripslashes($body_warning));
$query_warning =" INSERT INTO errorlog (severity,errno,errstr,errfile,errline,time)
VALUES ('WARNING','".$errno."','".$errstr."','".$errfile."','".$errline."','".$date."')";
$result_warning = mysql_query($query_warning,$database) or die("impossible to connect with DB2");
break;
case E_ERROR:
case E_USER_ERROR:
............... 2 last cases code ..........
}
}
set_error_handler("errorHandler");
最后一个问题是:
为什么包含错误4次?
系统是否尝试4次“开放流”?
我做了:
function errorHandler($errno, $errstr, $errfile, $errline)
{
if ($errno == E_NOTICE )
{ echo "<br/>".$errno."== E_NOTICE<br/>";}
if ($errno == E_USER_NOTICE)
{ echo "<br/>".$errno."== E_USER_NOTICE<br/>";}
if ($errno == E_DEPRECATED)
{ echo "<br/>".$errno."== E_DEPRECATED<br/>";}
if ($errno == E_USER_DEPRECATED)
{ echo "<br/>".$errno."== E_USER_DEPRECATED<br/>";}
if ($errno == E_STRICT)
{ echo "<br/>".$errno."== E_STRICT<br/>";}
if ($errno == E_WARNING)
{ echo "<br/>".$errno."== E_WARNING<br/>";}
if ($errno == E_USER_WARNING)
{ echo "<br/>".$errno."== E_USER_WARNING<br/>";}
if ($errno == E_ERROR)
{ echo "<br/>".$errno."== E_ERROR<br/>";}
if ($errno == E_USER_ERROR)
{ echo "<br/>".$errno."== E_USER_ERROR<br/>";}
}
set_error_handler("errorHandler");
结果:
2 == E_WARNING
2 == E_WARNING
2 == E_WARNING
2 == E_WARNING
答案 0 :(得分:1)
之前可能已经包含connection.php
,因此当您在代码中使用require_once
时,不会再次包含connection.php
。然后,将不会定义$database
变量,您将收到该错误消息。
答案 1 :(得分:0)
如果connection.php
中没有函数定义且没有常量定义,请使用require
而不是require_once
。
由于require_ 一次,第二次调用该函数时,变量$ database将不可用。这里设计有点糟糕。
解决方案是将$ database作为常量,因此无论是第一次还是第二次包含connection.php,它都像一个全局变量。
答案 2 :(得分:0)
你的问题很简单,而且,在我看来,这是YAPHPB:你在函数定义中使用require_once
,希望文件只包含一次 - 来塑造一个函数体。
但它不能那样工作:这个代码每次都会解析 (好吧,它有点简化,但原因仍然相同)函数将被调用。因为它是require_once
,所以你的文件只会被包含一次 - 只有当第一次调用该函数时。所有下一个调用都将跳过文件的包含,因此不会定义$ database。
解决此问题的最简单方法是将require_once
替换为require
。但我认为这个问题将被涵盖 - 但尚未解决。真正的解决方案是以您的$database
实际上将成为注册表中的记录的方式重构您的代码 - 如果需要,将从该注册表中懒惰地提取。
实现此类行为的方法有很多种:我们经常使用Zend_Registry组件。在this topic中,有一些如何有效使用此组件的示例。