2014-09-02 66 views
0

在我的functions.php中,我有一组函数用在我的网站的页面模板中。我想知道什么是处理错误的最佳方式。此刻,我的functions.php看起来是这样的:PHP:函数脚本中的现代错误处理

// include database 
require_once 'system/db.php'; 

// Functions 
// ========= 

function getUrlsPhotos($db, $resultId) { 

    $query = "SELECT * FROM pictures WHERE result_id=$resultID ORDER BY id ASC"; 
    $results = $db -> query($query); 

    // Was there an error? 
    if ($db -> error) { 
     $output = 'error_getting_photos'; 
    } else { 

     // loop for getting photos... ... ... 

     $output = $array_photos; 

    } 

    return $output; 

} 

function getActivityName($db, $activitiesId) { 

    $query = "SELECT * FROM activities WHERE id=$activitiesId LIMIT 1"; 
    $results = $db -> query($query); 
    if ($db -> error) { 
     $output = 'db_error_getting_activityname'; 
    } else { 
     $result = $results -> fetch_assoc(); 
     $output = $result; 
    } 

    return $output; 

} 

我的目标就是在某种程度上看,即有错误而不当然用户看到它。什么是处理我所有功能错误的有效方法?我需要初始化什么?

--- 编辑: ---

阅读更多有关错误处理,我想出了下面的脚本,用于存储错误在我的数据库:

<?php 
function errorHandler($errno, $errstr, $errfile, $errline) { 
    static $db; 
    if (empty($db)) { 
     $db = new PDO(DSN, DBUSER, DBPASS); 
    } 

    $query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())"; 
    $stmt = $db->prepare($query); 

    switch ($errno) { 
     case E_NOTICE: 
     case E_USER_NOTICE: 
     case E_DEPRECATED: 
     case E_USER_DEPRECATED: 
     case E_STRICT: 
      $stmt->execute(array("NOTICE", $errstr, $errfile, $errline)); 
      break; 

     case E_WARNING: 
     case E_USER_WARNING: 
      $stmt->execute(array("WARNING", $errstr, $errfile, $errline)); 
      break; 

     case E_ERROR: 
     case E_USER_ERROR: 
      $stmt->execute(array("FATAL", $errstr, $errfile, $errline)); 
      exit("FATAL error $errstr at $errfile:$errline"); 

     default: 
      exit("Unknown error at $errfile:$errline"); 
    } 
} 

set_error_handler("errorHandler"); 

我的问题:

  • 什么是最好的地方把这个错误处理函数,以便对我所有的PHP函数有效?把它放在我的functions.php的开头就足够了吗?
  • 这个解决方案的缺点当然是,如果数据库关闭,没有办法得到通知。在这种情况下,我怎样才能做到这一点,例如,我收到了通知电子邮件?

回答

1

ü检查se set_error_handler并创建一个(理想的但不是必需的)类来处理错误。

set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR); 

注:这不会赶上严重错误。为了处理FATAL,我会使用register_shutdown_function()

你的课堂会是这样的;

<?php 

class ErrorHandling { 

    //Methods need to be static 

    public static function doHandleErrors($strErrorCode, $strErrorMsg, $strErrorFile, $intErrorLine) { 

     //Handle errors. 
     //Depending on the $strErrorCode, you would either display the message, or display a http status code 500 & direct to a 500 error page. 
     //Depending on the severity of the error, e-mail your programmers. 

     //Try not to display any errors to the consumer/user 
     //Make the error something like "Ooops, something went wrong." and not "An error occured on file.php, line 23." 
     //But that may be more a question for UX.se 
    } 
} 

是什么把这个错误处理功能,以有效为我所有的PHP函数的最佳地点?把它放在我的functions.php的开头就足够了吗?

我会在你的主要“大脑文件”中放入set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR); - 在建立数据库连接之前,我们可以使用自定义错误处理程序来处理数据库连接问题。

这个解决方案的缺点当然是,如果数据库关闭,没有办法得到通知。在这种情况下,我怎样才能做到这一点,例如,我收到了通知电子邮件?

使用自定义错误处理程序,您可以捕获错误/异常和电子邮件你的程序员,然后优雅地杀死进程,显示500 Internal Server Error503 Service Unavailable页面给最终用户。