DEDE二次開(kāi)發(fā)的一些經(jīng)驗
* 提示:如果你是PHP編程有比較深入經(jīng)驗了,請只讀加粗內容即可,其它跳過(guò)。
如果你是PHP初學(xué)者,請仔細閱讀所有文字,別嫌繁瑣,對你提高有好處!
1、執行header()前輸出的空格、空行、任何字符,都會(huì )導致header()跳轉失效!
前幾天,幫一個(gè)客戶(hù)做了一些修改,把代碼發(fā)給對方之后,對方后來(lái)反映說(shuō)“后臺欄目查看文章列表不行了”,我去查看果真如此,點(diǎn)擊了欄目后面的“內容”進(jìn) 去,一片空白!這一點(diǎn)我當時(shí)百思不得其解,因為我做修改的代碼,和這個(gè)功能完全沒(méi)有關(guān)系!于是不得已,只好一步步做跟蹤調試:
首先要排查的是語(yǔ)法錯誤(如果當php.ini里設置是不顯示任何錯誤的話(huà),語(yǔ)法錯也會(huì )導致一片空白),這個(gè)文件是 dede/catalog_do.php(怎么知道是這個(gè)文件呢,很簡(jiǎn)單,在那個(gè)一片空白的頁(yè)面上,點(diǎn)右鍵,看屬性,就有地址URL和傳遞的參數),我把 一行die("aa"); 放在了代碼第一行,這個(gè)做法就可以測試有無(wú)語(yǔ)法,因為語(yǔ)法錯不單可以發(fā)生在catalog_do.php文件本身,還可以發(fā)生在 catalog_do.php文件所引用的文件里(包括這些文件里再引用的任何一級文件里),所以如果這個(gè)第一行die("aa"); 也不能執行,就必然是語(yǔ)法錯。因為能輸出aa,也就是說(shuō)語(yǔ)法沒(méi)有錯,就必定是某種程序上的邏輯錯。
然后進(jìn)一步尋找邏輯錯誤發(fā)生的文件,這就需要跟蹤代碼的所執行到的地方,由于沒(méi)有任何提示,也還是利用die("aa"); ,把這一行往下挪到catalog_do.php文件的include、require等語(yǔ)句之后,如果不能執行,說(shuō)明在include、require 所引用的文件里,代碼執行就停止了,反之說(shuō)明那些文件執行是正常的。這一步,依然能顯示aa,說(shuō)明錯誤是發(fā)生在catalog_do.php文件里(如果 是發(fā)生在其他所引用的文件里,就用此法打開(kāi)那些文件去如是調試)
然后再此文件里一步步尋找發(fā)生錯誤的具體代碼段,首先要看鏈接此文件時(shí)候的參數(在那個(gè)一片空白的頁(yè)面上,點(diǎn)右鍵,看屬性,就 有地址URL和傳遞的參數),而點(diǎn)擊“內容”時(shí)鏈接此文件的URL為 catalog_do.php?cid=3&dopost=listArchives(它的意思,我們可以猜測它c(diǎn)id是欄目ID,而最重要的是 dopost=listArchives這個(gè)參數,因為我們在catalog_do.php文件里,可以看到接下來(lái)的代碼,就是一連串的if (dopost=="...."){ }else if(dopost=="...."){ }else.....的判斷,它就是讓程序運行,根據過(guò)來(lái)的dopost=參數的不同,進(jìn)入不同的處理), 好,我們就直接找到if (dopost=="listArchives"){ 這里,把die("aa"); 放到緊接著(zhù)它的第一行,看看還能否輸出aa,如果可以輸出,說(shuō)明程序正確進(jìn)入了目標程序段,否則就說(shuō)明dopost=="listArchives"這個(gè) 判斷沒(méi)有達到預期的效果(如果是這個(gè)情況,你就要好好對照剛才的URL和這個(gè)dopost=="listArchives",有沒(méi)有寫(xiě)錯參數名、大小寫(xiě)有 沒(méi)有弄錯了,還有就是dopost值有沒(méi)有在前面就被改變了,最常見(jiàn)的錯就是類(lèi)似寫(xiě)成了dopost=="listarchives",或者在前頭某個(gè)判 斷里寫(xiě)成了dopost="..."),好,依然能輸出aa,說(shuō)明程序也進(jìn)來(lái)這里了。
然后繼續尋找發(fā)生錯誤的代碼行,繼續挪動(dòng)die("aa"); 的玉步,每次挪動(dòng)完,刷新那個(gè)空白頁(yè)面,看看能否輸出aa(這里有技巧,想快,就不要逐行挪動(dòng),而是利用折半查找,或者在關(guān)鍵代碼前后插入,這個(gè)就需要比 較強的代碼閱讀能力和一定的編程經(jīng)驗了,不展開(kāi)了),最后,我發(fā)現在header("location:{$gurl}?channelid= {$channelid}&cid={$cid}"); 這一行之前能輸出aa,這一行之后也能輸出aa,而我是很清楚,這一行本該跳轉到某個(gè)指定的頁(yè)面上的,后面不應該輸出aa,同時(shí)我也知道造成這個(gè)問(wèn)題,通 常是因為程序執行在之前就輸出過(guò)字符(如果你不清楚,就查google或手冊)!
接下來(lái)的工作,就是找哪個(gè)文件有這個(gè)輸出了,天啊,這太難找了!于是我換了另外一個(gè)做法“修改排查法”,我在本地把我那些修 改的代碼,也換上去,發(fā)現沒(méi)有出現這樣的問(wèn)題,也就是說(shuō),我寫(xiě)的文件沒(méi)有問(wèn)題。然后我把客戶(hù)所有文件,都列出來(lái),按修改時(shí)間排序,并詢(xún)問(wèn)了客戶(hù)最后可以正 常使用這個(gè)功能的時(shí)間,發(fā)現了一堆在此時(shí)間之后修改的php文件,除去我修改的那些文件,就剩下兩個(gè)文件了,其中一個(gè)是 include/extend.func.php文件,我很清楚這個(gè)文件是一個(gè)dede提供給客戶(hù)做函數擴展的文件,它被 common.func.php所引用,而common.func.php又是被全站所有文件所引用的文件! 于是我打開(kāi)這個(gè)文件,赫然在最 后?>之后,有兩個(gè)空格一個(gè)空行?。。。。?!
把這些空格空行刪除,至此功能就全部正常了(包括我在模塊表里自定義了一個(gè)模塊鏈接,它在這個(gè)錯誤的情況下,不能顯示在模塊列表里,現在也正常了)!
以上文字,對于初級PHPer,可以學(xué)習領(lǐng)會(huì )一點(diǎn)點(diǎn)PHP調試技術(shù);對于PHP已經(jīng)比較熟的,而對DEDE還有有點(diǎn)陌生的,這里提供的一條經(jīng)驗就是:修改DEDE的所有PHP文件,千萬(wàn)不要在頭尾兩行的 <? ?>之外,寫(xiě)入任何字符,包括空格和空行??!
西安劍鋒網(wǎng)絡(luò )-西北地區的網(wǎng)站建站專(zhuān)家!
相關(guān)文章:
-
★★★☆☆☆███劍鋒所指_所向披靡███☆☆☆★★★西安劍鋒網(wǎng)絡(luò )隸屬于西安蟠龍網(wǎng)絡(luò )科技有限公司,主要提供網(wǎng)站建設、競價(jià)托管、新聞稿發(fā)布、新聞稿代寫(xiě)等網(wǎng)絡(luò )營(yíng)銷(xiāo)服務(wù)!【劍鋒...
-
無(wú)論是企業(yè)網(wǎng)站還是個(gè)人網(wǎng)站或者行業(yè)網(wǎng)站在運營(yíng)一段時(shí)間以后,在使用過(guò)程中就會(huì )有一些新的想法或者發(fā)現一些問(wèn)題,這個(gè)時(shí)候我們就會(huì )想到要把網(wǎng)站進(jìn)度調整,所以建設了網(wǎng)站都有改版的...
-
企業(yè)的目的就是營(yíng)銷(xiāo),縱觀(guān)現在的網(wǎng)站市場(chǎng),營(yíng)銷(xiāo)型網(wǎng)站已經(jīng)占據了多數地盤(pán)。那么,對于營(yíng)銷(xiāo)型網(wǎng)站來(lái)說(shuō),怎么設計才能夠給企業(yè)帶來(lái)更大的效益呢? 第一、營(yíng)銷(xiāo)型網(wǎng)站要注意頁(yè)面的美觀(guān)性...
-
企業(yè)從傳統實(shí)體店到網(wǎng)站的轉化,從建站到優(yōu)化,無(wú)論是哪一方面,最終都是想通過(guò)網(wǎng)站來(lái)樹(shù)立企業(yè)形象,提升品牌價(jià)值。而想要達到這個(gè)目的,究其根本可就是要抓推廣。 第一、選擇平臺很...
-
百度競價(jià)推廣關(guān)鍵詞分組是競價(jià)單元的知識點(diǎn),但是西安劍鋒網(wǎng)絡(luò )認為是什么知識點(diǎn)并不重要,重要的是我們是否將這些關(guān)鍵詞展示到想要的排名,并且減少點(diǎn)擊費用。 對于競價(jià)推廣關(guān)鍵詞從...
-
百度競價(jià)推廣不分析數據那就是在玩鬧!一個(gè)有效的SEMer必須要懂得去分析數據,這樣你才能了解你所投資的每一分錢(qián)花哪里去了,怎樣才能帶來(lái)有效咨詢(xún),用更少的成本賺回更多的錢(qián)。 目前,...
-
國內虛擬主機商一般一個(gè)主機只提供1個(gè)域名綁定,而不支持多個(gè)子域名。這時(shí)候我們可以自己通過(guò).htaccess文件設置重定向,把二級域名綁定到指定的子目錄。 先把要綁定的域名A記錄或CNAME也指...
-
百度競價(jià)推廣的轉化不好,花了高消費卻帶來(lái)無(wú)效點(diǎn)擊是很多競價(jià)企業(yè)的痛點(diǎn),付出了卻沒(méi)有回報,不是平臺不好,而行執行力度不夠。下面,西安劍鋒網(wǎng)絡(luò )分析競價(jià)推廣轉化少效果差的原因...
-
競價(jià)推廣關(guān)鍵詞的選取和投放于競價(jià)費用、效果息息相關(guān)。在搜索引擎競價(jià)推廣的過(guò)程中,關(guān)鍵詞的選取與投放是基礎,也是關(guān)鍵,只有這層基礎有了,才能有展示廣告、引進(jìn)流量、咨詢(xún)等后...
-
將代碼放到模板中。 {php print_r(get_defined_vars());} 要查看這個(gè)地址的模版。http://www.wuzhicms.com/item-34-2-1.html 首先,我們的這個(gè)地址需要是動(dòng)態(tài)的。而不是生成的靜態(tài)地址。 打開(kāi)文件: /www/configs...
- 上一篇:沒(méi)有了
- 下一篇:怎樣修補XSS跨站腳本攻擊