PHP电子邮件表单验证没有

时间:2017-01-26 15:19:45

标签: php forms validation email

我是PHP的新手,我创建了一个表单,如果任何字段为空或不正确,应该验证数据并提交错误。它没有。即使电子邮件错误或任何字段为空并且显示错误,它仍会发送电子邮件。并且标题未显示在消息中。当所有字段都为空时,显示错误且未发送邮件的唯一情况。这是代码:

<?php
$NameErr = $EmailErr = $SubErr = $MessErr = "";
$Name = $Email = $Subject = $Message = "";
$header = "From: " . $Email . "Name: " . $Name . "\r\n";
$header .= "Content-Type: text/plain";
$To = "xxx@gmail.com";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST["Name"])) {
        $NameErr = "Name is required";
    } else {
        $Name = test_input($_POST["Name"]);
        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"]);
        if (!filter_var($Email, FILTER_VALIDATE_EMAIL)) {
            $EmailErr = "Invalid email format";
        }
    }
    if (empty($_POST["Subject"])) {
        $SubErr = "Subject is required";
    } else {
        $Subject = test_input($_POST["Subject"]);
    }
    if (empty($_POST["Message"])) {
        $MessErr = "Message is required";
    } else {
        $Message = test_input($_POST["Message"]);
    }
}

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

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
    <p><input class="w3-input w3-padding-16" type="text" placeholder="Name" name="Name"></p>
    <span class="error"> <?php echo $NameErr; ?></span>
    <p><input class="w3-input w3-padding-16" type="text" placeholder="Email" name="Email"></p>
    <span class="error"> <?php echo $EmailErr; ?></span>
    <p><input class="w3-input w3-padding-16" type="text" placeholder="Subject" name="Subject"></p>
    <span class="error"> <?php echo $SubErr; ?></span>
    <p><input class="w3-input w3-padding-16" type="text" placeholder="Message" name="Message"></p>
    <span class="error"> <?php echo $MessErr; ?></span>
    <p>
        <button class="w3-btn w3-grey w3-padding-large w3-hover-green" type="submit" value="Submit" name="pressed">
            <i class="fa fa-paper-plane"></i> SEND MESSAGE
        </button>
    </p>
</form>
<?php
if (isset($_POST["pressed"])) {
    if (empty($NameErr && $SubErr && $MessErr && $EmailErr)) {
        mail($To, $Subject, $Message, $header);
        echo "Email sent.";
    } else {
        echo "Error.";
    }
}
?> 
你能帮帮我吗?验证错误已启用,并且不会向我显示任何错误。

3 个答案:

答案 0 :(得分:1)

使用isset函数代替empty()来检查字段是否已过帐。 例如:

