在mysqli准备好的语句中检测错误

Jac*_*dge 3 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);
Run Code Online (Sandbox Code Playgroud)

我什至必须在寻找时检查错误,num_rows还是因为php不再与mysqli服务器通信而无法完成基本工作,所以什么都不会出错?

您应该停止寻找错误的原因是什么execute()?作为store_result()不工作将是PHP无法完成其工作,这将是服务器实际上没有运行?

我也看到了代码,其中该prepare()阶段仅在if语句中包含错误,这样做是否表示其他阶段中的错误将不会得到处理?准备好的阶段最有可能出错吗?

You*_*nse 6

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

虽然还有另一种方法,但是它是相当新的,我还没有对其进行太多测试。但这很诱人,因为它可以让您摆脱所有这些触发错误:

mysqli_report(MYSQLI_REPORT_ERROR);
Run Code Online (Sandbox Code Playgroud)

这个简单的调用将使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();
Run Code Online (Sandbox Code Playgroud)

更新资料

最后,我正确使用了MYSQLI_REPORT_STRICT

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Run Code Online (Sandbox Code Playgroud)

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