2017-05-03 7 views
0

私は過去数週間にわたってPHPを学んできましたが、実際にはロジックを実際に試してみるために、初心者はPHPフォームの検証に苦労しています

PHPを使用してフォームのデータ(最初は「名前」フィールドで始まります)を検証して、「送信成功」ページ(およびサーバーへのデータ)にユーザーを送信しようとしています。

私はこれまで「」= アクションを残すことによって、フォームの検証作業を取得するために管理している - のブランクので(私が読んだPHP_SELFは、セキュリティ上のリスクがある代わりに使用する)のような、しかし、問題はここにありますフォームを正しく記入してもアクションが設定されていないためどこにも行かないということです。

逆に、私はアクション= handler.phpで「投稿成功」ページにユーザーを送信することができましたが、これは私のPHPフォームフィールド検証コードを無視します。

私は、PHPの検証と結婚する方法がわからないので、ここではかなり明白なものがないと感じています。ユーザーに「送信成功」ページを送信し、データをどこかに保存してください。

capture.phpフォームページの一番上にPHPを読み取ります

<?php 

$name_error = ''; 

if(isset($_POST["submit"])) 
{ 
    if(empty($_POST["name"])) 
    { 
     $name_error = "Please Enter Name"; 
    } 
    else 
    { 
     if(!preg_match("/^[a-zA-Z ]*$/", $_POST["name"])) 
     { 
      $name_error = "Only Letters and whitespace"; 
     } 
    }  
} 
?> 

を - これは時間内にフォームフィールドの他のタイプを含めるように拡張されます。

capture.phpで私のhtml:

<body class="capture"> 

<!--action code #1--> 
<form action="" method="post" enctype="multipart/form-data"> 
<!--action code #2--> 
<!--<form action="handler.php" method="post" enctype="multipart/form-data">--> 

    <div class="col-lg-6 col-md-6 col-sm-6"> 
<div class="form-inline"> 
<div class="form-group"> 

<label for="name">Your name<span class="text-danger">*</span></label><br/> 
<input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70" /> 
<span class="text-danger"><?php echo $name_error; ?></span> 

</div> 
</div> 
</div> 

<div class="col-lg-6 col-md-6 col-sm-6"> 
    <div class="form-group"> 

<label for="games">Your choice</label> 
<select class="form-control" name="games"> 
    <option> -- </option> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
    <option>4</option> 
    </select> 

    </div> 
    </div> 

<div class="col-lg-6 col-md-6 col-sm-6"> 
    <input id="btn-prev" name="prev" type="prev" value="Prev"> 
    </div> 
    <div class="col-lg-6 col-md-6 col-sm-6"> 
<input id="btn-next" name="submit" type="submit" value="Next"></div> 

任意の助けてくれてありがとう、あなたのphpが仕事である場合、これがあると同じくらい をcapture.phpするために、フォームのアクションを設定

+1

検証を行っているページにPOSTデータが表示されないと思います。 form validationを 'handler.php'(検証エラー時にリダイレクト)に移動するか、フォーム要素の' action'を '' capture.php "'に設定してください。 – amphetamachine

答えて

0

あなたのフォームの検証に使用ヘッダーをやった後、あなたのご確認後にユーザーをリダイレクトします

if(!preg_match("/^[a-zA-Z ]*$/", $_POST["name"])) 
{ 
    $name_error = "Only Letters and whitespace"; 
} else { 
    // no errors - redirect to success page 
    header('Location:./handler.php'); 
} 

あなたのページに感謝にユーザーを送信するためにリダイレクトします。 検証が成功した場合にのみ実行を許可します。

リダイレクトを行うと、ページを再読み込みしてもフォームが再送信されなくなります。

実際にPHPのサニタイズと検証フィルタを見て、フォームの入力をきれいにして確認する必要があります。あなたは、データベースに名前を格納することを計画している場合

