在PHP脚本中,在连接/向数据库发送查询时如何处理异常?

时间:2012-10-31 14:38:32

标签: php mysql database exception pdo

以下是我可能的解决方案:

1)使用exit()终止脚本。 (问题:影响整页内容的加载,而不仅仅是来自数据库的数据)

2)在页面中嵌入<div>元素专门用于显示可能的例外情况。

标准方法是什么?

6 个答案:

答案 0 :(得分:3)

没有真正的&#34;标准&#34;如何处理数据库中的异常的方法。这完全取决于具体的用例。例如,如果在第一种情况下无法建立数据库连接,则可能需要立即重定向到错误页面并向站点管理员发送电子邮件通知。另一方面,如果您无法执行单个插入(无论出于何种原因),可能更适合通知用户他们正在尝试的内容无法完成并要求他们再试一次

异常本质上是一种让的方式,而不是你正在使用的编程语言或库,决定如何在出现问题时处理该怎么做。几乎总是,您需要记录错误,然后由您决定最合适的响应。

所有这一切都是说处理异常的适当方式是在应用程序中最有意义的方式。

答案 1 :(得分:1)

您应该在日志文件中记录您的异常并使用它来分析出错的地方。但是从用户的角度来看,你应该向他们展示友好的陈述,例如“抱歉你的请求无法处理”。

答案 2 :(得分:1)

选项1)不整洁,因为它提供了糟糕的用户体验

选项2)是首选。

使用PDO,以下代码将显示异常并将其与时间戳一起存储。

try {  
    $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);  
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
    $stmt = $dbh->prepare("INSERT INTO table ( column ) values ( value )");  
    $stmt->execute(); 
    }  
catch(PDOException $e) {  
    echo "I'm sorry I'm afraid you can't do that.". $e->getMessage() ;// Remove or modify after testing 
    file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]'). $e->getMessage()."\r\n", FILE_APPEND);  
}  

在测试之后的生产站点上应该推荐使用echo语句

echo "I'm sorry I'm afraid you can't do that.";

答案 3 :(得分:1)

我在项目中遇到了同样的问题。首先,我想到了一个类似于david strachan的解决方案,但最终我意识到这个解决方案并不完整。我仍然需要有调试信息,但不应该向用户显示这些信息。

我想出了一个解决方案,向用户显示一条消息,指出“系统错误,请再试一次,如果错误仍然存​​在,请联系支持人员”。此外,同时将错误消息记录到错误日志文件中。

以下是详细信息:

function logException ($exception) {

    // Construct the error message to add to the log file
    $logDate = date("l, F j, Y  H:i:s");            
    $logMessage = "Date: " . $logDate . "\n";
    $logMessage = $logMessage . "Error Message: ". $exception->getMessage() . "\n";
    $logMessage = $logMessage . "Error Code: ". $exception->getCode() . "\n";
    $logMessage = $logMessage . "Error File: ". $exception->getFile() . "\n";
    $logMessage = $logMessage . "Error Line: ". $exception->getLine() . "\n";
    $logMessage = $logMessage . "Error Trace:\n". $exception->getTraceAsString() . "\n";
    $logMessage = $logMessage . "\n\n**************************************" . "\n\n\n";

    // Construct a log file name similar to the name of the script file that cause the error
    $info = pathinfo($exception->getFile());
    $extension = "." . $info["extension"];
    $logFile =  "../logs/" .  basename($exception->getFile(), $extension) . ".log";

    // Add the error message to the log file            
    error_log($logMessage, 3, $logFile);

    // Message to return to the user
    $errorMessage = "System error, please try again, if the error persists, then please contact support.";

    return $errorMessage;
} 


try {  
    $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);  
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
    $stmt = $dbh->prepare("INSERT INTO table ( column ) values ( value )");  
    $stmt->execute(); 
}  

// Catching all sorts of errors, including PDO errors
catch (Exception $e) {
    $message = logException ($e);
    $data['message'] = $message;
    $data['isSuccessful'] = false;
}

请注意以下事项:

  1. 错误消息将保存到日志文件
  2. 日志文件保存到日志文件夹中。日志文件的名称源自生成错误的文件的名称。例如,如果导致错误的文件名为“script.php”,则日志文件将被称为“script.log”,并将保存在logs文件夹中。
  3. catch语句捕获各种异常,并且不仅限于PDO错误。
  4. 现在,你有一个问题,如果你想抛出一个希望用户看到的异常怎么办(例如,你想抛出一个例外,比如“这是错的,试试agian”)?好吧,我确实提出了一个扩展到这个问题的解决方案,但这不是你的问题所在。但如果你还想知道,请告诉我。

    干杯。

答案 4 :(得分:0)

try - catch是我在php中处理异常的标准方法......如下所示:PHP EXCEPTIONS

try{
    some code here
}catch(Exception $e){
    failed response here
}

编辑以详细说明:这只是一种捕获异常的方法。当被抓住时该做什么是由开发人员决定的价值判断。如果这就是问题所在,我很抱歉。

答案 5 :(得分:0)

你必须找到自己的方法来捕捉错误。 我正在使用

try { QUERY } catch(Exception $e) { Log and display error }