0

HTML フォームからのユーザー入力を検証するために、PHP で一連のネストされた if / else ステートメントを単純に使用するのは効率的ですか?

2 つのフィールドがあるとします。私は次のようにアプローチしています。

if ( field one is formatted right ) {
   if ( field one is long enough ) {
           if ( field two is ok ) {
               do stuff;
           }
           else {
               echo "field two is not ok!";
           }
   }
    else {
        echo "field one is not long enough!";
    }
}
else {
 echo "field one is not formatted right!";
}

理解していただければ幸いです。

そのため、複数のフィールドがあり、多くの検証を行う必要があり、フィールドごとに異なる種類の検証を行うと、非常に長くなります。

これはこれに対処する悪い方法ですか?

4

5 に答える 5

3

私が通常行うことは次のようなものです:

$error_msg = '';
if (field1 not valid)
    $error_msg .= 'Field One is not valid.<br>';

if (field2 not valid)
    $error_msg .= 'Field two is not valid.<br>';

if ($error_msg == '')
{
    // DO ALL YOUR VALID SUBMISSION STUFF HERE
}

私は通常、一度に 1 つずつエラーをユーザーに通知するのではなく、一度にすべてのエラーをユーザーに通知する方がよいと考えています。

于 2013-02-28T15:36:35.930 に答える
1

前向きに考えると、これにアプローチできるより良い方法が間違いなくあります。まず、事前定義された検証メソッドを使用して検証クラスのようなものを作成してみてください。

(非常に大まかな)例を見てみましょう:

class Validator {

    public function validate($args) {
        $errors = array();
        //Make sure to do any santising you need too
        foreach($args as $field=>$data) {
            if ($response = $field($data))
                $errors[$field] = $response; 

            //You could create break code here if you wanted 
            //to check if the form was invalid without detailed feedback
        }
        if (empty($errors)) {
            return false;
        }
        return $errors;
    }

    private function email_field($data) {
        $valid = true;

        //perform a validation on email here, generate an $err_msg if it's not valid

        if ($valid) 
            return false;

        return $err_msg
    }
}

$validator = new Validator();

//You probably want to explode or loop through the error messages
//Or for extra brownie points, use the key of each element in the array to place
//the error message intelligently within your HTML!
$validation_errs = $validator->validate($_POST);
if ($validation_errs) 
    print_r($validation_errs);

フォームと組み合わせて...

<form method="post" action="">
    <input type="text" name="email_field" />
</form>

これを組み合わせて、検証を提供できます。これがより良い理由は、サイト全体でこのクラスを使用できるためです。つまり、検証ロジックを複製する必要がなく、さらに重要なことに、フォームごとにネストされたロジックのトレイルを持つ必要がないということです。post 変数を渡すだけで、クラスは必要な検証を自動的に実行し、すべてクリア (直感的には "false" です、申し訳ありません) を返すか、フィールド名とペアになった検証エラー メッセージの配列を返します。から。

さらに、これはサーバー側とクライアント側の検証を組み合わせて処理する場合に役立ちます。AJAX を使用して、非常に具体的な単一フィールドの検証クエリを AJAX 経由で PHP に呼び出し、使用可能な応答を返すことができます (実行している限り)。出力が AJAX 通信に有効であることを確認するのに十分です)。

したがって、効率性に関しては、現在何が重要であるか、またはパフォーマンスの違いがどれほど無視できるかということだけではありません...後で、フォームが変更されたとき、検証ロジックが必要なときにどれだけの時間を節約できるかについてです。また、同じ検証ロジックを何度も再利用する必要がある場合。

于 2013-02-28T15:54:14.710 に答える
1

そのコードは機能するはずであり、その効率を判断する 1 つの方法は、プロファイリングを使用して実際にかかる時間を測定することです。

検証する別の方法は、次のようなものです。

function handle_submission(){
   $field_1_validation_result=validate_field_1_value($field_1_value);
   if($field_1_validation_result!==true)exit($field_1_validation_result);

   $field_2_validation_result=field_2_validation_result($field_2_value);
   if($field_2_validation_result!==true)exit($field_2_validation_result);

   //Everything is right
   do stuff
}

function validate_field_1_value($value){
   if ( !field one is formatted right )return "field one is not formatted right";
   if ( !field one is long enough )return "field one is not long enough";
   return true;
}



function validate_field_2_value($value){
   if( !field two is ok)return "field two is not ok"
   return true;
}
于 2013-02-28T15:40:17.827 に答える
0

これは私がほとんどの場合行うことです:

$Errors = array();

if (field one is not formatted right)
    $Errors[] = "Field one is not formatted right.";

if (field one is not long enough)
    $Errors[] = "Field one is not long enough.";

if (field two is not ok)
    $Errors[] = "Field two is not ok.";

if (empty($Errors)) {
    do stuff;
} else {
    foreach ($Errors as $Error) {
        echo '<div class="error">' . $Error . '</div>';
    }
}

これは他の回答と似ていますが、配列を使用してエラーメッセージを保存し、簡単にフォーマットできるようにしています。

于 2013-02-28T15:47:43.470 に答える
0

このようなフォーマットの方が読みやすく、従うのも簡単だと思います。

if ( field one is not formatted right ) {
    echo "field one is not formatted right!"

} else if ( field one is no long enough ) {
    echo "field one is not long enough!";

} else if ( field two is not ok) {
    echo "field two is not ok!";

} else  {
    do stuff;
}
于 2013-02-28T15:40:57.070 に答える