我一直在使用MySQLi
中的PHP
对象,并且在执行之前习惯于准备语句。
到目前为止,我大部分都在做以下事情:
if($stmt = $mysqli->prepare($sql) == false){
return $mysqli->error;
}
当它失败时,总是告诉我我的SQL基本上是错的。
假设如下:
MySQL
连接SQL
是正确的,即使它返回0行。在什么情况下准备好的声明会失败?我问,主要是想知道if($stmt = $mysqli->prepare($sql))
是否有任何意义,或者我只是在浪费代码行?
答案 0 :(得分:1)
首先出现在我的脑海中:检查后不保证连接存在。我相信还有很多东西。但有一个原因就足够了。
答案 1 :(得分:1)
有效查询可能有多种失败方式:
您的表格权限可以撤销。
可以使用无效上下文中的参数占位符格式化正确的SQL查询。
查询可能会因服务器设置而抛出错误,例如除以零会返回NULL,但有人可以在服务器上全局启用SQL mode以使除以零抛出错误。还有其他情况,服务器设置可以改变有效SQL查询的含义。
您说表存在,但可以删除或重命名任何表。此外,列可能会被更改,因此您之前有效的SQL查询不再找到它命名的列,或尝试以无效方式使用它们。
连接可能会意外终止。
因此,您需要在准备和执行查询时检测并响应错误。
想象一下像fopen()这样的简单文件打开函数的类比。如果拼错文件名,或者在尝试打开文件之前删除了文件,或者有人更改了文件权限,您将无法使用您指定的访问模式读取文件。这意味着您需要在每次 fopen()调用后检查是否成功。
如果将mysqli配置为抛出异常,则可以减少错误检查代码。见http://www.php.net/manual/en/mysqli-driver.report-mode.php