我有一个自定义错误处理程序,但我需要知道在准备好的语句中测试错误的位置。
我是否可以在所有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语句中包含错误的代码,这样做是否意味着其他阶段的错误将无法处理?准备阶段最容易出错吗?
答案 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错误,提供所有重要信息,遵循站点范围的错误报告设置。