架構中如何禁止資料庫(MySQL)意外報錯?
比如說我這邊有兩個excel表格上傳功能,當然我兩個地方,寫的excel接收資料的處理方法不一樣,但是你知道,資料庫中有些欄位的名稱不可為空,如果兩個地方的excel檔案互相對調上傳,那麼這個時候就會出現sql報錯,就像這樣:
如果我每個接收欄位的資料,都要對應資料庫做不可為空判斷,豈不是太麻煩?
我一個excel表格上傳功能,只單單對應的一個方法,也就是一對一。因為我excel結構不一樣,所以一個方法對應一個類型的excel結構處理。
所以想求一個能屏蔽sql報錯出現在頁面上的解決辦法,請大神指教。
回複內容:
架構中如何禁止資料庫(MySQL)意外報錯?
比如說我這邊有兩個excel表格上傳功能,當然我兩個地方,寫的excel接收資料的處理方法不一樣,但是你知道,資料庫中有些欄位的名稱不可為空,如果兩個地方的excel檔案互相對調上傳,那麼這個時候就會出現sql報錯,就像這樣:
如果我每個接收欄位的資料,都要對應資料庫做不可為空判斷,豈不是太麻煩?
我一個excel表格上傳功能,只單單對應的一個方法,也就是一對一。因為我excel結構不一樣,所以一個方法對應一個類型的excel結構處理。
所以想求一個能屏蔽sql報錯出現在頁面上的解決辦法,請大神指教。
資料庫報錯不是不能屏蔽,但是沒必要,而且這會產生更多問題。既然某欄位不能為Null自然有其道理,你非要寫進去那後面處理的時候到了這個地方怎麼辦?由此也可以看出你沒有對資料在執行插入前進行有效性檢查,上傳資料等同於使用者錄入的資料,必須防止髒資料進入。
通常的處理邏輯為:
逐行讀取csv,使用驗證規則驗證資料,如果ok存入$success,否則存入$bad,根據商務邏輯不同,當$bad非空時可能先顯示清單要求使用者確認拋棄不合法的資料,也有的直接把$success中的資料遍曆插入,然後產生報告哪些已經插入,哪些未處理。
既然你有多種格式的csv,自然應該檢查一下當前上傳的csv是否與處理方法一致,否則萬一真存進去了怎麼辦?真心不建議偷懶。
用 try {}catch (Exception $e){}捕捉異常就可以了
架構的話應該可以關閉debug模式,按理說都可以自動屏蔽掉的。
如果是想要在代碼中手動把空欄位設定為預設值,可以自己寫一個過濾器,過濾器裡面判斷是否為空白,是的話給一個預設值。
1、你可以在資料庫設計的時候定義一個預設值比如0
2、在程式上在插入這條資料時,user_id欄位你保證它有值。
如果生產中該欄位允許為 null ,那就改表
如果不允許,那報錯就說明資料有問題,ignore 是有危險的。你應該保證來源資料不為 null,而不是粗暴地 ignore