【坑】sql中update的返回值

来源:转载

我们PHP程序员最常用的条件判断一般是这么写的:

if($var){ //do something ; }

php中0、空值、null、空数组、false都是假值。这是一个预备知识。

当我们用ThinkPHP开发的时候常常会用到下面的代码,用其他语言的可以类比下。

if( M('xx')->save($data) ){ //do something ; } else{//报错,执行失败!}

意思是如果更新成功,那么继续执行,不然的话,直接报错。

看起来好像没问题的代码,这种代码常用于更新某些资料时,你会发现一个很诡异的现象:更新资料一会儿成功,一会儿失败。或者有些时候成功,但是有些时候有失败。你仔细总结下,会发现:当资料没有进行任何改动时,如果表里没有时间戳这种字段,怎么点都是失败。

为什么呢?因为Thinkphp的save方法本质上是mysql的update方法,而update返回的值是影响的行数,当资料完全没变化时,自然就返回一个0,而0值在php中是假,于是就被判断成了执行失败。

正确的写法是

if( M('xx')->save($data) !== false ){ //do something ; } else{//报错,执行失败!}

只有当update语句返回false值时才是sql执行失败,返回0代表的是没有影响任何一行数据,表里的数据没变化。

与此类似的还有Thinkphp的setField方法。

这个小知识点必须得知道,不然开发过程中出现这个问题时,简直是一头雾水。知道这个现象的原因后,就算自己还是常常忘记写 !== false 的判断条件,也会一下子就发现问题出现在哪里。

这个坑,我至少踩过十次,前面压根不知道为什么,后面终于琢磨出原理来了。


分享给朋友:
您可能感兴趣的文章:
随机阅读: