PHP预匹配表单验证

PHP预匹配表单验证,php,forms,validation,email,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 yo

我的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 = "";                          
        }           
    }   
}
?>
验证失败,当用户在文本区域键入时,仍将发送电子邮件。例如,如果用户不填写姓名、电子邮件和主题,而只填写评论,则仍会发送评论。然而,一旦我使用elseif语句,它就解决了问题

但主要问题是,赛前准备。我希望名称字段只允许空格和字母,我希望电子邮件字段只允许电子邮件。所以当我试着把这个代码放进去的时候

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天里我一直在关注这个问题,我真的不知道如何解决这个问题。请帮帮我

干杯

改变

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

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

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

更改时测试

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

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


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

您的第一个问题是,您从未检查过
$nameError
$commentError
等…如果设置
$error=true;
或检查所有变量,则可能会丢失if语句

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

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


对于电子邮件检查,请将
filter\u var()
filter\u VALIDATE\u email
一起使用。请参阅此处的文档:

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

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

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

对于电子邮件检查,请将
filter\u var()
filter\u VALIDATE\u email
一起使用。请参阅此处的文档:

尝试此操作

我做了以下更改:

  • 在验证之前修剪值
  • 在验证检查中使用从
    $\u POST
    分配的变量
  • 使用我附加错误的单个
    $error
    变量
  • 在正则表达式中使用
    +
    而不是
    *
    ,这样它将不匹配空值,并且我们不需要显式的
    empty()
    检查。还可以使用
    i
    修饰符使其不区分大小写,而不是
    A-Za-z
  • 最重要的部分是:我在最后修改了
    else if
    逻辑。你只做了
    empty()
    检查注释是否为空

试试这个

我做了以下更改:

  • 在验证之前修剪值
  • 在验证检查中使用从
    $\u POST
    分配的变量
  • 使用我附加错误的单个
    $error
    变量
  • 在正则表达式中使用
    +
    而不是
    *
    ,这样它将不匹配空值,并且我们不需要显式的
    empty()
    检查。还可以使用
    i
    修饰符使其不区分大小写,而不是
    A-Za-z
  • 最重要的部分是:我在最后修改了
    else if
    逻辑。你只做了
    empty()
    检查注释是否为空


保持一致。如果分配
$name=$\u POST['name']
,则在代码的其余部分使用
$name
——继续使用
$\u POST
会让人困惑。设置
$name error
没有任何作用,代码的其余部分永远不会检查它。保持一致。如果分配
$name=$\u POST['name']
,然后在代码的其余部分使用
$name
——继续使用
$\u POST
会让人感到困惑。设置
$nameError
没有任何作用,代码的其余部分从不检查它。非常感谢,我将此组合在一起,只是做了一些编辑,并将其与代码一起使用。非常感谢!非常感谢,我组合在一起了这,只是做了一些编辑,并把这个与代码,它的工作。非常感谢!
else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {
   $error = true;
}       
else {
if (!$nameError && !$emailError && !$subjectError && !$commentError) {