昨天给一个朋友开发一个功能,功能要求是:批量获取会员 id,并修改这些会员对应的表#@__member 里面的 exptime 值为后台登录管理员的名称。
看到这个要求时,没有感觉什么难度,因为,我把织梦系统 dedecms 里面的 95%的源码分析完了,而且,像这样重要的功能都分析了不少于 5 次,谈好价钱后接下来就开发了。
但是在开发过程中遇到一个非常简单,但是,很容易忽略的问题,我们知道在编程里面,哪怕是一个符号出错,可能这段程序就无法运行,正是由于这个简单的东西,让我浪费了半个多小时,做这个教程记录一下这个问题,增加一下印象,以免以后再出错,相信以后,再遇到类似的问题,我肯定是不会出错了,希望对大家也有用处。
开发的功能如下图所示:
获取选中的 id 值,具体如何获取的这里不讲了,假设获取的二个值分别 2,3,接下来当然是写 php 代码,修改 exptime 值为后台登录管理员名称(如何获取这里也不讲了,我后台管理员名称是 admin)。
我写的 sql 语句是:"UPDATE `#@__member` SET exptime='admin' where mid in (2,3)";
但是,不管我如何执行这个 sql 语句,死活改不了 exptime 字段的值,这个字段在表 dede_member,如下图所示:
不管如何改就是改不了 exptime 这字段值,一直是零,请问大家是这什么原因?
当我遇到这个问题,我做了如下检查:
1. 我认为我写的程序有问题,但是,经过多次检查,没有发现任何问题,检查一下批量获取 id 的 js 函数也没有问题,全都可以获取。
2. 上面实在是找不出问题,那我就想到第二步,是不是在我更新 exptime 这个字段时,因为,是时间,织梦系统把我已经更新成 admin 的值,又给覆盖掉成零了?想到这里有一点希望的感觉,于是就找有可能进行设置缓存的函数会把这个值给改掉,在哪里能改掉这个值呢?要么是会员类,要么是登录类,于是到 include 里面,找到这个二织梦类,研究一下发现,并没有做什么操作,而且,我只是获取到了 id 值,然后,对表 dede_member 进行了修改。
是不是 member_main.php 里面有功能,把我改的给重置成零了?找了一下,也没有找到,最后,找到了 config.php 的后台配置文件,也没有发现。
到这里还没有死心,仍然觉得应当是织梦系统通过 session 把我登录或注册时的信息给放到 session 文件里面了,而我登录时,过期时间可能写的是 0 或没有填写默认是零,于是去 data/cache 目录里面查看 session 文件内容,结果一无所获,甚至在 sessions_d41d8cd98f 目录里面也没的找到,这是什么问题。
3.经过上面的折腾后,又回过头来重新审视一下 exptime 字段,到这时可以说已经到悬崖边上了,走头无路了,心想难道是这个字段有问题? 于是把上面的 sql 语句里面的 exptime 字段改为 dede_member 表里面的 face 字段,即:UPDATE `#@__member` SET face='admin' where mid in (2,3)
结果成功了,柳暗花明,此时,我判断是 exptime 字段的问题,于时到数据库里面查看了表 dede_member 里面对应的这个字段的结构,如下图所示:
看到没有,人家 exptime 是一个 smallint 字段,是一个整数类型,你给人家写上文本(管理员名称),驴唇不对马嘴,人家整型是用到存储数字的,你非给人家存储字符串,肯定不行,问题出这里了。
于是改了了一下面的 sql 语句:UPDATE `#@__member` SET exptime='2' where mid in (2,3)
这样 exptime 对应的 id 为 2,和 3 的全部改成了 2,如下图所示:
上面是我遇到的一个不算问题的问题,中间走了不少弯路,我把我的思路写出来,供大家参考,如果我直接写出答案可能你也就只知道答案,这样相信可以学到更多,相信,我以后,绝对不会再犯这样的错误了。
总结:在我们开发中,经常会遇到修改某些数据库表里面的字段,在修改前一定要对表里面要修改字段类型有一个了解,否则,可能会遇到上面我遇到的问题,什么类型存储什么类型的数据,这是我从这个小错误中,对这句话有了一个更深刻了理解。
转载:http://www.dedebase.com/thread-1082-1-1.html
评论