今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。
原本我的想法是這樣:
刪除資料庫的文件-->刪除資料庫中此文件的圖片和檔案-->刪除實體的圖片和檔案
這個流程很簡單,我一開始是這麼認為的,沒有好好的思考,於是我這樣子寫:
1. 刪除資料庫的文件
2. 刪除資料庫中此文件的圖片和檔案
3. 刪除實體的圖片和檔案
當我執行下去的時候,發現整個上傳的資料匣全部被清空,咦?難道是我的遞迴函式寫錯?我抽程式碼出來模擬測試,並沒有錯誤,但是真正實機執行時,竟然會把我整個上傳的資料匣全部被清空。
我費了很多時間在研究我程式的錯誤點,足足多花了快二個小時。
最後我發現原來是我自己白痴的邏輯問題所產生,
好吧,以前當我是嫩b時,我有時會信誓旦旦的說一定是電腦的問題,發現bug...
後來幾次的結果都是我自己本身是bug。
那不是重點,回到主題,上面看起來很正常,事實上卻是白痴到不行:
1. 刪除資料庫的文件--很ok
2. 刪除資料庫中此文件的圖片和檔案--很ok
3. 刪除實體的圖片和檔案--這裡出錯,因為我的方法是去資料庫把檔案的路徑讀出來,再送到我的遞迴函式去刪掉。沒錯,我竟然沒想到我第2步就把所有檔案的資料庫內容刪掉了,當然讀不出資料。結果傳到我的遞迴函式中的目錄原本應該是:
/path/to/uploads/class/dir/
結果變成
/path/to/uploads/
然後我的遞迴函式就把整個 uploads/的目錄匣裡的檔案全部清空了....
delTree( "/path/to/uploads/");
修正方法很簡單,就是把2和3互調就好了,但我也是搞得焦頭爛額才發現。
--
今天要說白痴的事,還有第2件,下面是我的php程式碼:
$op= "rename"; if($op==="del") if (is_dir($full_dir)) do_something(); elseif($op==="rename"){ do_rename(); }
踏馬的電腦是不是又透斗了?為什麼一直不給我執行do_rename()?
我在想,是不是因為我的php是5.6版,他對於運算子"==="的定義有修改?
然後我又多花了幾十分鐘,又測試研究為什麼,然後把程式改得不像樣後終於正常了:
$op= "rename"; if($op=="del"){ if (is_dir($full_dir)) do_something(); } if($op=="rename"){ do_rename(); }
我神…機…病…啊,這種爛code怎麼可以接受,我又再努力思考原來的code到底哪裡出問題。
原來我犯了一個初學者會犯的錯誤
if($op==="del") if (is_dir($full_dir)) do_something(); elseif($op==="rename"){ do_rename(); }
因為少了大刮號,所以if 後面的 if...elseif是同一組,要修改成這樣才行:
if($op==="del"){
if (is_dir($full_dir)) do_something();
}elseif($op==="rename"){
do_rename();
}
我只能說我自己太不小心,浪費很多不必要的時間。
下面結論一下寫程式的幾個原則,這些原則是經驗累積,非常重要:
1. 千萬不要在快下班的時候改程式,改壞的機率是87%。你有可能被call回來加班。
2.千萬不要在神智不清的時候改程式,改壞的機率是78%。你有可能會產生非常嚴重的災難,例如這個。
3. 千萬不要在運作中的伺服器中改程式,改壞的機率是38%,請你先建立副本再改,包括資料庫,必要時先備份。
4. 在實機中下資料庫的update/delete時,請先用 select確認你設的條件是對的。不然你有可能會.被..火..了,例如這個。
5. 請隨時存檔和備份,災難永遠都會出現,只有備份能救你,真的...不騙你。
6. 不要覺得會寫程式,會用艱澀的語言很了不起,寫出能商業化能賣錢有人要用的程式才有用
7. 不要覺得只有什麼語言什麼框架才是王道,別人都落伍,真正的高手連小畫家都能畫出傑作,那些都只是工具!就算給你萬能的工具,連個輪子都不會造一點用也沒有。
8. 電腦不會錯,錯的都是人腦,好吧,電腦錯的機率比麻雀摔死的機率還低。
9. 請不要在家目錄建立以 etc, home 為名稱的目錄,因為你有很高的機率會把自己的系統刪掉,只因為多加了一個"/"或是少加一個"."。
10. 每個程式都一定有bug,使用越久的程式雖然改得亂七八糟,但相信我,他的bug可能是最少的。
來貝比~多吃點才會長大!