簡體   English   中英

PHP-表單字段驗證

[英]PHP - Form field validation

我有一個接受數據的表格,一旦用戶填寫了所有必填字段,我就使用php將其發送到我的電子郵件中。 如果一個字段為空,我會收到一條消息,例如。 "Email is required"但是電子郵件仍然發送。 我不知道問題出在哪里? 如果任何字段為空,我都不希望發送電子郵件。我也不希望每次單擊提交時都刷新頁面,我只想顯示"Required message".

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

$nameErr = $lastNameErr = $emailErr = $ironingErr = $descriptionErr = $RoomErr = "";
$first_name = $last_name = $email = $ironing = $description = $Rooms ="";

if(isset($_POST['submit'])){
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $ironing = $_POST['ironing'];
    $Rooms = $_POST['Rooms'];
    $Description = $_POST['description'];
    if (empty($_POST["first_name"])) {
        $nameErr = "Name is required";
    } else {
        $name = test_input($_POST["first_name"]);
        // check if name only contains letters and whitespace
        if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
            $nameErr = "Only letters and white space allowed"; 
        }
    }
    if (empty($_POST["email"])) {
        $emailErr = "Email is required";
    } else {
        $email = test_input($_POST["email"]);
        // check if e-mail address is well-formed
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $emailErr = "Invalid email format"; 
        }
    }

    if (empty($_POST["description"])) {
        $descriptionErr = "Description is required";
    } else {
        $description = test_input($_POST["description"]);
    }
    if (empty($_POST["Rooms"])) {
        $RoomErr = "Room number is Required";
    } else {
        $Rooms = test_input($_POST["Rooms"]);
    }
    if (empty($_POST["ironing"])) {
        $ironingErr = "Ironing is Required";
    } else  {
        $ironing = test_input($_POST["ironing"]);
    }

    $to = "someemail@gmail.com"; // this is your Email address
    $subject = "Order Sumbittion";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['description']. "\n\n" . "Number of Rooms: ". "\n\n"  . $_POST['Rooms'] ."Ironing: " . $_POST['ironing'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['description']. "\n\n" . "Number of Rooms: " . "Number of Rooms: " . $_POST['Rooms'] ."Ironing: ". $_POST['ironing'];
    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2);          
    // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    header("Location: index.php");
}
// You can also use header('Location: thank_you.php'); to redirect to another page.
}
?>
<p><span class="error">* required field.</span></p>
<div class="col-md-9">
    <form action="" method="post">
        First Name: <input type="text" name="first_name">
        <span class="error">* <?php echo $nameErr;?></span><br>
        <br>
        Last Name: <input type="text" name="last_name">
        <span class="error">* <?php echo $lastNameErr;?></span><br>
        Email:
        <br>
        <input type="text" name="email">
        <span class="error">* <?php echo $emailErr;?></span>
        <br>
        Ironing?<br>
        <input type="radio" name="ironing" <?php if (isset($ironing) && $ironing=="Yes") echo "checked";?> value="Yes">Yes
        <input type="radio" name="ironing" <?php if (isset($ironing) && $ironing=="No") echo "checked";?> value="No">No
        <span class="error">* <?php echo $ironingErr;?></span>
        <br>
        Number Of Rooms:
        <br>
        <input type="text" name="Rooms">
        <span class="error">* <?php echo $RoomErr;?></span>
        <br>
        Description of the House:
        <br>
        <textarea name="description" rows="10" cols="70"></textarea>
        <span class="error">* <?php echo $descriptionErr;?></span>
        <br>
        <input type="submit" name="submit" value="Submit">
    </form>

在檢查完錯誤並加載錯誤消息變量之后,您很簡單地發送電子郵件,而無需檢查是否發現了任何錯誤。

因此,請嘗試在發送電子郵件之前添加一些代碼,以檢查是否發現任何此類錯誤,例如

首先更改此行以將錯誤變量設置為NULL

$nameErr = $lastNameErr = $emailErr = $ironingErr = $descriptionErr = $RoomErr = NULL;

然后將發送的電子郵件包裝在這樣的測試中

if (isset( $nameErr) || isset($lastNameErr) || isset($emailErr) ||
     isset($ironingErr) || isset($descriptionErr) || isset($RoomErr) ) {
    // You have an error
} else {
    $to = "someemail@gmail.com"; // this is your Email address
    $subject = "Order Sumbittion";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['description']. "\n\n" . "Number of Rooms: ". "\n\n"  . $_POST['Rooms'] ."Ironing: " . $_POST['ironing'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['description']. "\n\n" . "Number of Rooms: " . "Number of Rooms: " . $_POST['Rooms'] ."Ironing: ". $_POST['ironing'];
    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2);          
    // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    header("Location: index.php");
}

