2012-06-04 69 views
4

我正在開發一個PHP應用程序。它以html格式包含其他內容。
我的問題是如何以簡單的方式實現表單驗證,而無需在服務器(使用PHP)和瀏覽器(使用Javascript)上覆制驗證代碼。
我設計了一個使用ajax的方法。當一個輸入失去焦點(onblur事件)時,它會使用它包含的數據對服務器進行ajax調用。如果該值無效或者爲空字符串,則該響應將是錯誤消息。 但是,代碼在服務器和瀏覽器上都很臃腫,可能很有問題。 你能指點我正確的方向嗎?總是輸入驗證複雜或我應該使用不同的方法? 非常感謝那些花時間閱讀我的文章,併爲那些回答的人提供額外的坦克。使用PHP和javascript進行HTML表單驗證的簡單方法

+0

它總是好的,同時驗證瀏覽器和服務器上... – Drewdin

+0

客戶端是用戶的滿意度,並限制從輸入數據的脆弱性,同時服務器驗證是用於最小化與數據處理的安全隱患。 – swapnesh

回答

1

輸入驗證是非常複雜的。您需要確保輸入對您的數據類型完全有效。這通常包括每個項目的自定義驗證。對於客戶端和服務器端驗證都沒有substiute。

客戶端驗證提供了一個活潑的UI。用戶輸入的每件東西都可以並且應該在客戶端進行驗證,以便不必向服務器發出請求(減少延遲)。這並不意味着它是服務器端驗證的替代品,因爲任何人都可以通過像螢火蟲這樣的工具看到請求,並將他們想要的任何數據提交給服務器。你必須確保數據

服務器端是期望的類型或者你可以打開自己SQL注入或許多其他惡意攻擊。

這其實是一個很好的理由看任何的許多PHP MVC框架。大部分都包含表單助手,這將顯着減少您爲驗證而編寫的代碼。

0

總是使用服務器端腳本來檢查輸入,因爲如果你使用客戶端(JavaScript)針對任何人,然後可以讓你通過使用不同的技術,像禁止的JavaScript等

1

傻瓜你總是需要服務器端驗證。但是,您可以通過依賴第三方庫讓您的客戶端更輕鬆。

做基本驗證最簡單的方法是使用HTML5。這包括必填字段,數字範圍和正則表達式檢查等內容。沒有第三方庫需要和瀏覽器不能HTML5將只是忽略驗證。這是沒有問題的,因爲輸入將在服務器上進行驗證。

另一種方法是使用jQuery validation extension。有了這個庫,你只需要在你的表單域中輸出一些類。

如果您使用的是Zend_Form庫生成表單並做驗證,你可以在這篇文章已經看清楚:http://codeutopia.net/blog/2008/04/04/client-side-validation-with-zend_form/

1

我只是發佈數據到一個PHP驗證通過Ajax的一切。然後我在json字符串中返回錯誤,每個錯誤都有失敗輸入的名稱和一個錯誤字符串。使用jQuery我循環瀏覽json對象,並將輸入讀取並列出錯誤字符串。你可以將表單提交給這個腳本,這樣如果javascript被關閉,表單將被檢查到相同的php腳本。

function submitForm() { 
$.ajax({ 
    type: 'post', 
    url: 'cgi-bin/s_contact.php', 
    data: $("#contact").serialize(), 
    dataType: 'json', 
    success: function(data) { 
     if(data.answer == 'true') { 
     $("#showErrors").removeClass("progressbar"); 
     $("#showErrors").html('<h2>Message Has Been Sent!</h2>'); 
     setTimeout(function() { 
      window.location = $("#zsite").val(); 
     },2000); 
     } 
     else { 
      se = $("#showErrors"); 
      se.removeClass("progressbar"); 
      se.html(''); 
      se.append('<ul id="showeror"></ul>'); 
      $.each(data,function(index,val) { 
      $('input[name='+index+']').css('background-color','#ff9'); 
      $('#showeror').append('<li>'+val+'</li>'); 
      }); 
     } 
    }, 
    error: function(msg) { 
     alert('Error: '+msg.error); 
    } 
}); 

}

1

如果你使用一個很好的JavaScript驗證插件,你會發現它們與你的服務器端驗證攜帶十分方便。我可能需要進一步解釋這個,所以請忍受一點。我會參考http://rickharrison.github.com/validate.js/來幫助我,但還有其他一些。

就我個人而言,我使用Symfony表單框架進行驗證,但您可以使用其他框架或自己去做。重要的是,只有定義了一組驗證規則,一旦可以反過來用於驅動客戶端驗證。

這樣你就不會在兩個單獨的驗證過程之間有任何不一致,確保你的應用程序是乾的。此外,您的客戶端驗證可以加載頁面,因爲這些規則已經在您的服務器端代碼中預先定義,並且您不需要所有這些ajax請求。

如果您不熟悉任何PHP表單框架,或者我的意思是定義驗證規則,我可以使事情更清晰。

以下數組可用於在服務器端循環兩個$ _POST字段(電子郵件和數字)。這些信息也可以很容易地傳遞給客戶端驗證器(例如json_encode($ validators))。根據客戶端預期其規則的格式,您可能需要重新修改一些內容。但更重要的是,您的驗證邏輯存儲在一個地方。

$validators = array(
    'email' => array(
     'rules' => array(
      'blank' => false, 
      'invalid' => '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i', 
     ), 
     'messages' => array(
      'blank' => 'Missing email', 
      'invalid' => 'Invalid email', 
     ), 
    ), 
    'number' => array(
     'rules' => array(
      'blank' => false, 
      'invalid' => '/\d/', 
     ), 
     'messages' => array(
      'blank' => 'Missing number', 
      'invalid' => 'Not a number' 
     ), 
    ...... 
+0

好的,但是如果我必須驗證數據庫中的數據呢?客戶端驗證不能執行此操作。 –

+0

好的理念來定義數據結構中的驗證規則,並根據它生成javascript代碼和php代碼。 –

+0

我忙於那些學習Yii框架的日子 - 從未使用過框架,也沒有使用面向對象的方法。無論如何,這裏有一些驗證類,但我還沒有到達那些章節。 –