0

私のPHPWebアプリケーションでは、通常、入力が検証基準に一致しない場合はNULLを返すか、検証基準が満たされる場合は元の入力値を返すカスタム関数を使用して、ユーザー入力を検証します。したがって、基本的なプロセスフローは次のようになります。

$user_input = $_POST['fieldname'];
$user_input = validation_function($user_input);

if (isset($user_input)) {
  // do stuff
}

これの良いところは、関数が可変数のパラメーターを受け取るため、任意の数のユーザー入力を受け取り、それらを検証してisset()から、パラメーターとして関数に貼り付けることができることです。isset()

今、私はNULLの戻り値がどのように悪いかについて多くのことを読んでいます、そしてこのSOの質問、「nullを返すのは悪いデザインですか?」基本的に、 「nullを返さない理由は、nullをチェックする必要がないため、コードが戻り値に基づいて別のパスをたどる必要がないということです」というすばらしい答えがあります。これがアプリケーションの内部動作でどのように有益であるかを理解していますが、この原則を入力検証にどのように適用できますか?

問題の核心は、上記のコード例のようにNULLを返す必要がない方法で入力検証を処理するにはどうすればよいですか?

4

4 に答える 4

1

まず第一にisset、このように使用しないでください。あなたはそれを悪用しています。

       if at all, use isset here, because
     this variable *may* actually not be set
              vvvvvvvvvvvvvvvvvvv
$user_input = $_POST['fieldname'];

if (isset($user_input)) {
    ^^^^^^^^^^^^^^^^^^
 do not use isset here, because
 this variable is definitely set

isset特定の目的があり、適切なエラー処理/抑制に使用されます。そのように使用すると、タイプミスされた変数のエラー報告を抑制することで、あなたの人生をより困難にするだけですisset.

次に、コードを一般化する必要があります。検証するフィールドの配列を作成します。その配列に対してループを実行し、フィールドtrueまたはにフラグを立てますfalse。すべてのフィールドが true かどうかを調べます。

$validate = array_fill_keys(array('firstname', 'lastname', ...), null);

foreach ($validate as $field => &$valid) {
    // your validation logic here!
    $valid = !empty($_POST[$field]) ? $_POST[$field] : false;
}

if (array_filter($validate, function ($i) { return $i === false; })) {
    die('Some fields are invalid!');
}

単純な骨格です。これを拡張して、配列内の失敗したフィールドの個々のエラー メッセージ、個々の検証規則などを設定できます。

于 2012-07-02T12:17:03.430 に答える
0
if(isset($user_input))
 {
$flg = true;
}
if($flg)
{
//do stuff
}

それがあなたが探しているものだと思います。私の検証方法として、変数 true と false を設定できます。

于 2012-07-02T11:40:10.487 に答える
0

入力検証のために、私は常に元の値を返し、そのフィールドに何らかの方法で無効としてフラグを立てます。この理由は、通常、フィールドごとに検証エラー メッセージを表示したいからです。関数ではなく、クラスを使用して、これらすべてを追跡する方がはるかに簡単です。

このアプローチに興味がある場合は、どのようZend_FormZend_Validate連携してユーザー入力用の拡張可能な検証インターフェースを提供するかをご覧ください。

于 2012-07-02T11:40:34.693 に答える
0

baig772 の回答から派生した、もう少しコンパクトな方法:

if(validation_function($user_input)) 
{
// do stuff
}

boolvalidation_function()を返し、それに基づいて何をすべきかを決定します。の必要はありませんisset()。もちろん、そのブロック内でフラグを設定し、それらのフラグをコードの後半で使用できます。isset()混合変数を追加できますが、入力タイプに基づいて異なる検証関数が必要になると想定できます。だからあなたはこれに行くことができます:

if(validation_function_fname($first_name) && validation_function_email($email))
{
//do stuff
}

または、次のようにします。

$name_ok = validation_function_fname($first_name);
$email_ok = validation_function_email($email);

if($name_ok && $email_ok)
{
// do stuff
}
于 2012-07-02T12:01:04.647 に答える