首页logo
  •  

jonllen

金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。

个人档案

jonllen
心情闪存 | 给他留言
妮称:jonllen
来自:中国. 湖南. 湘潭
简述:金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。
博客日历

审计署,这次让我感觉那么的无能为力。

昨天,进时代财富第二次出差,下午两点多就跑到审计署,去解决那个留言的Bug,本以为很容易就能解决马上回来,但是没想到晚上十点多才回来,面对那些问题觉得自己很无能为力,找到问题的切入口错误,需要自己检讨检讨。

事情的原委其实是这样的,之前我的同事光仔已经去过客户那边把IBOX系统部署好了,就剩下一个留言插件的功能还没有解决,由于这块功能是我开发的,所以就派我过去解决这个BUG。其实外网里一模一样的功能没有问题,把那些置标原封不动拷过来在客户内网运行就报错,我就是要去解决客户内网里IBOX系统里的留言插件问题。

button的onclick脚本函数不触发。

这是一个很奇怪的问题,我在IE里面用DeveloperToolbar看提交留言的按钮,明明就指定了onclick="leaveadd()"脚本函数,点击按钮却怎么也没有反映,只报一个未找到对象的错误。但是js的leaveadd函数明明是有的啊,我是放在显示提交留言页面一起的。不过我做的这个提交留言页面有点特殊,因为它是作为一种置标动态输出js代码,然后js在使用ajax动态获取提交留言页面的html显示出来的,所以那个提交留言页面的html包括提交留言的文本输入框、按钮、leaveadd的javascript函数都是被动态加载到当前页面实现的,我在加载成功后把返回的html代码赋值放到一个DIV内,加载没有问题能在页面实现,但点提交的按钮却不触发关联的onclick事件函数,我曾尝试把按钮的onclick改成"javascript:leaveadd();"、"alert(0)"都无任何效果,好象页面被禁止执行脚本了一样,但实际上是没有被禁止的,因为页面头部导航菜单做的js渐出渐入的效果没一点问题,我想可能是因为那段javascript被动态加载在页面内出现了严重的错误,但会导致下面所有的javascript函数不会触发?我真是百思不得其解,客户那边一而再的问我解决没,康师傅也打了好几个电话过来问情况,我却只能说还没有。时间一个个小时的过了,客户说我这个耽误的时间太久了,搞不好这个今晚也要上线,大家做的事都差不多了,我作为一个技术支持,跑个客户那边搞了半天问题还没有解决,感觉真的很丢脸,我第一次感觉到自己这么没用,面对这些html和javascript代码是这么的束手无策!

脚本错误只是表面,后台程序也有严重的错误。

终于,我想到使用js去动态绑定按扭的onclick事件,并使用setTimeout函数延迟执行,单独写<script>脚本块,避免之前的leaveadd()脚本对它造成影响,这样终于能触发按纽绑定的click事件的函数。提交留言能执行前面的验证,但是之前使用jQuery1.2.5版本获取raido选择值的方式在最新版jQuery1.3.2出错,不过把原来的"input[@name=leavetype][@checked]"筛选器改成".retype input:checked"就没有问题了,但前面的验证通过后还是不能提交留言。提交留言是使用jQuery的ajax去post到动态页面的,但执行到这里却什么都没有反映,就像原来点击按钮又没动静了,再度纠结中。我那时还因为是jQuery脚本冲突,还自己写了一个XMLHttpRequest对象去使用ajax,结果还是一样,但是自定义写的ajax请求默认有请求错误的提示,所以会提示"请求页面失败!",可能我那个是被搞晕了,竟没有想到是ajax请求的那个页面有问题。后来康师傅打电话说用form表单,所以我就把原来的用ajax提交留言改成一个form让它submit,这样是最原始的post也不需要使用任何脚本,输入数据提交表单post到留言的那个aspx页面后,出现的是asp.net那些红黄色的错误信息,额…原来是ajax请求留言的那个动态页面出错了,怪不得使用jQuery的ajax怎么去post也没反应,而且什么问题也看不出来,因为我没有指定onerror函数,所以没有任何提示信息,而我自己写的XMLHttpRequest对象去使用ajax默认有请求失败的处理,所以就只会提示"请求页面失败!",无语了,马上把页面错误信息发给康师傅对照源代码找。

由数据库名引发的错误。

终于找到问题的根源了。很快就把问题定位在关键字的处理,因为提交的留言在插入数据库之前是先要通过关键字过滤,关键字处理LawlessAgent是一个系统单件类,也就全局只有一份实例,而这个类初始化的时候会初始化自定义表单,调用一个叫sys_InitLawlessSource的存储过程,而这个过程里有一个跨库查询的操作,从IBOXPlugin插件库获取所有FO_Form自定义表单,并把所以要进行关键字过滤的FO_Field字段插入到IBOX主库的FA_Lawless_Source关键字源表里,而IBOXPlugin这个库名是写死在存储过程里面的,而客户那边的数据库名都变了,分别是叫IBOX_Main、IBOX_Plugin、IBOX_Traffic,用IBOXPlugin.dbo.FO_Form肯定就找不到,所以调用这个存储过程的时候就出错了。部署一个网站的时候,就因为忘记把数据库名改正过来害我折腾了半天,不过程序也有不合理的地方,就是用到了跨库访问,就算数据库存在还有可能会存在访问权限的问题。找到这个数据库名错误的问题后马上修正,在服务器端手动的执行了一次,存储过程InitLawlessSource能成功执行没有有问题了,回到程序再进行提交留言,但还是报"对象名  'IBOXPlugin.dbo.FO_Form' 无效。",仍然提示关键字LawlessAgent类初始化时出错,这就搞不懂了,难不成还有其他地方也有用到'IBOXPlugin.dbo.FO_Form'?还是缓存了?纠结中。但现在已经没有时间了,最后康师傅在留言插件里去掉了LawlessAgent关键字过滤的部分,重新生成一份dll文件给我,更新后就没有问题了。

总结:

千错万错终归我,恨自己浪费了这么久时间还没有解决问题,留言的程序也不够健壮,不知道早打开错误日志查看,解决问题的时不够冷静,找问题时只停留在表面,不够细心,没能深入思考根源所有。善哉!

  • posted@ 2009-11-05 10:35
  • update@ 2009-11-06 22:13:43
  • 阅读(9876)
  • 评论(0)

相关文章

评论
暂无任何评论。
发表评论
*必填
回复通知我
*必填

博文推荐