• ZenTaoPHP框架中的數據驗證機制

    0
    PHP HTML 數據庫 MVC C/C++ 7928 次瀏覽



    數據驗證在web應用中尤其顯得重要。下面來給大家介紹下禪道www.zentao.net/)框架的數據驗證機制。

    一、首先來確定一個問題,即驗證的規則放在什么地方?

    mvc程序中,每一層都可以放驗證規則。比如很多的表單驗證,會自動根據用戶的輸入進行驗證,然后給予提示。那么數據驗證放在哪一層呢?這個問題網絡上大家有很多的爭議。有的人主要放在view這一層,有的則主張放在control層。禪道框架選擇了model層。

    為什么這樣做呢?因為model層是最低的一層,所有的數據操作,都要經過model來進行處理。那么只要在這一關把數據驗證做好,就可以保證數據的準確和安全。當然,框架的用戶,可以同時在前端加上js的驗證,和model層的驗證不會沖突的。下面來看下如何使用禪道的數據過濾機制。

    禪道的數據過濾分為兩個部分,一個是數據修正,一個是數據驗證。這個是受php的filter擴展啟發,它里面就是分為了這兩個部分。先來看數據修正的例子:

    二、數據修正:

    $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();

    首先,是調用fixer這個類的input方法,它的參數post表示是從$_POST這個變量中獲取數據。
    緊接著的兩行add(),是向數據中增加兩個變量。然后后面的兩行setDefault則是表示,當這個變量沒有傳值的時候,設成默認的值。
    接下來是兩行setIF。setIF共有三個參數,第一個是判斷條件,后面兩個分別是key和value。也就是當條件為true的時候,設置$key = $value。
    下面的spechialchars則表示對這三個字段進行htmlspecialchars處理;cleanInt則將變量處理成int類型,join,則將openedBuild使用,連接起來。
    最后,還需要把兩個不需要的變量去掉,使用remove
    通過get方法就可以得到一個已經經過修改的完整的數據集合。這個集合已經可以準備入庫了。讓我們來看下數據是如何驗證的。

    三、數據檢查

    $this->dao->insert(TABLE_BUG)->data($bug)->autoCheck()->batchCheck($this->config->bug->create->requiredFields, 'notempty')->exec();

    這句sql插入語句通過data方法,將修正過的數據傳遞給dao對象,然后通過autoCheck()對其進行自動檢查。autoCheck會根據數據庫里面字段的類型,長度進行判斷。如果類型不對,或者長度不對,會自動記錄錯誤。然后后面調用了batchCheck()方法,對一批字段進行非空的驗證。當然也可以通過check()方法對單個字段進行驗證。驗證的規則有很多,比如notempty, unique, email, account等等。

    如果數據驗證過程中沒有錯誤,則執行了exec()方法,將數據插入數據庫。如果有錯呢?exec()方法則什么都只有執行。這個時候,就需要有control來進行判斷了。

    if(dao::isError()) die(js::error(dao::getError())); 對,就是這樣一句話,如果dao::isError(),則執行getError()方法,然后將其合并成js的字符串,以警告框的形式彈出。執行了getError()之后,所有的錯誤被清空,這樣不會影響下次的執行。
    更多開源詳情: http://www.zentao.net

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色