[精讚] [會員登入]
1013

一個邏輯的錯誤刪了全部檔案的經驗

今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

分享此文連結 //n.sfs.tw/10100

分享連結 一個邏輯的錯誤刪了全部檔案的經驗@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2016-12-25 10:39:15 最後編修
2016-10-30 03:25:09 By 張○○
 

今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

原本我的想法是這樣:

刪除資料庫的文件-->刪除資料庫中此文件的圖片和檔案-->刪除實體的圖片和檔案

這個流程很簡單,我一開始是這麼認為的,沒有好好的思考,於是我這樣子寫:

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可能是最少的。


來貝比~多吃點才會長大!
 

 

END

你可能感興趣的文章

Git rebase 驚魂記 為了要刪除一些commit,我進行了rebase,結果嚇死人…

如果長生不老 有人竟然想到長生不老,難道他不知這是最糟糕的選項嗎?

豬肉入境罰責太低,防疫可能有漏洞 因為憂心農委會的疏漏,投書行政院長信箱

台灣的道路和停車問題 台灣的道路設計很寬,不論是多寬的路,兩邊一定停滿了車

越來越變態的密碼強度要求 為了安全,什麼都為了安全?是為了你覺得的安全吧?你懂不懂啊?煩死人…

令人傻眼的台中市立學校教育單位差勤系統 2021年還在用20年前的設計思維,什麼垃圾…

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

使用Google尋找你的手機 這近發現google竟然可以用來找android的手機,而且不需要經過什麼設定或安裝軟體。

HP SAS硬碟leds燈號說明 HP SAS硬碟leds燈號(hp g7/g6系統適用)說明

Linux shell 的date表示法 linux下SHELL中的date表示法

[札記] 2016.7~12月札記 札記,只是札記

UTF8中文字/全形一覽 快速查詢urf-8的中文字,共計13246中文字(5401常用字+7652罕用字+日文或編號),292全形符號,27半形符號。