http://php.net/manual/en/filter.filters.sanitize.php
http://php.net/manual/en/filter.filters.validate.php

、SQLインジェクションを回避する方法を学ぶために余分な世話をする(https://www.w3schools.com/sql/sql_injection.asp

+0

恐縮です。さらに、フォーム入力を整理するリンクに感謝します。これは私が研究しているものです。 – Dicky

0

を提供、フォームを検証する、これはあなたがそれを送信したい場所です!

あなたが検証した後にリダイレクトしたい場合は、header

header('Location: handler.php'); 
1

を使用して別のページにリダイレクトすることができます私はあなたが最後のformタグを欠場、それはあなたのコードを働いていると思います。このコードを試してください。私は同じページアクションを使用するので、もしあなたがhandler.phpのアクションを設定したい場合は、ここで全てのコードをcapture.phpに入れてください。そして、handler.phpにPHPコードを追加し、エラーがあればcapture.phpにリダイレクトしてセッションを使うか、エラーが

<?php 

$name_error = ''; 

if (isset($_POST["submit"])) { 
    if (empty($_POST["name"])) { 
     $name_error = "Please Enter Name"; 
    } else { 
     if (!preg_match("/^[a-zA-Z ]*$/", $_POST["name"])) { 
      $name_error = "Only Letters and whitespace"; 
     } 
    } 
} 
?> 
<!--action code #1--> 
<form action="" method="post" enctype="multipart/form-data"> 
    <!--action code #2--> 
    <!--<form action="handler.php" method="post" enctype="multipart/form-data">--> 

    <div class="col-lg-6 col-md-6 col-sm-6"> 
     <div class="form-inline"> 
      <div class="form-group"> 

       <label for="name">Your name<span class="text-danger">*</span></label><br/> 
       <input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70"/> 
       <span class="text-danger"><?php echo $name_error; ?></span> 

      </div> 
     </div> 
    </div> 

    <div class="col-lg-6 col-md-6 col-sm-6"> 
     <div class="form-group"> 

      <label for="games">Your choice</label> 
      <select class="form-control" name="games"> 
       <option> --</option> 
       <option>1</option> 
       <option>2</option> 
       <option>3</option> 
       <option>4</option> 
      </select> 

     </div> 
    </div> 

    <div class="col-lg-6 col-md-6 col-sm-6"> 
     <input id="btn-prev" name="prev" type="prev" value="Prev"> 
    </div> 
    <div class="col-lg-6 col-md-6 col-sm-6"> 
     <input id="btn-next" name="submit" type="submit" value="Next"></div> 
</form> 

あなたは、このコード

<?php 
session_start(); 
?> 
<body class="capture"> 

    <!--action code #1--> 
    <form action="handler.php" method="post" enctype="multipart/form-data"> 
     <!--action code #2--> 
     <!--<form action="handler.php" method="post" enctype="multipart/form-data">--> 

     <div class="col-lg-6 col-md-6 col-sm-6"> 
      <div class="form-inline"> 
       <div class="form-group"> 

        <label for="name">Your name<span class="text-danger">*</span></label><br/> 
        <input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70"/> 
        <?php if (isset($_SESSION['form_error']['name'])) { ?> 
         <span class="text-danger"><?php echo $_SESSION['form_error']['name']; ?></span> 
         <?php 
        } ?> 
       </div> 
      </div> 
     </div> 

     <div class="col-lg-6 col-md-6 col-sm-6"> 
      <div class="form-group"> 

       <label for="games">Your choice</label> 
       <select class="form-control" name="games"> 
        <option>--</option> 
        <option>1</option> 
        <option>2</option> 
        <option>3</option> 
        <option>4</option> 
       </select> 

       <?php if (isset($_SESSION['form_error']['game_error'])) { ?> 
        <span class="text-danger"><?php echo $_SESSION['form_error']['game_error']; ?></span> 
        <?php 
       } ?> 

      </div> 
     </div> 

     <div class="col-lg-6 col-md-6 col-sm-6"> 
      <input id="btn-prev" name="prev" type="prev" value="Prev"> 
     </div> 
     <div class="col-lg-6 col-md-6 col-sm-6"> 
      <input id="btn-next" name="submit" type="submit" value="Next"></div> 
    </form> 
    <?php 
    unset($_SESSION['form_error']); 
    ?> 

を使用handler.phpファイル内のフォームを提出したいならば、これはあなたのhanlder.php

01です
<?php 
session_start(); 
$name_error = array(); 

if (isset($_POST["submit"])) { 
    if (empty($_POST["name"])) { 
     $name_error['name'] = "Please Enter Name"; 
    } else { 
     if (!preg_match("/^[a-zA-Z ]*$/", $_POST["name"])) { 
      $name_error['name'] = "Only Letters and whitespace"; 
     } 
    } 

    if ($_POST["games"] == '--') { 
     $name_error['game_error'] = "Please Select Game"; 
    } 
} 
if (!empty($name_error)) { 
    $_SESSION['form_error'] = $name_error; 
    header("Location: capture.php"); 
} 

?> 
+0

あなたの質問にスニペットを入力しても間違いがないと、紛失したタグがそれを停止します。 また、拡張するために、エラーの配列に追加してから、検証に失敗したすべての項目をリストすることができます。 – Brian

+0

hanlder.phpファイルにフォームを送信する私の更新の回答をチェックし、終了しない場合はすべてのエラーを表示してください。もしあなたがそれを変更することができます –

0

あなたはアクションをhandler.phpに戻し、capture.phpにある検証をhandler.phpの先頭に置くことができます。

キャプチャ。PHP

<body class="capture"> 

    <!--action code #1--> 
    <form action="handler.php" method="post" enctype="multipart/form-data"> 
    <!--action code #2--> 
    <!--<form action="handler.php" method="post" enctype="multipart/form-data">--> 

     <div class="col-lg-6 col-md-6 col-sm-6"> 
    <div class="form-inline"> 
    <div class="form-group"> 

    <label for="name">Your name<span class="text-danger">*</span></label><br/> 
    <input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70" /> 
    <?php 
    if(isset($_GET["name_error"])) { ?> 
     <span class="text-danger"><?php echo $name_error; ?></span> 
     <?php } ?> 

    </div> 
    </div> 
    </div> 

    <div class="col-lg-6 col-md-6 col-sm-6"> 
     <div class="form-group"> 

    <label for="games">Your choice</label> 
    <select class="form-control" name="games"> 
     <option> -- </option> 
     <option>1</option> 
     <option>2</option> 
     <option>3</option> 
     <option>4</option> 
     </select> 

     </div> 
     </div> 

    <div class="col-lg-6 col-md-6 col-sm-6"> 
     <input id="btn-prev" name="prev" type="prev" value="Prev"> 
     </div> 
     <div class="col-lg-6 col-md-6 col-sm-6"> 
    <input id="btn-next" name="submit" type="submit" value="Next"></div> 

Handler.php

<?php 

$name_error = null; 

if(isset($_POST["submit"])) 
{ 
    if(empty($_POST["name"])) 
    { 
     $name_error = "Please Enter Name"; 
    } 
    else 
    { 
     if(!preg_match("/^[a-zA-Z ]*$/", $_POST["name"])) 
     { 
      $name_error = "Only Letters and whitespace"; 
     } 
    }  
    if($name_error != null) { 
    header("Location: capture.php?message=".$name_error."); 
} 
?> 

あなたのメッセージがあなたのフォームに送り返してしまいますので、私は検証を変更しました。そこで、エラーメッセージが設定されているかどうかをチェックし、エラーメッセージが表示された場合は、エラーを表示します。

0

フォームに認識させるために必ずあなたが提出したいアクションファイル。 次のように編集します。

関連する問題