2012-07-03 210 views
0

我写了下面的代码片段来处理错误。数据库查询错误,同时错误处理

(page.php文件被通过包括在索引页:阵列(falseNamePage => page.php文件,.... ECT))

Perfoming一些测试,看看它是如何反应,予删除一个页面来自public_html的.php。

结果:

- 错误日志确定

-alert电子邮件发送OK

- 记录在DB:ERROR:

注意:未定义的变量:在/ home $数据库/.../public_html/index.php on line 40

Warning:mysql_query()期望参数2是资源,null在第40行中的/home/.../public_html/index.php中给出“不可能与DB2连接”

我不明白为什么它连接失败在这种情况下的数据库并发回一个错误。

DB连接在所有其他情况下正常工作(删除,选择,更新,插入...)

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 = '[email protected]'; $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"); 

最后一个问题是:

为什么是一个包含错误ECHOED 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

$ database是在connection.php中定义的? – powtac

+0

是$ database代表PhpMyAdmin中的“database”(常数名称) – SunnyOne

+0

PHP的'mysql_ *'函数[已弃用](http://www.php.net/manual/en/faq.databases.php#faq.databases .mysql.deprecated)。 [建议的替代品](http://www.php.net/manual/en/mysqlinfo.api.choosing.php)也恰好是[更安全地使用](http://stackoverflow.com/a/60496/132382)。 – pilcrow

回答

0

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

但是它不能这样工作:这段代码每次都会被解析(好吧,它有点简化了,但其原因仍然相同)函数会被调用。因为它是require_once,所以你的文件将只包含一次 - 只有在第一次调用该函数时。所有下一次调用将跳过该文件的包含,因此$数据库不会被定义。

修复它的最简单方法是用require替换require_once。但我认为这个问题将会被涵盖 - 但是没有解决。真正的解决方案是重构你的代码,使得你的$database实际上将成为注册表中的一个记录 - 并且如果需要将会从该注册表中被轻松提取。

有很多方法可以实现这种行为:我们经常使用Zend_Registry组件。在this topic中有一些如何有效使用这个组件的例子。

+0

嗯,我刚刚使用了REQUIRE而不是required_once。在DB = OK记录(但是我得到死亡(消息))。邮件发送=确定。但是......我在每个代码块中回显自己的错误处理消息,并且我得到了4次我的自定义错误消息,尽管放置在不同的开关情况下。 AND Error logging出现4次...感谢您的帮助。 – SunnyOne

+0

你是什么意思'录音是好的,但死'执行'? – raina77ow

+0

3次这一个:[03-Jul-2012 11:27:12 UTC]警告:2:include(file.php)[0function.include0]:未能打开流:没有这样的文件或目录:/ home /。 ../public_html/index.php:627 1次: [2012年07月03日11:27:12 UTC]警告:2:include()[0function.include0]:打开'file.php'失败(include_path ='。:/ usr/lib/php:/ usr/local/lib/php'):/home/.../public_html/index.php:627 !真的很奇怪! – SunnyOne

0

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

由于require_ 一次为,所以当函数被第二次调用时,变量$数据库将不可用。这里设计的有点不好。

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

+0

3次这一个:[03-Jul-2012 11:27:12 UTC]警告:2:include(file.php)[0function.include0]:未能打开流:没有这样的文件或目录:/ home /。 ../public_html/index.php:627给出=>插入数据库的3倍倍数////// 1次:[03-Jul-2012 11:27:12 UTC] Warning:2:include()[0function (include_path ='。:/ usr/lib/php:/ usr/local/lib/php'):/home/.../public_html/index.php:无法打开'file.php' 627 => die()在这一个。看来每个交换机发出错误号码[2]。 – SunnyOne

+0

你确定自己写了这个“snippet”还是你复制了它? – powtac

+0

我发现了这段代码的一些部分,并将它转换成比它做得更多。 – SunnyOne

1

也许connection.php之前已经包括在内,所以当你在代码中使用require_once,它又包括connection.php。然后,$database变量将不会被定义,并且您将收到该错误消息。