我有一个自定义的错误处理程序,但我需要知道在哪里测试准备好的语句中的错误。
我是在所有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错误提供所有重要信息,遵循站点范围的错误报告设置。