1

我在程序 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(/* ... */);

但是这样我需要扩展几乎所有可能发生错误的方法。此外,MySQLi 提供了有其自身错误的准备好的语句(mysqli_stmt 类)!

你能知道处理 MySQLi 错误的更好方法吗?先感谢您。


添加

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

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

但这类似于

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

有什么区别?

4

2 回答 2

1

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

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

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

你真正想要的是错误/异常处理程序。您可以在其中执行任何操作,例如记录、调用事件、显示页面。

异常优于常规错误 - 因此,将您的 mysqli 设置为异常模式,如其他答案所示,然后在错误处理程序中捕获所有错误。而 try..catch在您有不同的特定操作来处理错误时才必须使用。

于 2013-12-13T11:37:46.527 回答
-1

我使用这样的 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'来测试一个条件,如果它返回真(!$result)就抛出一个异常。并使用“catch”来捕捉可能发生的所有其他事情!

于 2015-06-28T23:00:59.430 回答