我一直在搞乱MySQLi
对象在PHP
,并且习惯于在执行语句之前准备语句。
到目前为止,我主要做了以下事情:
if($stmt = $mysqli->prepare($sql) == false){
return $mysqli->error;
}
当它失败时,它总是告诉我我的 SQL 基本上是错误的。
假设如下:
- 已进行检查以确保
MySQL
连接性
- The
SQL
是正确的,即使它返回 0 行。
- 所有相关表都存在。
在什么情况下准备好的声明会失败?我问,主要是想知道有没有什么意义if($stmt = $mysqli->prepare($sql))
,或者我只是浪费代码行?
有效查询失败的原因有很多种:
您对牌桌的权限可能会被撤销。
正确的 SQL 查询可以在无效上下文中使用参数占位符进行格式化。
根据服务器设置,查询可能会抛出错误,例如除以零返回 NULL,但有人可以启用SQL mode http://dev.mysql.com/doc/refman/5.6/en/server-sql-mode.html在服务器上全局进行除以零会抛出错误。还有其他情况,服务器设置可以改变有效 SQL 查询的含义。
您说这些表存在,但任何表都可以删除或重命名。此外,列可能会被更改,因此您以前有效的 SQL 查询将不再找到它命名的列,或者尝试以无效的方式使用它们。
连接可能会意外终止。
因此,当您执行以下操作时,您确实需要检测并响应错误prepare当你execute一个问题。
想象一个简单的文件打开函数的类比,例如fopen() http://php.net/manual/en/function.fopen.php。如果文件名拼写错误,或者在尝试打开文件之前文件被删除,或者有人更改了文件权限,导致您无法使用指定的访问模式读取文件,则可能会出现错误。这意味着您需要在之后检查是否成功everyfopen() 调用。
如果将 mysqli 配置为抛出异常,则可以减少错误检查代码。看http://www.php.net/manual/en/mysqli-driver.report-mode.php http://www.php.net/manual/en/mysqli-driver.report-mode.php
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)