我在过程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"来捕捉可能发生的其他一切!