今天在处理客户端内容转义时遇到了一些麻烦,在网上找文章,看到不少人说是官方的二次转义BUG,还提供了一些修正方法,在本站也看到了一些人的反映,但没有看到官方的针对性回复。
经过N多小时的反复测试,看源代码,突然发现自己写的代码时,有的时候转义是正确的,有的时候又二次转义了,呵呵,怪不得官方没有进行正面回复呢,因为他们没有找到问题出现的原因。
好了,下面说我的发现:
我初步发现的情况是,直接用POST时,没有问题,但自己转到一个$data里,再add($data)或save($data)时就会有二次转义,结果是我客户端内容里的一个"\"或可能被转义的字符,在经过二次转义就会被加多一个"\",没有二次转义就是正常的存入、取出,而且官方代码在处理SQL时没有问题。
经过仔细比较自己的代码发现:
$Model->create($data);
$Model->save();
并不等同于
$Model->save($data);
也许是我本人理解上的问题,但确实官方的文档中没有说清楚这一点。目前为止我发现,在create($data)准备数据时,有判断环境有没有魔术转义,而直接save($data)就在没有判断的情况下再次进行转义。官方的人写代码可能比较规范,也没有象我这个总写些边缘代码的人问题多,所以不会出现这种比较,当然也不会找到原因了。
那么,解决的办法是什么呢?
就是这样写:
$Model->create($data);
$Model->save();
而不要直接save($data),除非你的内容里不包括可能被转义的字符,不然你就找原因吧。
这个问题花了很多时间找到,感觉自己是在上学做题,而不是利用工具,所以还是要给官方一些建议:
1、在文档里一定要说明不同形式下的相同与不同,要从代码级看问题,没有执行相同的代码就有可能不同,不同的地方要说明。至少我看代码时就感觉create只是准备数据,如果我自己准备好了,就不需要create了,但实际上,准备的内容没有讲清楚,其中就有官方的SQL安全过滤机制。
2、建议save时调制转义开关:save($data,$is_trans),用$is_trans来控制是否需要转义,默认应该是 !MAGIC_QUOTES_GPC,即有自动转义时,就不要再二次转义了,不然就带来一系列的理解差异。
其他可能还有更好的办法,这里只是抛砖引玉。
其他话:
几次找出THINKPHP官方的问题,感觉都不是编程能力问题,而是经验和总体取舍出现的问题,大家提出了问题,就说明遇到了至少是文档里不理解或误解的情况,就是官方应该将没有解决的问题进行整理排查,该修正文档的就修正文档,该出修改代码的就修改代码,网上的几个关于转义问题的处理方式在以前版本里的是否正确我不知道,至少在现在就会引起程序员对网方代码的怀疑,这是多少宣传都弥补不了的。
声明:
本人用过THINKPHP后认为,他的思路是很好的,是个好的框架,本人会继续支持THINKPHP
小广告:本人因故赋闲在家,二十余年IT业技术和市场经验,可以做系统设计、代码及其他,有任务可以联系我:13602537975。有闺女要养,没有办法,请大家支持。
最佳答案