2

ソリッドフォームの検証に実際に最適な方法は何だろうと思っていました。

JavaScriptは非常に優れていますが、操作したり無効にしたりできるため、確実な検証の基盤にはなりません。

PHPでデータをチェックし、エラーが発生したときにフォームに再入力すると、投稿フォームにいくつかの問題があります。

  • フォームがリダイレクトせずに表示された場合、ユーザーがデータを再送信したい場合は、F5に確認ボックスが表示されます。これはあまり美しくありません。
  • ユーザーが再びフォームにリダイレクトされた場合、データはGETまたはによって送信される必要がありますPOST。を使用POSTすると、上記のF5問題が再び発生します。を使用すると、内部GETで値を転送するときに問題が発生します(PHPは符号の後に別のパラメーターを推測します)&
  • 3番目の方法は、データをデータベースに保存することです。たとえば、SUBMITTRIALSなどです。ただし、リダイレクト後に実際にデータをクリアする必要があります。

別の問題は、フォーム自体の再入力に伴います。次のようなコード:

echo "<input type='text' value='".$val."' />";

$val変数にアポストロフィを含む値が含まれている場合、これは非常に問題になります。これにより、無効なHTMLが生成されます。

ご覧のとおり、フォーム検証シナリオでは失敗する可能性が非常に高くなります。冒頭で説明したように、フォーム検証を処理するための最も信頼できる方法は何でしょうか。

4

4 に答える 4

2

サーバー側の言語は、フォームを検証する唯一の方法です。同じ目的で、フォームデータをセッションまたはCookieに保存できます。検証が完了したら、それらをフラッシュできます。データの引用符に問題がある場合は、PHPの組み込み関数addslashes()を使用stripslashes()して、それらを回避できます。

于 2012-09-04T16:09:37.130 に答える
1

あなたの3つの主要なポイントを1つずつ:

  1. はい、それは正しいです、そしていいえ、それはあまりエレガントではありません。しかし、あなたが言ったように:リダイレクトはその問題を解決します。したがって、リダイレクトします。
  2. いいえ、アンパサンドをに変換して&amp;も問題はありません
  3. なぜそのようなデータを保存するためにデータベースを使用するのですか?セッションの何が問題になっていますか?または、必要に応じて、Cookieを使用する必要がありますか?

再開する場合:確認ボックスを回避するためにリダイレクトし、送信されたデータをサーバー側に保存し、アンパサンドをHTMLエンティティに変換する必要がある場合は、セッションを使用します。これで準備は完了です。
変換&は次のように実行できます。

var tmpDiv = document.createElement('div');
tmpDiv.innerText = '&';
var entity = tmpDiv.innerHTML;//returns &amp;
于 2012-09-04T11:17:29.970 に答える
0

私はあなたのためにいくつかの解決策を持っています。

  1. ユーザーを同じページにリダイレクトし、投稿データを失う必要があります。

    header("Location: samefile.php?success=true");//or ?errors[]=blabla
    exit();
    
    if(isset($_GET['success']) && $_GET['success'] == true){
        //handle true
    }else if(/* here you can ask about errors or what ever */){
    
    }
    

    このようにして、更新時にデータを再送信することを回避できます。

  2. データベースの代わりに$_SESSIONを使用してデータを保存します。

私が間違っている場合は私を訂正してください。

于 2012-09-04T11:40:20.343 に答える
-2

私はjqueryフォームバリデーターを使用していますが、それは非常にうまく機能します。

あなたの頭のタグで:

<script language="javascript" type="text/javascript" src="/media/js/jquery-latest.js"></script>

<script language="javascript" type="text/javascript" src="/media/js/jquery.validate.min.js"></script>
<script>
  $(document).ready(function(){
    $( "#commentform" ).validate();
  });
</script>

そして、次のようなフォームを使用します。

  <form id="commentform" action="/index/addcomment" method="POST">

    <p>
      <input type="text" name="Name" id="name" value="" size="22" class="required" minlength="3">
      <label for="name"><em>*</em><?= _("Name") ?></label>
    </p>

    <p>
      <input type="text" name="EMail" id="email" value="" size="22" class="required email">
      <label for="email"><em>*</em><?= _("EMail") ?> <?= _("(will not be published)") ?></label>
    </p>

    <p>
      <input type="text" name="Url" id="url" value="" size="22">
      <label for="url"><?= _("Website") ?></label>
    </p>

    <p>
      <textarea name="Content" id="comment" cols="100%" rows="10" class="required" minlength="5"></textarea>
    </p>

    <p>
      <input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment">
      <input type="hidden" name="BlogId" value="<?= $this->model->BlogId ?>" />
    </p>

  </form>

詳細:http ://docs.jquery.com/Plugins/Validation

于 2012-09-04T11:08:11.317 に答える