[精讚] [會員登入]
902

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

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

分享此文連結 //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

你可能感興趣的文章

別人憑什麼教你? 憑什麼別人要把成功的技巧教給你?

我當兵的點滴--我在預校的生活 每個人當兵都是一個故事,以下是我的故事,並不是拿來比較誰輕鬆誰好運,退伍十年多了再不記下來就會忘記。 前言 應該是大三的

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

當壞人被放縱,就等於是處罰好人 當壞人被放縱,就等於是處罰好人就是這個社會的現況

詭異的創業思維 創業的思維中,有多少銀彈,有多少技術,有多少人脈,有多少時間等等,每個都要考慮進去,以熱忱建立的關係脆弱的像蘇打餅乾一樣..

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

我有話要說

>>

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

訪客留言

[無留言]

隨機好文

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

如何在linux下執行java 原生的java應用程式可以使用簡單的方法在console下面寫出來,適合作簡單的應用

[PHP] 檢查IP是否在某個網段內 mtachcidr 要檢查IP是否在某個網段內,要寫幾行?10行?5行? 不用,只要2行。以下是我寫的 code /** * matchCI

問問題 問問題其實內涵很深,我悟了很久才懂。 有人問題的目的並不一定是想要得到答案,有時只是純粹想問問題..

[NetBeans] 使用git複製別人的專案 NetBeans使用git複製別人的專案及版本控制