检测mysqli准备语句中的错误

时间:2013-08-26 22:15:06

标签: error-handling mysqli prepared-statement

我有一个自定义错误处理程序,但我需要知道在准备好的语句中测试错误的位置。

我是否可以在所有prepared()bind()execute()store_result()阶段或仅选定的阶段进行测试?

$statement = $databaseHandler->mysqli->prepare($query) or trigger_error($mysqli->error);
$statement->bind_param('s', $userIp) or trigger_error($mysqli->error);
$statement->execute() or trigger_error($mysqli->error);
$statement->store_result() or trigger_error($mysqli->error);

在查找num_rows时是否甚至必须检查错误,或者只是因为它不再与mysqli服务器通信而导致php无法完成基本工作,所以什么都不应该出错?

你应该停止寻找错误的重点是什么?是execute()之后吗?因为store_result()无法正常工作,php将无法完成其工作,这将是服务器实际上无法正常运行?

此外,我已经看到prepare()阶段只是在if语句中包含错误的代码,这样做是否意味着其他阶段的错误将无法处理?准备阶段最容易出错吗?

1 个答案:

答案 0 :(得分:4)

AFAIK,您需要将mysqli错误转换为PHP错误,仅用于准备和执行 - 与服务器交互的命令。所有其他命令都会发出常规的PHP错误。

虽然有另一种方法,但它很新,我还没有经过多少测试。但它很诱人,因为它会让你摆脱所有这些触发错误:

mysqli_report(MYSQLI_REPORT_ERROR);

这个简单的调用会让mysqli自动发出PHP错误。

尽管MYSQLI_REPORT_STRICT似乎是更好的选择,但它对我的版本来说还不起作用。虽然MYSQLI_REPORT_ALL也可以翻译mysqli提示,但一方面,它非常好,但它可以通过'No index used in query/prepared statement'等通知向您发送垃圾邮件,这很糟糕。因此,目前唯一可用的设置是MYSQLI_REPORT_ERROR

所以,你可以只做

mysqli_report(MYSQLI_REPORT_ERROR);

$statement = $db->prepare($query);
$statement->bind_param('s', $userIp);
$statement->execute();
$statement->store_result();

更新

最后,我已正确使用MYSQLI_REPORT_STRICT

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

将使mysqli抛出异常而不是常规错误 异常在很多方面优于常规错误:它们总是包含堆栈跟踪,可以使用try..catch捕获它们,也可以使用专用错误处理程序处理它们。甚至未处理,它们充当常规PHP错误,提供所有重要信息,遵循站点范围的错误报告设置。