错误处理时数据库查询错误

时间:2012-07-03 11:01:53

标签: php mysql error-handling

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

(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

3 个答案:

答案 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中,有一些如何有效使用此组件的示例。