該代碼可在我自己的網站上運行,該代碼段用於向您發送電子郵件,並且用戶實際上沒有進行驗證以檢查您的支票中是否出現任何錯誤。

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

$nameErr = $lastNameErr = $emailErr = $ironingErr = $descriptionErr = $RoomErr = "";
$first_name = $last_name = $email = $ironing = $description = $Rooms ="";

$error = false;

if(isset($_POST['submit']))
    {   
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $ironing = $_POST['ironing'];
    $Rooms = $_POST['Rooms'];
    $Description = $_POST['description'];

    if (empty($_POST["first_name"])) {
        $nameErr = "Name is required";
        $error = true;
    } else {
        $name = test_input($_POST["first_name"]);
        // check if name only contains letters and whitespace
        if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
            $nameErr = "Only letters and white space allowed"; 
            $error = true;
        }
    }
    if (empty($_POST["email"])) {
        $emailErr = "Email is required";
         $error = true;
    } else {
        $email = test_input($_POST["email"]);
        // check if e-mail address is well-formed
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $emailErr = "Invalid email format"; 
             $error = true;
        }
    }

    if (empty($_POST["description"])) {
        $descriptionErr = "Description is required";
         $error = true;
    } else {
        $description = test_input($_POST["description"]);
    }
    if (empty($_POST["Rooms"])) {
        $RoomErr = "Room number is Required";
         $error = true;
    } else {
        $Rooms = test_input($_POST["Rooms"]);
    }
    if (empty($_POST["ironing"])) {
        $ironingErr = "Ironing is Required";
         $error = true;
    } else  {
        $ironing = test_input($_POST["ironing"]);
    }

    if ($error === false)
        {
    $to = "youremail@gmail.com"; // this is your Email address
    $subject = "Order Sumbittion";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['description']. "\n\n" . "Number of Rooms: ". "\n\n"  . $_POST['Rooms'] ."Ironing: " . $_POST['ironing'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['description']. "\n\n" . "Number of Rooms: " . "Number of Rooms: " . $_POST['Rooms'] ."Ironing: ". $_POST['ironing'];
    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2);          
    // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    header("Location: index.php");
        }
}
// You can also use header('Location: thank_you.php'); to redirect to another page.

?>
<p><span class="error">* required field.</span></p>
<div class="col-md-9">
    <form action="" method="post">
        First Name: <input type="text" name="first_name">
        <span class="error">* <?php echo $nameErr;?></span><br>
        <br>
        Last Name: <input type="text" name="last_name">
        <span class="error">* <?php echo $lastNameErr;?></span><br>
        Email:
        <br>
        <input type="text" name="email">
        <span class="error">* <?php echo $emailErr;?></span>
        <br>
        Ironing?<br>
        <input type="radio" name="ironing" <?php if (isset($ironing) && $ironing=="Yes") echo "checked";?> value="Yes">Yes
        <input type="radio" name="ironing" <?php if (isset($ironing) && $ironing=="No") echo "checked";?> value="No">No
        <span class="error">* <?php echo $ironingErr;?></span>
        <br>
        Number Of Rooms:
        <br>
        <input type="text" name="Rooms">
        <span class="error">* <?php echo $RoomErr;?></span>
        <br>
        Description of the House:
        <br>
        <textarea name="description" rows="10" cols="70"></textarea>
        <span class="error">* <?php echo $descriptionErr;?></span>
        <br>
        <input type="submit" name="submit" value="Submit">
    </form>

如果您不想刷新頁面,則可以使用ajax調用在服務器上發送數據以進行驗證。 否則,每次您提交光滑的表單時,表單都會提交,頁面也會刷新。 每次天氣數據有效與否,都會發送電子郵件,因為沒有條件可以檢查數據是否有效。 因此,使用變量並將其分配為“ false”,然后在發送前檢查其是否仍為true,然后發送電子郵件。 }

首先,解決您的問題的方法是,即使您捕獲了錯誤

if (empty($_POST["email"])) {
        $emailErr = "Email is required";
    } 

您沒有應用任何檢查來確保腳本執行不會繼續,為此,您可以添加die(); 您也可以將狀態變量設置為$status = 0; 如果發現任何錯誤,只需分配$status = 1並在發送電子郵件之前檢查if($status == 0) 現在,如果您想顯示錯誤消息而不刷新頁面,我建議您使用jquery或任何插件,例如https://validatejs.org/

暫無
暫無

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

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