【问题标题】:PHP preg_match Form ValidationPHP preg_match 表单验证
【发布时间】:2014-01-20 14:38:49
【问题描述】:

我的 php 代码在发送到我的电子邮件之前验证页面本身的表单时遇到问题。

这是我的 PHP,它位于 html 文档类型之上

<?php
$name = $_POST['name'];
$email = $_POST['email'];
$subjectTitle = $_POST['subjectTitle'];
$comment = $_POST['comment'];   
$errormsg = "Invalid Entry";
$validmsg = "Thank you for your message";

if($_POST['submit']) {  
    if(empty($_POST['name'])) {     
        $nameError = true;  
    } 
    if(empty($_POST['email'])) {        
        $emailError = true; 
    }       
    if(empty($_POST['subjectTitle'])) {     
        $subjectError = true;   
    }       
    if(empty($_POST['comment'])) {
        $commentError = true;   
    } 
    else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {    
        $error = true;      
    }               
    else {          
        $to = "EMAIL_ADD_GOES_HERE";        
        $name = trim($_POST['name']);
        $email = trim($_POST['email']);
        $subjectTitle = trim($_POST['subjectTitle']);
        $comment = trim($_POST['comment']);         
        $subject = "Contact Form Enquiry";          
        $messages = "\r\n Name: $name \r\n Email: $email \r\n Subject: $subjectTitle \r\n Comments: $comment";
        $headers = "From:" . $name;
        $mailsent = mail($to, $subject, $messages, $headers);       
        if($mailsent) {         
            $sent = true;   
            $name = "";        
            $email = "";
            $subjectTitle = "";
            $comment = "";                          
        }           
    }   
}
?>

而对于我的 HTML ,为了方便查看,我将只放入表单部分。

<html>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
     Name: <input type="text" name="name" id="name" value="<?php echo $name; ?>"> 
     <?php if($nameError == true) {echo $errormsg;} ?>

     Email: <input type="text" name="email" id="email" value="<?php echo $email; ?>"> 
     <?php if($emailError == true) {echo $errormsg;} ?>

     Subject: <input type="text" name="subjectTitle" id="subjectTitle" value="<?php echo $subjectTitle; ?>"> 
     <?php if($subjectError == true) {echo $errormsg;} ?>

     Comments: <textarea name="comment" id="comment"><?php echo $comment; ?></textarea>
     <?php if($commentError == true) {echo $errormsg;} ?>
</form>
</html>

我的 html 中除了上面提到的,没有其他的 php 代码。

此验证仅在任何字段为空时有效。它会在页面本身内提示错误消息,并且不会在电子邮件中发送,这就是它应该如何工作的......

但是,我面临一个奇怪的问题,我似乎无法找出其背后的原因/理论/逻辑。如果你看 php 代码,如果我没有那个 else if 语句

else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {        
    $error = true; 
}

验证失败,当用户在 textarea 中键入时仍会发送一封电子邮件。例如,如果用户没有填写姓名、电子邮件和主题,而只填写了评论,它仍然会被发送。但是,一旦我放了 else if 语句,它就解决了问题。

但主要问题是 preg_match。我希望名称字段只允许空格和字母,我希望电子邮件字段只允许电子邮件。所以当我试图把这段代码放进去时,

if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
     $nameError = true;
}

或将其与名称空字段检查结合起来

if (empty($_POST['name']) || (!preg_match("/^[a-zA-Z ]*$/",$name))) {
    $nameError = true;      
} 

它没有正确验证。它的作用是,当用户在名称字段中输入一个数字并填写其他所有内容时,它会显示错误消息以及感谢消息并将其发送到电子邮件,这不是它应该如何工作的。

那么我可以就如何纠正问题获得指导吗?我的编码是否做错了,我也想知道为什么我在 php 中的 else if 语句没有意义,但我需要它来获得正确的验证。

非常感谢您的阅读,在过去的 6 天里一直卡在这个问题上,我真的不知道如何解决这个问题。请帮我。

干杯

【问题讨论】:

  • 保持一致。如果您分配$name = $_POST['name'],则在其余代码中使用$name——继续使用$_POST会令人困惑。
  • 设置$nameError 不做任何事情,其余代码从不检查它。

标签: php forms validation email


【解决方案1】:

改变

else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {
   $error = true;
}       
else {

if (!$nameError && !$emailError && !$subjectError && !$commentError) {

这样,只有在没有重新测试所有内容的情况下没有遇到错误时才会发送电子邮件。

或者,您可以在设置$xyzError 时设置$error = true,并且只测试if (!$error) {

【讨论】:

  • 非常感谢,我结合了这个,只是做了一些编辑,然后把它和代码放在一起,它就可以工作了。非常感谢!
【解决方案2】:

您的第一个问题是因为您从不检查 $nameError$commentError 等...如果您同时设置 $error = true; 或检查所有变量,则可能会丢失 if 语句。

(我个人使用$error,然后在执行此类操作时将消息附加到单个$message 变量中,但这都是个人喜好)

这可能也是第二个问题。你永远不会检查$nameError。此外,如果您将正则表达式更改为:/^[a-zA-Z]+$/,您也不需要仔细检查。 + 而不是 * 表示“1 个或多个字符”。 * 表示“0 个或多个字符”。

对于电子邮件检查,请使用 filter_var()FILTER_VALIDATE_EMAIL。在此处查看文档:http://php.net/filter_Var

【讨论】:

    【解决方案3】:

    试试这个。

    我进行了以下更改:

    • 在验证之前修剪值。
    • 在验证检查中使用从$_POST 分配的变量。
    • 使用我将错误附加到的单个 $error 变量。
    • 在正则表达式中使用+ 而不是*,这样它就不会匹配空值,我们也不需要显式的empty() 检查。还可以使用i 修饰符使其不区分大小写,而不是A-Za-z
    • 重要部分:我在最后修复了else if 逻辑。如果评论不为空,您只是在执行所有 empty() 检查。
    <?php
    $name = trim($_POST['name']);
    $email = trim($_POST['email']);
    $subjectTitle = trim($_POST['subjectTitle']);
    $comment = trim($_POST['comment']);
    
    $errormsg = "Invalid Entry";
    $validmsg = "Thank you for your message";
    $error = '';
    
    if($_POST['submit']) {
    
        if(!preg_match('/^[a-z ]+$/i', $name)) {
            $error .= 'Name missing or incorrect<br>';
        } 
    
        if(empty($email)) {
            $error .= 'Missing email<br>';
        }
    
        if(empty($subjectTitle)) {
            $error .= 'Missing title<br>';
        }
    
        if(empty($comment)) {
            $error .= 'Missing comment<br>';
        }
    
        if ($error) {
            echo $error;       
        } else {
            $to = "EMAIL_ADD_GOES_HERE";
    
            $subject = "Contact Form Enquiry";
    
            $messages = "\r\n Name: $name \r\n Email: $email \r\n Subject: $subjectTitle \r\n Comments: $comment";
            $headers = "From:" . $name;
            $mailsent = mail($to, $subject, $messages, $headers);
    
            if($mailsent) {
    
                $sent = true;
    
                $name = "";        
                $email = "";
                $subjectTitle = "";
                $comment = "";
    
            }
    
        }
    
    }
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多