2010-04-05 64 views
1

简单的问题我想,我想用PHP写一个更新到我的数据库中的现有行,如果没有发生我想记录失败,但继续执行代码。尽管有失败的记录来追踪问题会很好,但更新失败对我的用户并不重要,也不会影响任何其他代码的运行;该查询仅仅是为了“美观”而非完全不必要的信息。如何编写我的代码以尝试数据库操作,但在失败时继续执行代码?

我的数据库类的查询功能被设置为在失败时死亡,我可以修改它还是有另一种方式做到这一点,而不会改变我的标准查询代码?

回答

2

这是例外擅长的。

微小例如使用的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 
} 
+0

那么,与$ db-> query('select * from table')有什么区别?如果我们想要沉默失败,没有尝试抓住? ;) – 2010-04-05 16:58:57

+0

关键是不要让Db :: query * always *默默地失败 - 就在你想要的时候。此外,还有更多的灵活性 - 调用脚本可以记录错误或采取其他操作。 – 2010-04-05 17:02:11

0

那么,我只是拿出die()。仅此而已,它将阻止它停止所有的CGI执行。如果您不知何故想记录故障,为什么不添加写入日志文件的函数,或者可能会向您发送一封包含故障的电子邮件(如果您不是在谈论高故障率,而只是想调试) 。

1
if(mysql_query($sql)){ 
    // Database command succeeds 
} 
else{ 
    // Database command fails 
} 
1

除掉模具的()呢?

我建议使用trigger_error()代替死亡。通过标准错误输出您会收到错误通知。

0

我会实现一个记录/邮寄错误的方法。您的最终用户根本不会注意到任何事情。

$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()); 
} 
+0

考虑使用trigger_error()而不是log_error,因为它更加灵活,并且在开发阶段有很大的优势 – 2010-04-05 16:57:25

相关问题