PHP preg_match表单验证

问题描述 投票:2回答:3

我的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;      
} 

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

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

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

干杯

php forms validation email
3个回答
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 = "";

        }

    }

}

?>

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) {


2
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.