簡體   English   中英

PHP 在另一頁上處理的表單 - 但 PHP 驗證不起作用

[英]PHP Form with process on another page - But PHP validation doesn't work

我創建了一個基本的 HTML 表單,並希望使用 php 代碼將表單數據插入到 mysql 數據庫中。 我創建了 3 個頁面,一個是 index.php,第二個是 process.php,第三個是 config.php。 我的 HTML 表單代碼包含在 index.php 中,如下所示:

    <form action="process.php" method="POST">
        <div>
            <label for="name">Name:</label><br />
            <input type="text" name="name" id="name"><br />
            <span class="error"><?php echo $nameErr; ?></span><br />
        </div>
        <div>
            <label for="email">Email:</label><br />
            <input type="text" name="email" id="email"><br />
            <span class="error"><?php echo $emailErr; ?></span><br />
        </div>
        <div>
            <label for="message">Message:</label><br />
            <textarea name="message" id="message" cols="22" rows="10"></textarea>
        </div>
        <br />
        <input type="submit" name="submit" value="Submit">  
    </form>

我的 PHP 用於表單驗證和將數據插入數據庫的代碼包含在 process.php 中。 我連接到數據庫的代碼包含在 config.php 中。 問題是,當我正確填寫表單字段時,它完美地工作,提交表單並將數據插入數據庫。 但是當我錯誤地填寫表單字段時,它沒有向我顯示每個字段下方的驗證消息並在 index.php 頁面上停止我直到我正確填寫所有字段,它會將我重定向到空白 process.php 頁面。

我想,當我填寫錯誤的字段時,它應該在字段下方顯示一條警告消息,並且應該在 index.php 頁面上阻止我,直到我正確填寫所有字段。

謝謝,

你現在要做的是:

  1. 負載index.php
  2. 包括process.php
  3. 沒有$_POST數據,所以它跳過檢查並顯示表單

然后將表單發布到process.php

  1. 加載process.php
  2. 檢查$_POST
  3. 如果數據正常:回顯成功消息,或因錯誤插入而失敗
  4. 如果數據不正常:你到達腳本的末尾並且什么都不做,導致一個空白頁面

你應該做的是將表格指向index.php

  1. 負載index.php
  2. 僅當有$_POST數據時包括process.php
  3. 檢查$_POST
  4. 如果正常:回顯消息和 DIE
  5. 如果不行:設置錯誤
  6. 顯示表單(同樣,包括錯誤)

所以index.php應該是這樣的:

<?php
$name = $email = $message = "";
$nameErr = $emailErr = "";

//If there is $_POST data, do the check
if ($_SERVER['REQUEST_METHOD'] == "POST") {
   // load process.php only if needed
   require_once "process.php";
   //... do the testing
   
   if (empty($nameErr) && empty($emailErr)) {
      // load config.php only if needed
      require_once "config.php";
      //... insert into db
      if ($stmt -> execute()) {
         //SHOW a SUCCESS message and STOP
         echo ...;
         die;
         }
      else {
        //show a FAIL message and STOP
        echo ...;
        die;
        }
      }

   }

?>
//At this point, there is either no POST data (first time load), or you checked the data and there are errors. So you DISPLAY THE FORM (again), including errors.
<form action="index.php" method="POST">
....
</form>

我假設您的表格在index.php中。 首先,您應該制作一個表格並檢查 session 中是否存儲了任何內容作為錯誤消息或不顯示錯誤:

<?php
// index.php
session_start();
$emailErr = isset($_SESSION['error_email']) ? $_SESSION['error_email'] : '';
$messageErr = isset($_SESSION['error_message']) ? $_SESSION['error_message'] : '';
$nameErr = isset($_SESSION['error_name']) ? $_SESSION['error_name'] : '';
?>
<form action="process.php" method="POST">
    <div>
        <label for="name">Name:</label><br />
        <input type="text" name="name" id="name" value="<?php echo $name; ?>"><br />
        <span class="error"><?php echo $nameErr; ?></span><br />
    </div>
    <div>
        <label for="email">Email:</label><br />
        <input type="text" name="email" id="email" value="<?php echo $email; ?>"><br />
        <span class="error"><?php echo $emailErr; ?></span><br />
    </div>
    <div>
        <label for="message">Message:</label><br />
        <textarea name="message" id="message" cols="22" rows="10"><?php echo $message; ?></textarea>
        <span class="error"><?php echo $messageErr; ?></span><br />
    </div>
    <br />
    <input type="submit" name="submit" value="Submit">  
</form>

現在您應該在process.php中處理您的表單,並為未驗證的字段設置所需的 session 錯誤:

// process.php
session_start();
unset($_SESSION['error_email'], $_SESSION['error_message'], $_SESSION['error_name']);
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $valid = true;
    $input_name = test_input($_POST['name']);
    if (empty($input_name)) {
        $_SESSION['error_name'] = "Please enter a name!";
        $valid = false;
    } elseif (!preg_match("/^[a-zA-Z ]*$/", $input_name)) {
        $_SESSION['error_name'] = "Only letters and white spaces are allowed!";
        $valid = false;
    } else {
        $name = $input_name;
    }
    $input_email = test_input($_POST['email']);
    if (empty($input_email)) {
        $_SESSION['error_email'] = "Please enter an email address!";
        $valid = false;
    } elseif (!filter_var($input_email, FILTER_VALIDATE_EMAIL)) {
        $_SESSION['error_email'] = "Invalid email address!";
        $valid = false;
    } else {
        $email = $input_email;
    }

    $input_message = test_input($_POST['message']);
    if (empty($input_message)) {
        $_SESSION['error_message'] = "Please enter your message!";
        $valid = false;
    } else {
        $message = $input_message;
    }

    if ($valid) {
        $sql = "INSERT INTO users (name, email, message) VALUES (?, ?, ?)";

        if ($stmt = $conn -> prepare($sql)) {
            $stmt -> bind_param("sss", $param_name, $param_email, $param_message);

            $param_name = $name;
            $param_email = $email;
            $param_message = $message;

            if ($stmt -> execute()) {
                echo "<p style='color:green'>Thank you for submitting the form! We'll get back to you soon.</p>";
                echo "<a href='index.php'>Go back</a>";
            } else {
                echo "<p style='color:red'>Something went wrong! Please try again later.</p>";
            }
        }
        $stmt -> close();
        $conn -> close();
    } else {
        $conn -> close();
        header('Location: index.php');
        exit('<meta httpd-equiv="Refresh" content="0;url=index.php"/>');
    }
}

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM