PHP preg_match表单验证

时间:2014-01-03 01:23:32

标签: php forms validation email

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

这是我的PHP,它高于doctype 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代码,如果我没有其他if语句

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

验证失败,当用户在textarea中键入时,仍会发送电子邮件。例如,如果用户未填写姓名,电子邮件和主题,但仅填写评论,则仍会发送。但是,一旦我将其他if语句,它就解决了问题。

但主要问题是,preg_match。我希望名称字段只允许空格和字母,我希望电子邮件字段只允许电子邮件。所以,当我尝试将此代码放入时,

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

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

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

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

那么我可以就如何解决问题提供指导吗?我的编码是错误地完成的,而且我想知道为什么如果我在php中的语句没有意义,但我需要它来获得正确的验证。

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

干杯

3 个答案:

答案 0 :(得分:2)

变化

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

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

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

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

答案 1 :(得分:2)

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

(我个人使用一个$error,然后在执行这些事情时将消息附加到单个$message变量,但这是所有个人偏好)

这可能是第二个问题。你永远不会检查$nameError。如果您将正则表达式更改为:/^[a-zA-Z]+$/,那么您也不需要进行双重检查。 +代替*表示&#34; 1个或多个字符&#34;。 *表示&#34; 0个或更多字符&#34;。

对于电子邮件检查,请将filter_var()FILTER_VALIDATE_EMAIL一起使用。请参阅此处的文档:http://php.net/filter_Var

答案 2 :(得分:2)

试试这个。

我做了以下更改:

  • 在验证前修剪值。
  • 使用在验证检查中从$_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 = "";

        }

    }

}

?>