织梦DEDECMS二次开发的一些经验之谈
如果您想从此贴直接获得一些有用的插件、模块、或代码,请绕道~~
“授人以鱼”还是“授人以渔”,此贴是后者,希望对你有所帮助……
* 提示:如果你是PHP编程有比较深入经验了,请只读红字内容即可,其它跳过。
如果你是PHP初学者,请仔细阅读所有文字,别嫌繁琐,对你提高有好处!
1、执行header()前输出的空格、空行、任何字符,都会导致header()跳转失效!
前几天,帮一个客户做了一些修改,把代码发给对方之后,对方后来反映说“后台栏目查看文章列表不行了”,我去查看果真如此,点击了栏目后面的“内容”进去,一片空白!这一点我当时百思不得其解,因为我做修改的代码,和这个功能完全没有关系!于是不得已,只好一步步做跟踪调试:
首先要排查的是语法错误(如果当php.ini里设置是不显示任何错误的话,语法错也会导致一片空白),这个文件是dede/catalog_do.php(怎么知道是这个文件呢,很简单,在那个一片空白的页面上,点右键,看属性,就有地址URL和传递的参数),我把一行die("aa"); 放在了代码第一行,这个做法就可以测试有无语法,因为语法错不单可以发生在catalog_do.php文件本身,还可以发生在 catalog_do.php文件所引用的文件里(包括这些文件里再引用的任何一级文件里),所以如果这个第一行die("aa"); 也不能执行,就必然是语法错。因为能输出aa,也就是说语法没有错,就必定是某种程序上的逻辑错。
然后进一步寻找逻辑错误发生的文件,这就需要跟踪代码的所执行到的地方,由于没有任何提示,也还是利用die("aa"); ,把这一行往下挪到catalog_do.php文件的include、require等语句之后,如果不能执行,说明在include、require 所引用的文件里,代码执行就停止了,反之说明那些文件执行是正常的。这一步,依然能显示aa,说明错误是发生在catalog_do.php文件里(如果是发生在其他所引用的文件里,就用此法打开那些文件去如是调试)
然后再此文件里一步步寻找发生错误的具体代码段,首先要看链接此文件时候的参数(在那个一片空白的页面上,点右键,看属性,就有地址URL和传递的参数),而点击“内容”时链接此文件的URL为 catalog_do.php?cid=3&dopost=listArchives(它的意思,我们可以猜测它cid是栏目ID,而最重要的是 dopost=listArchives这个参数,因为我们在catalog_do.php文件里,可以看到接下来的代码,就是一连串的if (dopost=="...."){ }else if(dopost=="...."){ }else.....的判断,它就是让程序运行,根据过来的dopost=参数的不同,进入不同的处理),好,我们就直接找到if (dopost=="listArchives"){ 这里,把die("aa"); 放到紧接着它的第一行,看看还能否输出aa,如果可以输出,说明程序正确进入了目标程序段,否则就说明dopost=="listArchives"这个判断没有达到预期的效果(如果是这个情况,你就要好好对照刚才的URL和这个dopost=="listArchives",有没有写错参数名、大小写有没有弄错了,还有就是dopost值有没有在前面就被改变了,最常见的错就是类似写成了dopost=="listarchives",或者在前头某个判断里写成了dopost="..."),好,依然能输出aa,说明程序也进来这里了。
然后继续寻找发生错误的代码行,继续挪动die("aa"); 的玉步,每次挪动完,刷新那个空白页面,看看能否输出aa(这里有技巧,想快,就不要逐行挪动,而是利用折半查找,或者在关键代码前后插入,这个就需要比较强的代码阅读能力和一定的编程经验了,不展开了),最后,我发现在header("location:{$gurl}?channelid= {$channelid}&cid={$cid}"); 这一行之前能输出aa,这一行之后也能输出aa,而我是很清楚,这一行本该跳转到某个指定的页面上的,后面不应该输出aa,同时我也知道造成这个问题,通常是因为程序执行在之前就输出过字符(如果你不清楚,就查google或手册)!
接下来的工作,就是找哪个文件有这个输出了,天啊,这太难找了!于是我换了另外一个做法“修改排查法”,我在本地把我那些修改的代码,也换上去,发现没有出现这样的问题,也就是说,我写的文件没有问题。然后我把客户所有文件,都列出来,按修改时间排序,并询问了客户最后可以正常使用这个功能的时间,发现了一堆在此时间之后修改的php文件,除去我修改的那些文件,就剩下两个文件了,其中一个是include/extend.func.php文件,我很清楚这个文件是一个dede提供给客户做函数扩展的文件,它被 common.func.php所引用,而common.func.php又是被全站所有文件所引用的文件! 于是我打开这个文件,赫然在最后?>之后,有两个空格一个空行!!!!!!
把这些空格空行删除,至此功能就全部正常了(包括我在模块表里自定义了一个模块链接,它在这个错误的情况下,不能显示在模块列表里,现在也正常了)!
以上文字,对于初级PHPer,可以学习领会一点点PHP调试技术;对于PHP已经比较熟的,而对DEDE还有有点陌生的,这里提供的一条经验就是:修改DEDE的所有PHP文件,千万不要在头尾两行的 <? ?>之外,写入任何字符,包括空格和空行!!
☉首先声明,只要是我们的vip会员所有源码均可以免费下载,不做任何限制
☉本站的源码不会像其它下载站一样植入大量的广告。为了更好的用户体验以后坚持不打水印
☉本站只提供精品源码,源码在于可用,不在多!!希望在这里找到你合适的。
☉本站提供的整站程序,均带数据及演示地址。可以在任一源码详情页查看演示地址
☉本站所有资源(包括源码、模板、素材、特效等)仅供学习与参考,请勿用于商业用途。
☉如有其他问题,请加网站客服QQ(984818011)进行交流。
☉本站的源码不会像其它下载站一样植入大量的广告。为了更好的用户体验以后坚持不打水印
☉本站只提供精品源码,源码在于可用,不在多!!希望在这里找到你合适的。
☉本站提供的整站程序,均带数据及演示地址。可以在任一源码详情页查看演示地址
☉本站所有资源(包括源码、模板、素材、特效等)仅供学习与参考,请勿用于商业用途。
☉如有其他问题,请加网站客服QQ(984818011)进行交流。
相关教程:
- 织梦DedeCMS内容模型里面将系统模型改成自动模型
- 织梦DedeCMS默认图集内容页模板去掉自动播放的方法
- 织梦{dede:flink}友情链接标签支持limit属性的方法
- 织梦DedeCMS栏目页分页标题Title添加“第N页”的方法
- 织梦DedeCMS 5.7图集点击图片进入下一篇的修改方法
- DEDECMS织梦模板点赞功能教程
- 织梦dedecms支持短信验证发送解决方案
- dedecms织梦图集上传图片自动获取图片名做注释
- 织梦栏目分页标签获取单独超链接
- 织梦dede:channel标签的支持autoindex数字递增调用方
- dedecms织梦点击数过千、万、亿的写法
- dedecms列表页面第一个文章与其他文章不同样式