0

この質問は以前に尋ねられた可能性があることは知っていますが、コードを表示したいのですが、単純なことをしているのか、コードを複雑にしているのかを知りたいのですが。さらに、答えは使用tryと言ってcatchいますが、手続き型の方法で進んでいるので、私は正しいことを知りたいですか?

私がやっていること、例えばお問い合わせフォーム

<?php
if(isset($_POST['contact'])) {
    $throw_error = array();

    //First Block Is Validation
    if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
        $throw_error['field_blank'] = 'Fields Cannot Be Blank';
    } elseif(strlen($_POST['first_name']) < 3) {
         $throw_error['char_len'] = 'First Name Cannot Be Less Than 3 Characters';
    }

    //Second Block Is Process If No Errors Are Found
    if(empty($throw_error)) {
        $first_name = $_POST['first_name']; 
       //Don't worry about the sanitizing part, am doing it
       //Process the form ahead and then redirect using header()
       }
    } elseif(!empty($throw_error)) { //Third Block To Throw Error If Any Errors Found
        if(isset($throw_error['field_blank'])) {
            echo  $throw_error['field_blank'];
        } elseif(isset($throw_error['char_len'])) {
            echo  $throw_error['char_len'];
        }
    }
?>

<form>
   <input type="text" name="first_name" />
   <input type="text" name="last_name" />
   <input type="submit" value="Submit" name="contact" />
</form>
4

2 に答える 2

1

ここであなたが素晴らしいことを試してみてください。配列に必要なものをすべて排除するthrow_errorだけでなく、コードを大幅に削減します。

try{
    $first_name = '';
    if(isset($_POST['contact'])) {
        if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
            throw new Exception('Fields Cannot Be Blank');
        } elseif(strlen($_POST['first_name']) < 3) {
             throw new Exception('First Name Cannot Be Less Than 3 Characters');
        }
        $first_name = $_POST['first_name'];
    }
}catch(Exception $e){
    echo $e->getMessage();
}

このcatchステートメントに配列を渡すことを検討している場合、私が見つけた最も簡単な方法はserialize、配列を使用してからunserialize完了することです。これにより、すべてのエラーを一度に印刷できます。

try{
    $first_name = '';
    if(isset($_POST['contact'])) {
        if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
            $throw_error[] = 'Fields Cannot Be Blank';
        }
        if(strlen($_POST['first_name']) < 3) {
             $throw_error[] = 'First Name Cannot Be Less Than 3 Characters';
        }
        if(isset($throw_error)){
            throw new Exception(serialize($throw_error));
        }
        $first_name = $_POST['first_name'];
    }
}catch(Exception $e){
    $errors = unserialize($e->getMessage());
    foreach($errors as $error){
        echo $error.'<br>';
    }
}
于 2013-01-05T16:43:07.250 に答える
1

また、Try/Catchの使用をお勧めします。手続き型ブロックでも引き続き使用できます。

あなたがそれに反対しているなら、このコードはあなたがしたいことをするように見えますが、それは過剰に設計されています。ユーザーはfield_blankまたはchar_lenエラーのいずれかを持つ可能性があるため、必要な文字列エラー変数は1つだけです。

$error = NULL;
if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
    $error = 'Fields Cannot Be Blank';
} elseif(strlen($_POST['first_name']) < 3) {
     $error = 'First Name Cannot Be Less Than 3 Characters';
}

..。

if(!empty($error)) {
   echo $error;
}

複数の非排他的エラーをキャッチして表示する必要がある場合は、サンプルコードで引用した配列を使用して、巨大なif / elseifブロックを作成するのではなく、値を反復処理することができます。

} elseif(!empty($throw_error)) { //Third Block To Throw Error If Any Errors Found
    foreach($throw_error as $key => $message) {
        echo $message.'<br>';
    }
}
于 2013-01-05T16:58:39.170 に答える