没注意运算符优先级(漏掉括号)导致的一个 BUG

昨天新上线的一个项目,换了 $_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。

4个评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注