2011-12-13 69 views
2

如果您在數據庫(例如MySQL)中正確定義了檢查和斷言,那麼在更新或將記錄插入像MySQL這樣的數據庫之前,這是否是一種好的做法,甚至值得驗證數據?在插入/更新之前驗證數據還是不是?

從我所看到的情況來看,只要您必須執行的檢查並不複雜,並且可以由數據庫本身來完成,那麼驗證數據的方式看起來很浪費...... PHP首先,然後是MySQL。

我正確嗎?

回答

4

作爲一般規則,您應該儘快進行驗證。這意味着在這種情況下你的PHP代碼。爲什麼?

  1. 它更有效。爲什麼要將數據發送到數據庫(可能通過網絡,甚至是在不同的國家),如果它只會響應一個錯誤?最好先避免錯誤。

  2. 它使得向用戶報告有用/友好的錯誤消息變得更容易。有時可能有足夠的解析數據庫錯誤來產生有用的錯誤消息,但大多數數據庫錯誤對最終用戶來說看起來不是很友好。最好儘可能靠近用戶生成錯誤。

現在,即使有這樣的,它仍然是件好事,將檢查您的數據庫,但他們應該作爲最後度假,當你的DB拋出一個錯誤,它應該被視爲一個錯誤行動,而不是「數據驗證功能」。換句話說,如果您遇到數據庫異常,則表示您的PHP代碼爲損壞的

例外:最近有一次我選擇違反這個原則,因爲一些相當複雜的驗證是必要的。我選擇依靠數據庫進行「完整」驗證(但確保我的異常文本易於解析,因此仍然可以生成用戶友好的錯誤)。我仍然有我的客戶端代碼進行基本輸入驗證,但由於完整驗證涉及的複雜性,我不希望維護兩個功能相同的代碼位(一個在客戶端軟件中,一個在DB中)。我覺得在兩個地方擁有相同的功能更有可能導致未來的錯誤,以防一個更新,另一個不更新。在這種情況下,服務器端驗證代碼大約是一個4頁長的PL/Perl存儲過程,充當INPUT/UPDATE觸發器。

結論:幾乎從來不應該依賴數據庫來進行用戶驗證。我能想到的唯一例外情況與您所問的內容相反:真正複雜的檢查;不是非常簡單的。

+0

所以這聽起來像你應該只依靠數據庫來驗證數據作爲最後的手段,以防萬一通過你的代碼。 – Obto

+0

@Obto:是的,我認爲這是一個很好的總結。 – Flimzy

+0

你允許你的數據庫做什麼驗證?我想不出任何理由我會**讓我的數據庫'驗證'某件事或我將如何處理它。 – JM4

1

100%不正確。

在你更新之前,它是一個好的實踐,甚至值得驗證,或者 插入一條記錄到像MySQL這樣的數據庫?

它不僅是'好'的做法,它是基本邏輯。根本不使用MySQL進行檢查。 PHP會根據您設置的規則進行驗證。如果這些規則並不意味着某些標準,那就拋出一個錯誤。

+0

舉一個工作示例這一點,我有一個應用程序,其中的任何「公共」的項目必須有一個唯一的標識符,該項目可能會「編輯」,但完全相同的副本必須在數據庫中的意義被保留當「編輯」發生標識符被複制並且標誌被添加到舊項目。爲了確保數據的正確性,我需要使用PHP,就像我使用mySQL的獨特字段一樣,那麼不能發生更多複製功能的「編輯」功能。 PHP驗證還允許您提供友好且高度自定義的響應。希望這有助於上下文。 – Ryan

相關問題