准备好的声明什么时候失败?

时间:2014-01-10 16:32:23

标签: php mysqli prepare

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

到目前为止,我大部分都在做以下事情:

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

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

假设如下:

  • 已完成检查以确保MySQL连接
  • SQL是正确的,即使它返回0行。
  • 存在所有相关表格。

在什么情况下准备好的声明会失败?我问,主要是想知道if($stmt = $mysqli->prepare($sql))是否有任何意义,或者我只是在浪费代码行?

2 个答案:

答案 0 :(得分:1)

首先出现在我的脑海中:检查后不保证连接存在。我相信还有很多东西。但有一个原因就足够了。

答案 1 :(得分:1)

有效查询可能有多种失败方式:

  • 您的表格权限可以撤销。

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

  • 查询可能会因服务器设置而抛出错误,例如除以零会返回NULL,但有人可以在服务器上全局启用SQL mode以使除以零抛出错误。还有其他情况,服务器设置可以改变有效SQL查询的含义。

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

  • 连接可能会意外终止。

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

想象一下像fopen()这样的简单文件打开函数的类比。如果拼错文件名,或者在尝试打开文件之前删除了文件,或者有人更改了文件权限,您将无法使用您指定的访问模式读取文件。这意味着您需要在每次 fopen()调用后检查是否成功。

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