MySQLi错误处理


MySQLi Error Handling?

我在过程MySQL之后开始使用OO MySQLi,但我遇到了一个问题。

在生产环境中,我的系统将所有错误显示为自定义页面。MySQLi错误也是一个"错误",我想抓住它们,但在文档中只描述了一种方法:

if (!$mysqli->query("SET a=1")) {
    exit('An error occurred: ' . $mysqli->error);
}

(只是举个例子)。这是一种非常糟糕的方式,因为在我的系统中,当错误发生时,我会做很多事情,比如日志记录、调用事件等。

当然,我可以扩展mysqli类,例如:

class myMysqli {
    public function __construct(/* ... */)
    {
        parent::__construct(/* ... */);
    }
    public function query(/* .. */)
    {
        parent::query(/* ... */);
        if($this->errno !== 0)
        {
            // An error occurred
        }
    }
}
$mysqli = new myMysqli(/* ... */);
$mysqli->query(/* ... */);

但通过这种方式,我需要扩展几乎ALL可能发生错误的方法。此外,MySQLi提供了准备好的语句(MySQLi_stmt类),这些语句有自己的错误!

你能知道处理MySQLi错误的更好方法吗?提前谢谢。


添加

关于例外:我是否正确理解,除了例外,我需要做这样的事情:

try {
    $mysqli->query(/* ... */);
} catch (Exception $e) {
    // An error occurred
}

但这与类似

if(!$mysqli->query(/* ... */))
{
    // An error occured
} 

有什么不同?

首先,您的旧方法是错误的

exit('An error occurred: ' . $mysqli->error);

一般来说,这是一种糟糕的做法,不应该与mysqli一起使用。

您真正想要的是错误/异常处理程序。在那里你可以做任何事情,比如记录,调用事件,显示页面。

异常比常规错误要好——所以,将您的mysqli设置为异常模式,如其他答案所示,然后在错误处理程序中捕获所有错误。尝试时。。当您有一个独特的特定操作来处理错误时,catch必须仅使用

我使用try。。。像这样的catch方法。。。

try {
    // get result of record from 'id'
    $query = "SELECT * FROM models WHERE id =$id";
    $result = $mysqli->query($query);
    if (!$result) {
        throw new Exception($mysqli->error());      
    } 
    $row = $result->fetch_array(); 
 }
 catch (Exception $e)  
 {
     echo "We are currently experiencing issues. Please try again later.";
     echo $e->getMessage();
 } 
 finally
 {
      $result->free();
 }

这有帮助吗?

您可以使用"try"测试条件,如果返回true(!$result),则抛出异常。用"catch"来捕捉可能发生的其他一切!