4

私はPHPアプリケーションに取り組んでいます。これは、とりわけ html 形式で構成されています。
私の質問は、サーバー (PHP を使用) とブラウザー (Javascript を使用) の両方で検証コードを複製する必要なく、簡単な方法でフォーム検証を実装する方法です。
ajaxを使った方法を考案しました。入力がフォーカスを失うと (onblur イベント)、含まれるデータを使用してサーバーへの ajax 呼び出しが行われます。値が有効でない場合、または空の文字列の場合、応答はエラー メッセージになります。しかし、コードはサーバーとブラウザーの両方で非常に肥大化しており、おそらく非常にバグがあります。正しい方向に私を向けることができますか?入力検証は常に複雑ですか、それとも別のアプローチを使用する必要がありますか? 時間を割いて私の投稿を読んでくれた人たちに感謝します。

4

6 に答える 6

1

優れたJavaScript検証プラグインを使用すると、サーバー側の検証と非常に移植性が高いことがわかります。私はおそらくこれをさらに説明する必要があるので、少し我慢してください。ここで私を助けるためにhttp://rickharrison.github.com/validate.js/を参照しますが、他にもかなりの数があります。

個人的には、検証にSymfonyフォームフレームワークを使用していますが、他のフレームワークを使用することも、自分で試してみることができます。重要なことは、クライアント側の検証を推進するために使用できる検証ルールのセットを1回だけ定義することです。

このようにして、2つの別々の検証プロセスの間に矛盾がなく、アプリケーションがDRYであることを確認できます。また、これらのルールはサーバー側のコードで事前定義されており、これらすべてのajaxリクエストは必要ないため、クライアント側の検証をページに読み込むことができます。

PHPフォームフレームワークや、検証ルールを定義することの意味に慣れていない場合は、少し明確にすることができます。

以下の配列を使用して、サーバー側の2つの$ _POSTフィールド(emailとnumber)をループできます。この情報は、クライアント側のバリデーター(json_encode($ validators)など)に簡単に渡すこともできます。クライアント側がルールを期待する形式によっては、少しやり直す必要があるかもしれません。ただし、さらに重要なのは、検証ロジックが1か所に保存されていることです。

$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'
       ),
     ......
于 2012-06-04T23:34:01.853 に答える
1

入力の検証は非常に複雑です。入力がデータ型に対して正確に有効であることを確認する必要があります。これには通常、すべてのプロジェクトのカスタム検証が含まれます。クライアント側とサーバー側の両方の検証に代わるものはありません。

クライアント側の検証は、きびきびした UI を提供します。ユーザーが入力するすべてのことは、クライアント側で検証することができ、検証する必要があるため、サーバーに対して要求を行う必要はありません (待ち時間を短縮します)。これは、サーバー側の検証の代わりになるという意味ではありません。なぜなら、誰でも firebug などのツールを介して行われたリクエストを確認し、必要なデータをサーバーに送信できるからです。

サーバー側では、データが期待されるタイプであることを確認する必要があります。そうしないと、SQL インジェクションやその他の多くの悪意のある攻撃にさらされる可能性があります。

これは、多くの php mvc フレームワークのいずれかを検討する非常に良い理由です。ほとんどの場合、検証用に記述しなければならないコードを大幅に削減するフォーム ヘルパーが含まれています。

于 2012-06-04T12:39:34.040 に答える
1

Bassistance jQuery Validation pluginを強くお勧めします。

これに加えて、常に強力なサーバー側の検証を実装してください。

于 2012-06-04T16:26:27.400 に答える
1

ajax経由ですべてを検証するphpにデータを投稿するだけです。次に、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); 
  }
});

}

于 2012-06-04T16:29:23.990 に答える
1

サーバー側の検証は常に必要です。ただし、サードパーティのライブラリに依存することで、クライアント側の作業を楽にすることができます。

基本的な検証を行う最も簡単な方法は、HTML5 を使用することです。これには、必須フィールド、数値範囲、正規表現チェックなどが含まれます。サードパーティのライブラリは不要で、HTML5 に対応していないブラウザは検証を無視します。入力はサーバー上で検証されるため、これは問題ありません。

もう 1 つの方法は、jQuery 検証拡張機能を使用することです。このライブラリを使用すると、フォーム フィールドにいくつかのクラスを出力するだけで済みます。

Zend_Formライブラリを使用してフォームを生成し、検証を行っている場合は、次の記事を参照してください: http://codeutopia.net/blog/2008/04/04/client-side-validation-with-zend_form/

于 2012-06-04T12:46:02.763 に答える
0

Always use server-side script to check inputs because if you use client-side (javascript) for that then anybody can make you fool by using various technique like disabling javascript etc.

于 2012-06-04T12:42:23.313 に答える