簡體   English   中英

如何在最小化重復的同時使用客戶端和服務器端驗證?

[英]How can I use client and server-side validation while minimizing duplication?

我目前正在驗證服務器端的用戶輸入(PHP)。 客戶端發送XMLHttpRequest調用並標記帶有紅色邊框的無效字段。 其他一切都很棒,除了我認為客戶提出請求需要太長時間,然后注意到他填寫了錯誤的內容。 我想我也應該放置一些JavaScript驗證,以便客戶端不需要等待請求完成。

但是,我不想復制驗證規則和代碼。 有沒有人在雙方都實施驗證,這樣你至少不需要復制驗證規則?

如果重要的話,我正在使用Yii和帶有jQuery的普通舊JavaScript。

編輯:我也覺得客戶端可能在他的計算機上錯誤的時間使基於JavaScript的日期時間檢查變得很糟糕。 這意味着我需要首先從服務器向腳本提供正確的日期時間。

創建一個PHP函數,驗證字段並以通用方式設置它。 因此,您可以在服務器端和客戶端一起使用它。

對於客戶端使用jquery對PHP驗證函數進行一些AJAX調用。

我相信PEAR快速表單允許您同時為客戶端和服務器端添加驗證。

既然你正在使用Yii框架而且Yii提供了一個相當強大的驗證方案,我會看一下擴展表單生成框架以檢查驗證器字段的一些方法,然后將每個驗證類映射到你應該的js函數能寫得很快。

似乎還有一個擴展程序可以為您執行此操作: http//www.yiiframework.com/extension/jformvalidate/

絕對不要將客戶端日期時間檢查用於任何目的。 你是對的。

所以你想為每個驗證編寫一個代碼。

所以繼續在php中編寫一個函數來進行電子郵件驗證,比方說: validate_email()

一旦用戶按下提交,您可以使用ajax將所有數據發送到php代碼並進行驗證。

一旦用戶通過提交階段,您現在可以使用相同的函數validate_email()來驗證$ _POST。

這樣您就編寫了一個代碼,並且更容易維護。

這比javascript慢嗎? 很難說。 請記住,添加額外的jquery驗證插件也會在頁面上加載。 這是一個流行的jquery 驗證插件 ,它的縮小版本為25KB。 現在您的代碼整潔且易於維護。 如果這是一個主頁,並假設您選擇使用插件,那么您剛剛在可能最有價值的目標網頁上節省了25KB的負擔。

如果你的驗證規則可以用正則表達式來描述,你可以在一個地方定義它們,並在你生成的javascript中使用的php代碼中使用相同的正則表達式。

一些偽代碼作為一種可能的方法:

在PHP中:

function validate() {
    // Use $_POST to validate whatever items in whatever fashion you want
    // and echo a message or some JSON array etc...
}

在javascript(假設jQuery):

$('#formButton').click(function(event){
    event.preventDefault();
    $.post('/url/of/page', $(this).serializeArray(), function(response){
        // Assuming JSON data, but could just be a string or message,
        // check for response.success or whatever from validation
        if(response.success) $('#form').submit();
        else // Some error message or action
    });
});

這雖然可能是AJAX調用中的一些開銷,但允許您使用任何您想要的驗證方法,並且無論是從實際的POST還是通過AJAX,都要保持代碼完全相同。 但是,來自PHP的$ _POST迭代的簡單響應並沒有那么多開銷。 這也允許您在需要時運行查詢 - 當然,您希望保持簡單,因為一切都會運行兩次。

起初我可以說從不信任用戶...用戶可以更改java腳本...因此需要服務器端驗證

第二:為什么我們使用客戶端驗證? 速度。

我認為你應該兩種方式使用。 假設你不想浪費用戶的時間

用js驗證並發送數據。 在admin中如果有錯誤的數據退出用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM