在mysqli-prepared语句中检测到错误


detecting errors in 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时是否必须检查错误,或者这只是php无法完成基本工作,因为它不再与mysqli服务器通信,所以应该不会出错?

你应该停止寻找错误的原因是什么,是在execute()之后吗?由于store_result()不起作用将是php无法完成其工作,哪一个服务器实际上不起作用?

我还看到过代码中prepare()阶段只是被错误的if语句包围,这样做是否意味着其他阶段中的错误将不会得到处理?准备阶段最容易出错吗?

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