何时会发生预处理语句失败?

3

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

到目前为止,我主要做了以下操作:

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

通常情况下,当SQL执行失败时,这意味着我的SQL语句基本上是错误的。

以下情况都已经得到确认:

  • 已检查确保与MySQL连接
  • SQL是正确的,即使返回0行
  • 所有相关表已存在

在什么情况下预处理语句会失败?我想知道是否有必要使用 if($stmt = $mysqli->prepare($sql)) 检查,或者这只是浪费代码行数?


1
请将以下与编程有关的内容从英语翻译成中文。仅返回已翻译的文本:几乎完美的副本 [此问题](https://dev59.com/bXE85IYBdhLWcg3w6n90) - kuroi neko
抱歉,我以为只有我不明白这个问题...谢谢@kuroineko - Gary
2个回答

2

一个有效的查询可能会失败的方式有很多:

  • 您对表的权限可能已被撤销。

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

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

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

  • 连接可能会意外终止。

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

将以下文本翻译成中文:

想象一下一个简单的文件打开函数,比如fopen()。如果你拼错了文件名,或者在你尝试打开它之前文件被删除了,或者有人更改了文件权限,以至于你无法使用指定的访问模式读取它,那么就会出现错误。这意味着你需要在每次fopen()调用后检查是否成功。

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


1
我想到的第一个问题是:在您进行检查后,不能保证连接仍然存在。我确信还有很多其他原因存在。但一个原因应该足够了。

为避免被批评的样板代码,我已经移除了那个建议。但是,在这里并不需要它。 - Markus Malkusch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接