我已经设置了一个自定义错误处理程序,但是我需要知道在哪里测试我准备好的语句中的错误。
我是在所有的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语句包围,这样做是否意味着其他阶段中的错误不会被处理?准备阶段最有可能出错吗?
发布于 2013-08-27 03:37:40
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错误,提供所有重要信息,跟踪站点范围内的错误报告设置。
https://stackoverflow.com/questions/18453924
复制相似问题