昨天新上线的一个项目,换了 $_SESSION 的处理方式。代码中有这样一条 SQL
$expiration = 1440 // <---- 这个在别的地方定义的 $sql = 'DELETE FROM session WHERE last_activity < ' . time() - $expiration;
线上代码运行过程不停的 warning ,说 SQL 语句执行出错,出错语句为 “-1440”,找了很长时间都没找到这个 BUG,后来终于找到那个 SQL 语句:
// 运行这一行语句,你会得到 -1400,而不是我们想要的 SQL 语句 echo 'DELETE FROM session WHERE last_activity < ' . time() - 1440;
为什么会是这样呢,因为字符串链接符 . 的优先级比运算符 – 要高,前面那一串先和 time() 返回的数字连成一个字符串,然后再与 1440 做减法运算,前面的一串字符串强制转换为数字 0,然后减 1440,就得到了 -1400,然后错误就出现啦。找到问题就好解决了,加上括号便 OK。
$expiration = 1440 // <---- 这个在别的地方定义的 $sql = 'DELETE FROM session WHERE last_activity < ' . (time() - $expiration);
话说这类错误很不好发现啊,项目里面那么多地方运行 SQL 查询,哪知道是哪里出错的呢。
看来有必要在 Log 里面里面记录函数调用栈,这样才能知道是哪里出错,能快速定位 BUG。
哎,这种事情真心无语,C语言的时候当初把main写成mian,那个测试调试了一个小时啊!还有更痛苦的if(i=1),坑爹了啊
哈哈。把main写成mian 我也有过这个经历,当时在谷歌上搜索 N 久也没找到问题所在。这种情况用 GDB 一步步跟踪下代码执行过程就可以发现问题所在了。
是啊。。。这个属于bug之王
楼主很厉害啊 呵呵 多多详细就更好了