2013-05-03 89 views
0

我正在使用mysql和php,我试图测试错误处理的调用,但我不明白为什么这不会给出错误。我执行以下行:为什么这不会出错

if (! mysql_query("UPDATE Accounts SET disabled='0' WHERE id='15'")) { ... } 

这里的场景......有一个叫“帐户”表,但没有与15的ID(这是主键)的记录。我已经从命令行和通过网页浏览器尝试过了,但是这行代码没有问题。我检查了这个PHP手册,这里是他们的页面报价:

For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error. 

为什么这不会产生一个错误?任何帮助将不胜感激!

+3

导致没有更改的更新不是错误。 – Mat 2013-05-03 15:49:50

+0

您的声明不会更新任何行,但这不被视为错误。它成功执行是因为没有像“未定义列”,“表不存在”,“无法连接”等错误。有些情况下,您想针对匹配WHERE条款的行发布更新,如果更新没有找到任何东西,那就没关系。 – 2013-05-03 15:50:59

+0

感谢输入帮派,我会重构代码以考虑这一点。 – user1646428 2013-05-03 16:49:39

回答

2

查询不失败。

仅仅因为ID不存在,并不表示查询失败。 Mysql成功查找记录,发现没有记录,并且没有应用任何操作。这与!mysql_query语句建议的内容大不相同。这意味着mysql无法运行你的命令。

在这里你的命令运行成功,只是没有影响你的表,由于不存在的行。

1

您的查询将不更新记录。
这不是一个错误,每当WHERE子句中的条件不符合时都会发生。

有很多方法可能导致您的查询失败。其中之一是使用不存在的字段:

UPDATE Accounts SET blablabla='0' WHERE id='15' 
0

空结果集和错误之间存在差异。导致没有改变的查询不是错误,它只是一个恰好为空的有效结果,例如,

这永远不能返回任何东西:

mysql> select now() from dual where 1=0; 
Empty set (0.01 sec) 

,但仍然不是一个错误。这只是一个空集。相比之下,这将始终返回一行:

mysql> select now() from dual where 1=1; 
+---------------------+ 
| now()    | 
+---------------------+ 
| 2013-05-03 09:51:19 | 
+---------------------+ 
1 row in set (0.00 sec) 

然后出现错误。这不会返回空集,因为查询本身在解析器级失败:

mysql> select now() from dual where abc=def; 
ERROR 1054 (42S22): Unknown column 'abc' in 'where clause' 
相关问题