0

为了处理错误,我编写了以下代码段。

(Page.php 通过 : array( falseNamePage=> page.php, ....ect) 包含在索引页面中)

执行一些测试以查看它的反应,我从 public_html 中删除了 page.php。

结果 :

-错误记录正常

- 警报电子邮件发送确定

- 在数据库中记录:错误:

注意:未定义的变量:第 40 行 /home/.../public_html/index.php 中的 $database

警告:mysql_query() 期望参数 2 是资源,在 /home/.../public_html/index.php 第 40 行“无法连接 DB2”中给出 null

我不明白为什么在这种情况下它无法连接到数据库并发回错误。

数据库连接在所有其他情况下都可以正常工作(删除、选择、更新、插入......)

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

4

3 回答 3

1

可能connection.php之前已经包含了,所以当您require_once在代码中使用时,它不会再次包含connection.php。然后,$database将不会定义变量,您将收到该错误消息。

于 2012-07-03T11:09:09.853 回答
0

当没有函数定义且没有常量定义在connection.php使用require而不是require_once.

第二次调用函数时,变量 $database 将不可用,因为 require_ once。这里的设计有点糟糕。

一种解决方案是将 $database 作为常量,因此无论第一次还是第二次包含 connection.php,它都像一个全局变量。

于 2012-07-03T11:04:45.110 回答
0

您的问题很简单,在我看来,它是 YAPHPB:您在require_once函数定义中使用,希望该文件只包含一次 - 以形成函数的主体。

但它不是这样工作的:每次都会解析这段代码(嗯,它有点简化,但原因还是一样)函数会被调用。而且因为它是require_once,您的文件实际上只会包含一次 - 仅在第一次调用该函数时。所有接下来的调用都将跳过文件的包含,因此不会定义 $database。

修复它的最简单方法是替换require_oncerequire. 但我认为这个问题将被涵盖——但没有解决。真正的解决方案是重组您的代码,使您$database实际上成为注册表中的记录 - 如果需要,将从该注册表中延迟提取。

有很多方法可以实现这种行为:我们经常为此使用Zend_Registry组件。在本主题中,有一些示例说明如何有效地使用此组件。

于 2012-07-03T11:11:01.300 回答