加入vip [簽到送金幣]
注冊 登錄 QQ登錄
織夢無憂,用心做好源碼!7年品牌,值得信賴! 織夢無憂,個個精品,寧缺毋濫!每月購買不少于3000元精品源碼免費分享,早開通,早享受!終身會員臨時大促,只需要128元!新會員開通,直接進入會員中心--購買會員--直接開通即可。

織夢DEDECMS二次開發的一些經驗之談

摘要: 如果您想從此貼直接獲得一些有用的插件、模塊、或代碼,請繞道~~ 授人以魚還是授人以漁,此貼是后者,希望對你有所幫助 * 提示:如果你是PHP編程有比較深入經驗了,請只讀紅字內容即可,其它跳過。 如果你是PHP初學者,請仔細閱讀所有文字,別嫌繁瑣,對你提
如果您想從此貼直接獲得一些有用的插件、模塊、或代碼,請繞道~~ “授人以魚”還是“授人以漁”,此貼是后者,希望對你有所幫助…… * 提示:如果你是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文件,千萬不要在頭尾兩行的 <?  ?>之外,寫入任何字符,包括空格和空行!   

本文鏈接:http://www.usmartsupport.com//dedecmsjiaocheng/chengxukaifa/152557.html

版權聲明:本站資源均來自互聯網或會員發布,如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除!謝謝!

公眾號二維碼

微信公眾號

//自動推送 久久无码高潮喷水免费漫画,久久久久国产一区二区三区,久久综合亚洲春色,久久国产精品二区_免费