if (!isset($_POST["Name"])) {
...

也没有必要检查请求方法,$_POST只会捕获帖子请求。

答案 1 :(得分:0)

您在底部构建empty支票的方式不正确:

if (empty($NameErr && $SubErr && $MessErr && $EmailErr)){

这将评估为false的唯一方法是,如果设置了所有错误消息,并且上述代码段将在PHP 5.5之前中断(正如Felippe在评论中提到的那样) 。你想要的是以下;只有在设置错误消息的 none 时,它才会返回true

if (empty($NameErr)
   && empty($SubErr)
   && empty($MessErr)
   && empty($EmailErr)) {

另一种方法是

  • 将验证逻辑提取到可读性方法中,
  • 读取$errors数组而不是$NameErr$SubjectErr等。
  • 将POST逻辑保持在一起(而不是在开头和结尾之间分开)

为此目的,我已经重写了以下代码段:

<?php
function validateName($input)
{
    if (empty($input)) {
        return 'Name is required';
    }
    if (preg_match("/^[a-zA-Z ]*$/", $input) != 1) {
        return 'Name may only contain letters and spaces';
    }
    return null;
}

function validateEmail($input)
{
    if (empty($input)) {
        return 'Email is required';
    }
    if (filter_var($input, FILTER_VALIDATE_EMAIL)) {
        return 'Email is in an invalid format';
    }
    return null;
}

function validateSubject($input)
{
    return empty($input) ? 'Subject is required' : null;
}

function validateMessage($input)
{
    return empty($input) ? 'Message is required' : null;
}

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

$errors = [];
$notification = '';

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

    $name = test_input($_POST['name'] ?: '');
    $email = test_input($_POST['email'] ?: '');
    $subject = test_input($_POST['subject'] ?: '');
    $message = test_input($_POST['message'] ?: '');

    if (($error = validateName($name)) !== null) {
        $errors['name'] = $error;
    }
    if (($error = validateEmail($email)) !== null) {
        $errors['email'] = $error;
    }
    if (($error = validateSubject($subject)) !== null) {
        $errors['subject'] = $error;
    }
    if (($error = validateMessage($message)) !== null) {
        $errors['message'] = $error;
    }

    if (empty($errors)) {
        $headers = [
            "From: $name <$email>",
            "Content-Type: text/plain",
        ];
        $to = "xxx@gmail.com";

        mail($to, $subject, $message, implode("\r\n", $headers));
        $notification = 'The email was sent!';
    } else {
        $notification = 'The email could not be sent; please check below for errors.';
    }
}

?>
<form method="post" action="<?= htmlspecialchars($_SERVER['PHP_SELF']) ?>">
    <?php if (!empty($notification)): ?><p><?= $notification ?></p><?php endif; ?>

    <p><input class="w3-input w3-padding-16" type="text" placeholder="Name" name="name" required></p>
    <?php if (isset($errors['name'])): ?><span class="error"> <?= $errors['name'] ?></span><?php endif; ?>

    <p><input class="w3-input w3-padding-16" type="email" placeholder="Email" name="email" required></p>
    <?php if (isset($errors['email'])): ?><span class="error"> <?= $errors['email'] ?></span><?php endif; ?>

    <p><input class="w3-input w3-padding-16" type="text" placeholder="Subject" name="subject" required></p>
    <?php if (isset($errors['subject'])): ?><span class="error"> <?= $errors['subject'] ?></span><?php endif; ?>

    <p><input class="w3-input w3-padding-16" type="text" placeholder="Message" name="message" required></p>
    <?php if (isset($errors['message'])): ?><span class="error"> <?= $errors['message'] ?></span><?php endif; ?>

    <p>
        <button class="w3-btn w3-grey w3-padding-large w3-hover-green" type="submit">
            <i class="fa fa-paper-plane"></i> SEND MESSAGE
        </button>
    </p>
</form>

答案 2 :(得分:0)

所以我为您设计了代码结构。通常调用类和函数将使您的文件和代码更清晰。

所以说到这里,让我告诉你一些见解。这是您的表单所在的位置,例如:form.php

<?php

require ('mail.php');

$send = new Mail();

if (isset($_POST['sendIt']))
{
    $send->sendMail($_POST['nameP'], $_POST['email'], $_POST['subject'], $_POST['message']); // Call the class and function
}

?>


<form id="contact" method="post">
    <div class="container">
        <input type="text" name="nameP" placeholder="Name *" /><br />
        <input  type="email" name="email" placeholder="Email *"/><br />
        <input type="text" name="subject" placeholder="Subject *"><br />
        <textarea name="message" id="" cols="30" rows="10"></textarea>
        <input type="submit" name="sendIt" id="submit">
    </div>
</form>

然后创建一个mail.php文件来存储类和一般围绕邮件的函数:

<?php

class Mail
{
    public function sendMail($name, $email, $subject, $message)
    {
        if (!empty($name))
        {
            if (!empty($email))
            {
                if (!empty($subject))
                {
                    if (!empty($message))
                    {
                                $email_to = 'Your@emailAddress';
                                $header = 'From: ' . $name ."<noreply@youremail>". "\r\n" .
                                    'Reply-To: ' . $email . "\r\n" .
                                    'X-Mailer: PHP/' . phpversion();

                                @mail($email_to, 'Enquiry Received', 'Name: ' . $name . "\r\n\r\n". 'Email Address: ' .$email."\r\n\r\n" . 'Message: ' .$message."\r\n\r\n". $header);

                                echo "SUCCESS MESSAGE";
                    } else {
                        echo "Please fill in your message";
                    }
                } else {
                    echo "Please provide a subject.";
                }
            } else {
                echo "Please provide your email address.";
            }
        } else {
            echo "Please provide your name.";
        }

    }
}
?>

如果默认情况下出现错误,通常会清除表单,但您只需添加value="<?php echo $_POST['whateverThisFormIsFor'];?>

我希望这会有所帮助,并为您提供进一步的见解。

相关问题