0

現在、大きなフォームを検証するために PHP でフォーム マネージャーを構築しています。

フィールドの数は毎回異なるため、そのための最良の構造は何だろうと思っています。

プレフィックスを使用して検証するフィールドを既にフィルタリングしています(例:「user_name」は検証されますが、「name」は検証されません)。

私の本当の問題は検証です。フィールドのタイプ(メール、郵便番号、電話など)を確認し、このタイプのフィールドの値が有効であることを確認する必要があります。

HTML5 Custom data" (例: data-fieldtype="zipcode") を使用できると思っていましたが、サーバーがこの属性を取得できないことを知りませんでした...

行き方は?

フィールドごとに 2 つの入力 (1 つは値用、もう 1 つはタイプ用) を使用できますが、それは本当にばかげているように見えます。

あなたが助けることができればありがとう。

編集 :

あなたの答えはすべて興味深いものです。どれが最適かわかりません。フォームの種類に応じて、おそらくソリューションをミックスします。

どうもありがとう。

4

3 に答える 3

1

フレームワークを使用しない場合は、フィールド => オプションの配列を使用できます。

$rules = [
            'user_name' => 'required',
            'user_email' => 'email required',
           // ...
         ];

そして、ルールがメソッドであり、検証メソッド内で動的に呼び出されるバリデータクラスにそれらをフィードします。

class Validator {

   public function __construct($data) { $this->data = $data; }
   private function required($field) {}
   private function email($email) {}
   // etc
   /** @method bool validate(array $rules) */
   public function validate($rules) {}

}
于 2013-06-12T09:57:04.443 に答える
1

これは、さらに考えずにブラウザ経由で再生するべきではありません。悪意のあるユーザーが「INT ONLY」フィールドを操作してフリーテキストにすることができ、アプリケーションがフィールド内のフリーテキストを突然処理しなければならなくなると考えられます。整数として検証されます (したがって、たとえば SQL に対して安全です)。

次の 2 つの方法があります。

  • フォーム検証構造を DB に保存し、検証構造の ID を持つ単一の非表示フィールドを送信します。リクエストを受け取ると、スクリプトは DB から構造をリクエストし、シリアル化を解除して処理します。
  • 本当にブラウザーを経由する必要がある場合は、検証構造をシリアル化し、それを base64 エンコードして、単一の非表示フィールドとして使用します。上記の理由により、この値をハッシュ (サーバーだけが知っている別の文字列と連結し、ハッシュし、ハッシュを 2 番目の隠しフィールドとして送信し、次の要求でハッシュが正しいことを確認する) またはいずれかによって認証することが必須です。暗号化 (ブラウザ ラウンドトリップの前にシリアル化されたデータを暗号化し、後で復号化します。キーはサーバーだけが知っています)

どちらもプレフィックストリックを不要にし、可読性と保守性を向上させます。

于 2013-06-12T09:57:18.083 に答える
1

クライアント側のみで検証しないでください。常にサーバー側を検証します。

通常、コントローラーの基本クラスがあり、他のすべてのコントローラーはそれを拡張します。

すべてのView Controller(またはbootrtap)にcheck_params()メソッドを設定するのが良い方法です。1) コピーまたは $_REQUEST を取得し、必要なすべてのパラメーターをチェックし、2) $_REQUEST を削除し、3) チェックおよび検証されたパラメーターを書き戻す必要があります。

abstract class controller_base {

    public function __construct() { ...; $this->check_param();...}

    protected final function check_param() {
        foreach ($this->param_list() AS $name => $type) {...}
    }

    abstract public function param_list();

}

class controller_login extends controller_base {

    public function param_list() {
        return array('name' => 'string', 'password' => 'string');
    }
}

アイデアは、このようにあなたが

  • サニタイズされたパラメーターのみを使用する
  • 不要なすべてのパラメータを自動的に削除します
  • すべてのコントローラーに、使用されているパラメーターを示すリストがあります。
于 2013-06-12T09:57:44.200 に答える