准备好的语句何时会失败?

加里

我一直在弄乱中的MySQLi对象PHP,并习惯于在执行语句之前准备语句。

到目前为止,我主要从事以下工作:

if($stmt = $mysqli->prepare($sql) == false){
    return $mysqli->error;
}

当它失败时,它总是告诉我我的SQL本质上是错误的。

假设以下内容:

  • 已进行检查以确保MySQL连通性
  • SQL是正确的,即使它返回0行。
  • 所有相关表都存在。

在什么情况下准备好的陈述可能会失败?我问,主要是想知道是否有任何指向if($stmt = $mysqli->prepare($sql)),还是我只是在浪费代码行?

比尔·卡温

有效查询失败的方式有很多:

  • 您对表的特权可能会被撤销。

  • 可以在无效上下文中使用参数占位符格式化正确的SQL查询。

  • 该查询可能会根据服务器设置抛出错误,例如被零除会返回NULL,但是有人可以在服务器上全局启用SQL模式以使被零除会引发错误。在其他情况下,服务器设置也可以更改有效SQL查询的含义。

  • 您说这些表存在,但是任何表都可以删除或重命名。另外,列可能会更改,因此您先前有效的SQL查询将不再找到其命名的列,或尝试以无效的方式使用它们。

  • 连接可能会意外终止。

因此,在准备查询执行查询时,您确实需要检测并响应错误

考虑一下类似于fopen()这样的简单文件打开功能的类比如果您拼错了文件名,或者在尝试打开文件之前就删除了文件,或者有人更改了文件特权,以致您无法使用指定的访问模式来读取文件,则可能会出错。这意味着您需要在每个fopen()调用之后检查是否成功

如果将mysqli配置为引发异常,则可以减少错误检查代码。http://www.php.net/manual/en/mysqli-driver.report-mode.php

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章