今天早上在公司上班的时候,突然同事在内部群上说有几个跑日志的脚本没有正常运行,找了各种原因都没找到问题,后天来发现是日志相关的配置在数据库的一个字段有问题,原定的逻辑是要存NULL,而数据库中则是null,乍一看,似乎并无区别,然而两者执行情况完全不同,null本身只是一个字符串变量,在逻辑上与NULL(空)完全不同,查找代码,发现原来是php变量有误,在空的情况下本该赋值null,结果写成了'null',被当成了一个单纯的字符串变量。
原因找到了,但更令人困惑的还在后面,按理说如果是代码逻辑问题的话,那么后台应该始终存在问题才是,为什么只有个别最近几天修改过的脚本会出问题呢,这就证明是最近某次修改中改变了代码逻辑导致的,于是开始找之前的历史代码(svn是个好东西),发现在空变量赋值上代码是没有更改过的,而变过的是sql语句,之前采用的是直接的insert语句进行操作,而就在前几天为了提高变量的安全性,防止注入和兼容特殊符号,sql语句被我改成了参数绑定的形式进行执行,那么这个
变动有什么问题吗,还真的有,对于:
$a = 'null';
$sql = "INSERT INTO xxx (`a`) VALUES ('$a')";
正常来说如果这样写的话,那么sql最终插入的就会是一个字符串null,然而真实的后台代码是