2017-03-22 12 views
0

こんにちは私は奇妙な問題があります。フォームのフィールドが空の場合でも、フォームはまだ送信されます。以下は私のコードです...ここで何が起こっているのか教えてください。フォームが空で検証が行われているときに送信されるPHPフォーム

また、同じページに2つのフォームがあります。両方とも$_SERVER['PHP_SELF']アクションを使用します。

作業フローは、ユーザーが最初のフォームを使用して賞品ホイールを回転させ(検証はこのフォームで正常に機能します)、投稿が成功した後にスピナーが表示されます。

2番目のフォームでsubmitをクリックすると、最初のフォームが再び表示され、2番目のフォームの検証が無視され、2番目のフォームが表示されます(どちらが空になりますか)。ページが爽やかであることを前提としていることを確認してください。これを回避する方法はありますか?

$nameErr = $lNameErr = $pCodeErr = $successMessage = $errorMessage = ""; 
$name = $lName = $pCode = ""; 

$errors = 0; 
$regex = '^[a-zA-Z0-9]{3}()?[a-zA-Z0-9]{3}$^'; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 

    if (empty($_POST["name"])) { 
     $nameErr = "First Name is required"; 
     $errors++; 
    }else { 
     $name = test_input($_POST["name"]); 
    } 

    if (empty($_POST["lName"])) { 
     $lNameErr = "Last Name is required"; 
     $errors++; 
    }else { 
     $lName = test_input($_POST["lName"]); 
    } 

    if (empty($_POST["pCode"])) { 
     $pCodeErr = "Postal Code is required"; 
     $errors++; 
    }else { 
     $pCode = test_input($_POST["pCode"]); 

     // check if e-mail address is well-formed 
     if (!preg_match($regex, $_POST["pCode"])) { 
      $pCodeErr = "Invalid Postal Code format"; 
      $errors++; 
     } 
    } 

    if($errors == 0){ 
     $duplicate = $conn->prepare("SELECT `Pcode` FROM `winners` WHERE `Pcode` = ?"); 
     $query->bindValue(1, $email); 
     $query->execute(); 
     if($duplicate->rowCount() > 0) { 
      $errorMessage = "Sorry this user is already in our database!"; 
     } else { 
      $successMessage = "Form Submission Successful!"; 
      $sql = "INSERT INTO winners (Fname, Lname, Pcode) VALUES (:fName, :lName, :pCode)"; 
      $stmt = $conn->prepare($sql); 
      // $stmt->bindParam(':email', $email, PDO::PARAM_STR); 
      $stmt->bindParam(':fName', $name, PDO::PARAM_STR); 
      $stmt->bindParam(':lName', $lName, PDO::PARAM_STR); 
      $stmt->bindParam(':pCode', $pCode, PDO::PARAM_STR); 
      $stmt->execute(); 
     } 
    } 
} 

、ここでは私のフォームで

<form id="winner-form" class="spin-form" method = "post" action = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

    <p>To claim your prize please fill in the form below.</p> 
    <div class="form-group"> 
     <label>Name:</label> 
     <input class="form-control" placeholder="Please enter your First Name" value="<?php echo $name;?>" type = "text" name = "name"> 
     <span class = "error">* <?php echo $nameErr;?></span> 
    </div> 

    <div class="form-group"> 
     <label>Last Name:</label> 
     <input class="form-control" placeholder="Please enter your Last Name" value="<?php echo $lName;?>" type = "text" name = "lName"> 
     <span class="error">* <?php echo $lNameErr;?></span> 
    </div> 

    <div class="form-group"> 
     <label>Postal Code:</label> 
     <input class="form-control" placeholder="Please enter your Postal Code" value="<?php echo $pCode;?>" type = "text" name = "pCode"> 
     <span class="error">* <?php echo $pCodeErr;?></span> 
    </div> 

    <td> 
     <input class="btn btn-lg btn-success" type="submit" name="sub" value="Submit"> 
    </td> 

    <?php if($successMessage != "") { ?> 
     <span class ='alert alert-success'><?php echo $successMessage; ?></span> 
    <?php } ?> 

    <?php if($errorMessage != "") { ?> 
     <span class ='alert alert-danger'><?php echo $errorMessage; ?></span> 
    <?php } ?> 

</form> 
+0

PHPはフォームの送信を停止できません。これはクライアント側で、PHPはサーバー側にあります。 – miken32

+0

また、ここにはフォームが1つしかないため、パラメータを渡さないため、最初のデータベースクエリは機能しません。 – miken32

答えて

0

私はあまり評判を持っている原因私はコメントすることはできません申し訳ありませんが、あなたはSQLのNULLがNOにチェック設定した場合は、空の値を提出するからユーザーを防ぐことができますバリ。またはPHPの終了時に。

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (isset($_POST["name"]) == "") { 
     $nameErr = "First Name is required"; 
     $errors++; 
    } 
} 

それとも

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if ($_POST["name"]) == Null) { 
     $nameErr = "First Name is required"; 
     $errors++; 
    } 
} 

しかしそれは、JavaScriptやjQueryのを使用してフォーム検証機能を書くには多くの場合、最高です。これまであなたが好むのはどれですか?私の想像したコメントが参考になることを願っています。 :)

関連する問題