3

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

我是在所有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还是只是 php 无法完成基本工作,因为它不再与 mysqli 服务器通信,所以应该不会出错?

你应该停止寻找错误有什么意义,是在之后execute()吗?由于store_result()不工作将是 php 未能完成其工作,这将是服务器实际上没有运行?

此外,我还看到了代码,其中prepare()阶段只是被包含在 if 语句中以表示错误,这样做是否意味着其他阶段中的错误将不会被处理?准备阶段是不是最容易出错?

4

1 回答 1

6

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 错误提供所有重要信息,遵循站点范围的错误报告设置。

于 2013-08-27T03:37:40.987 回答