微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – MySQLi编写语句错误报告

参见英文答案 > How to get MySQLi error information in different environments? / mysqli_fetch_assoc() expects parameter 1 to be mysqli_result                                    1个
我正试图绕过MysqLi,我对错误报告感到困惑.
我使用MysqLi’prepare’语句的返回值来检测执行sql时的错误,如下所示:

$stmt_test =  $MysqLiDatabaseConnection->stmt_init();
if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)"))
{
 $stmt_test->execute();
 $stmt_test->close();
}
else echo("Statement Failed: ". $stmt_test->error . "<br>");

但是,prepare语句的返回值是仅检测sql语句的预处理中是否存在错误而未检测到执行错误?如果是这样,我应该更改我的执行行以标记错误,如下所示:

if($stmt_test->execute()) $errorflag=true;

然后只是为了安全我应该在语句执行后执行以下操作:

if($stmt_test->errno) {$errorflag=true;}

…或者我可以开始使用MysqLi prepare’语句的返回值捕获与它定义的查询的完整执行相关的所有错误

谢谢
C

解决方法:

我在最近两天之前写了两次这样的话(对我而言,即使问题开始有点不同,也是重复的).

MysqLi的每种方法都可能失败.您应该测试每个返回值.如果一个失败,请考虑继续使用不符合您期望状态的对象是否有意义. (可能不是处于“安全”状态,但我认为这不是问题.)

由于每个连接/语句仅存储最后一个操作的错误消息,因此如果在出现错误后继续,则可能会丢失有关导致错误的原因的信息.您可能希望使用该信息让脚本决定是再次尝试(仅限临时问题),更改内容还是完全拯救(并报告错误).它使调试变得更容易.

$stmt = $MysqLi->prepare("INSERT INTO testtable VALUES (?,?,?)");
// prepare() can fail because of Syntax errors, missing privileges, ....
if ( false===$stmt ) {
  // and since all the following operations need a valid/ready statement object
  // it doesn't make sense to go on
  // you might want to use a more sophisticated mechanism than die()
  // but's it's only an example
  die('prepare() Failed: ' . htmlspecialchars($MysqLi->error));
}

$rc = $stmt->bind_param('iii', $x, $y, $z);
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement
// or there's a type conflict(?), or ....
if ( false===$rc ) {
  // again execute() is useless if you can't bind the parameters. Bail out somehow.
  die('bind_param() Failed: ' . htmlspecialchars($stmt->error));
}

$rc = $stmt->execute();
// execute() can fail for varIoUs reasons. And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( false===$rc ) {
  die('execute() Failed: ' . htmlspecialchars($stmt->error));
}

$stmt->close();

编辑:六年后的几个笔记….
MysqLi扩展完全能够通过异常报告导致(MysqLi)错误代码不是0的操作,参见mysqli_driver::$report_mode.
die()真的非常粗糙,即使是像这样的例子我也不会用它.
所以,请注意,每个(MysqL)操作都会因为多种原因而失败;即使完全相同的事情在之前进行了一千次……

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