數(shù)據(jù)驗證在web應(yīng)用中尤其顯得重要。下面來給大家介紹下禪道框架的數(shù)據(jù)驗證機制。
mvc程序中,每一層都可以放驗證規(guī)則。比如很多的表單驗證,會自動根據(jù)用戶的輸入進行驗證,然后給予提示。那么數(shù)據(jù)驗證放在哪一層呢?這個問題網(wǎng)絡(luò)上大家有很多的爭議。有的人主要放在view這一層,有的則主張放在control層。zentaoPHP選擇了model層。
為什么這樣做呢?因為model層是底層,所有的數(shù)據(jù)操作,都要經(jīng)過model來進行處理。那么只要在這一關(guān)把數(shù)據(jù)驗證做好,就可以保證數(shù)據(jù)的準確和安全。當然,框架的用戶,可以同時在前端加上js的驗證,和model層的驗證不會沖突的。下面來看下如何使用禪道的數(shù)據(jù)過濾機制。
受php的filter機制啟發(fā),禪道的數(shù)據(jù)過濾分為兩個部分,一個是數(shù)據(jù)修正,一個是數(shù)據(jù)驗證。首先是要對從客戶端傳遞過來的數(shù)據(jù)進行修正,然后再對數(shù)據(jù)進行校驗。
驗證類是在lib/filter/filter.class.php里面定義的。
首先來看代碼:
$bug = fixer::input('post') ->add('openedBy', $this->app->user->account) ->add('openedDate', $now) ->setDefault('project,story,task', 0) ->setDefault('openedBuild', '') ->setIF($this->post->assignedTo != '', 'assignedDate', $now) ->setIF($this->post->story != false, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story)) ->specialChars('title,steps,keyword') ->cleanInt('product, module, severity') ->join('openedBuild', ',') ->remove('files, labels') ->get();
首先,是調(diào)用fixer這個類的input方法,它的參數(shù)post表示是從$_POST這個變量中獲取數(shù)據(jù)。
緊接著的兩行add(),是向數(shù)據(jù)中增加兩個變量。
然后后面的兩行setDefault則是表示,當這個變量沒有傳值的時候,設(shè)成默認的值。
接下來是兩行setIF。setIF共有三個參數(shù),第一個是判斷條件,后面兩個分別是key和value。也就是當條件為true的時候,設(shè)置$key = $value。
下面的spechialchars則表示對這三個字段進行htmlspecialchars處理;cleanInt則將變量處理成int類型,join,則將openedBuild使用,連接起來。
后,還需要把兩個不需要的變量去掉,使用remove。
通過get方法就可以得到一個已經(jīng)經(jīng)過修改的完整的數(shù)據(jù)集合。這個集合已經(jīng)可以準備入庫了。讓我們來看下數(shù)據(jù)是如何驗證的。
$this->dao->insert(TABLE_BUG)->data($bug) ->autoCheck() ->batchCheck('id, name', 'notempty') ->exec();這句sql插入語句通過data方法,將修正過的數(shù)據(jù)傳遞給dao對象,然后通過autoCheck()對其進行自動檢查。autoCheck會根據(jù)數(shù)據(jù)庫里面字段的類型,長度進行判斷。如果類型不對,或者長度不對,會自動記錄錯誤。然后后面調(diào)用了batchCheck()方法,對一批字段進行非空的驗證。
當然也可以通過check()方法對單個字段進行驗證。驗證的規(guī)則有很多,比如notempty, unique, email, account等等。
如果數(shù)據(jù)驗證過程中沒有錯誤,則執(zhí)行了exec()方法,將數(shù)據(jù)插入數(shù)據(jù)庫。
如果有錯呢?exec()方法什么都不會執(zhí)行,但會記錄到錯誤日志中??梢栽赾ontrol中里面判斷是否有錯誤。
if(dao::isError()) die(js::error(dao::getError()));
如果有錯誤,用js警告框的方式彈出,然后重置錯誤日志。
數(shù)據(jù)修正方法:
cleanEmail: 將目標字段處理為email encodeURL: 將目標字段進行urlencode cleanURL: 將目標字段中不符合url標準的字符去掉。 cleanFloat: 將目標字段處理為float類型。 cleanINT 將目標字段處理為int類型。 specialChars: 對目標字段使用htmlspecialchars處理。 stripTags: 去除目標字段中的標簽。 quote: 對目標字段做quote處理。 setDefault: 對目標字段設(shè)置默認值。如果用戶有傳值,使用用戶傳的值。 setIF: 當滿足某個條件的時候,對每個字段進行設(shè)置。 setForce: 強制覆蓋某個字段的值。 remove: 刪掉某一個字段。 removeIF: 滿足某個條件的時候刪除某一個字段。 add: 添加某一個字段。 addIF: 當滿足某個條件的時候,添加某一個字段。 join: 對目標字段使用逗號連接起來。 callFunc: 使用自定義函數(shù)對數(shù)據(jù)進行修正。
數(shù)據(jù)檢查方法:
bool: 目標字段必須是布爾型。 int: 目標字段必須是int類型。 float: 目標字段必須是float類型。 email: 目標字段必須是email類型。 url: 目標字段必須是url 類型。 ip: 目標字段必須是ip地址。有一個可選參數(shù):$range all|public|static|private date: 目標字段必須是一個日期格式。 reg: 目標字段必須滿足正則表達式。 length: 長度要滿足指定的大小。 notEmpty: 目標字段不能為空。 empty: 目標字段必須為空。 account: 目標字段必須是一個合法的用戶名。 equal: 目標字段必須等于某一個值。 call: 調(diào)用用戶自己的檢查函數(shù)。
更多建議: