PHP中无法捕获SQLite3的CHECK constraint failed错误怎么办?
解决PHP操作SQLite3无法捕获约束错误且日志输出警告的问题
方法一:启用SQLite3异常模式(推荐)
SQLite3默认不会抛出异常,仅返回false并触发PHP警告。通过开启异常模式,错误会以SQLite3Exception形式抛出,既能被try/catch正常捕获,又不会生成警告日志。
修改代码如下:
// 创建数据库连接后,添加此行开启异常模式 $db->enableExceptions(true); try { $statement = $db->prepare('UPDATE '.$tname.' SET _blablabla_'); $statement->bindValue(_blablabla_); // ... $result = $statement->execute(); $status = "Updated! " . $db->lastErrorMsg(); } catch (SQLite3Exception $e) { $status = "Error updating! ".$e->getMessage(); }
当约束检查失败时,代码会进入catch块,$status会被设置为具体错误信息,同时不会在服务器日志中留下警告。
方法二:手动抑制警告并检查执行结果
若不想使用异常机制,可通过错误抑制符@阻止execute()触发警告,再检查返回值是否为false,最后从语句对象中获取错误信息:
try { $statement = $db->prepare('UPDATE '.$tname.' SET _blablabla_'); $statement->bindValue(_blablabla_); // ... // 用@抑制警告,再判断执行结果 $result = @$statement->execute(); if ($result === false) { $status = "Error updating! " . $statement->lastErrorMsg(); } else { $status = "Updated! " . $db->lastErrorMsg(); } } catch (Exception $e) { $status = "Error updating! ".$e->getMessage(); }
注意:需使用$statement->lastErrorMsg()而非$db->lastErrorMsg(),因为语句执行的错误信息会存储在语句对象中,连接对象的错误信息可能不会同步更新。
内容的提问来源于stack exchange,提问作者FedKad
相关产品推荐
相关产品推荐

