简单的问题我想,我想用PHP写一个更新到我的数据库中的现有行,如果没有发生我想记录失败,但继续执行代码。尽管有失败的记录来追踪问题会很好,但更新失败对我的用户并不重要,也不会影响任何其他代码的运行;该查询仅仅是为了“美观”而非完全不必要的信息。如何编写我的代码以尝试数据库操作,但在失败时继续执行代码?
我的数据库类的查询功能被设置为在失败时死亡,我可以修改它还是有另一种方式做到这一点,而不会改变我的标准查询代码?
简单的问题我想,我想用PHP写一个更新到我的数据库中的现有行,如果没有发生我想记录失败,但继续执行代码。尽管有失败的记录来追踪问题会很好,但更新失败对我的用户并不重要,也不会影响任何其他代码的运行;该查询仅仅是为了“美观”而非完全不必要的信息。如何编写我的代码以尝试数据库操作,但在失败时继续执行代码?
我的数据库类的查询功能被设置为在失败时死亡,我可以修改它还是有另一种方式做到这一点,而不会改变我的标准查询代码?
这是例外擅长的。
微小例如使用的MySQL
class Db
{
function query($sql)
{
$result = @mysql_query($sql);
$error = mysql_error();
if (!empty($error))
{
throw new DbException($error);
}
return $result;
}
}
类DbException延伸异常{}
然后
try {
$db = new Db;
$db->query('select * from table');
}
catch (DbException $e)
{
// do nothing - we want silent failure
}
那么,我只是拿出die()
。仅此而已,它将阻止它停止所有的CGI执行。如果您不知何故想记录故障,为什么不添加写入日志文件的函数,或者可能会向您发送一封包含故障的电子邮件(如果您不是在谈论高故障率,而只是想调试) 。
if(mysql_query($sql)){
// Database command succeeds
}
else{
// Database command fails
}
除掉模具的()呢?
我建议使用trigger_error()
代替死亡。通过标准错误输出您会收到错误通知。
我会实现一个记录/邮寄错误的方法。您的最终用户根本不会注意到任何事情。
$query = mysql_query($sql) or log_error($sql);
// continue executing code
function log_error($sql) {
// Code that writes to a log file
// Notify tech support
mail("[email protected]", "Error while updating DB", $sql . " at time: " . time());
}
考虑使用trigger_error()而不是log_error,因为它更加灵活,并且在开发阶段有很大的优势 – 2010-04-05 16:57:25
那么,与$ db-> query('select * from table')有什么区别?如果我们想要沉默失败,没有尝试抓住? ;) – 2010-04-05 16:58:57
关键是不要让Db :: query * always *默默地失败 - 就在你想要的时候。此外,还有更多的灵活性 - 调用脚本可以记录错误或采取其他操作。 – 2010-04-05 17:02:11