PHP表单验证不起作用

时间:2017-11-23 22:29:30

标签: php html forms validation phpmailer

我是PHP和JavaScript的新手,只是学习Web开发,我在空闲时间尝试各种各样的事情,但是,有一件事我找不到解决方案。 我有一个表格,只收集4个数据,名称,出生日期,电子邮件和电话号码。进一步的数据处理需要所有字段。我真的尝试过在Google上找到的每一件事,但它仍然不起作用。表单只是将所有类型的数据保存到数据库中,而不检查输入字段。

稍后我想要验证表单的代码,在同一页面上显示任何错误,而不是在另一个“.php”上,并发送2封电子邮件作为对此人的确认,一封用于通知我表格提交。我应该做什么/改变以实现这一目标?我觉得自己很困惑。

我的表格:

<form class="contactform" id="cfrm" action="process.php" method="post">
    <div class="f-data">
        <input class="f-error" name="uname" placeholder="NAME" type="text" required="required" data-error="Name is required.">
    </div>
    <div class="clear"></div>
    <div class="f-data">
        <select name="birthday" id="forminput" aria-required="true" aria-invalid="false">
            <option value="11">11</option>
            <option value="12">12</option>
        </select>
        <select name="birthyear" id="forminput" aria-required="true">
            <option value="1900" selected="selected">1900</option>
            <option value="2001">2001</option>
        </select>
    </div>

    <div class="f-data">
        <input class="f-error" name="uemail" placeholder="EMAIL" type="text" required="required" data-error="Email is required.">
    </div>

    <div class="f-data">
        <input class="f-error" name="uphone" placeholder="PHONE" type="text" required="required" data-error="Phone is required.">
    </div>

    <div class="clear"></div>

    <div class="submit">
        <p>
            <input type="submit" value="submit" name="submit">
        </p>
    </div>

和process.php

<?php

require "connection.php";
require "others/phpmailer/PHPMailerAutoload.php";

//form data
$connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
$Name = $connection->real_escape_string($_POST['uname']);
$DoB = $connection->real_escape_string($_POST['birthyear'] . '-' . 
$_POST['birthmonth'] . '-' . $_POST['birthday']);
$inputDoB = date("Y-m-d",strtotime($DoB));
$Email = $connection->real_escape_string($_POST['uemail']); 
$Phone = $connection->real_escape_string($_POST['uphone']);

if (strlen($agree) == 0) $agree = 0;

// validating
if(isset($_POST['submit']));
{ 
    if(empty($_POST['uname']))
    {  
        $msg_name = "You must enter name";  
        $name_subject = $_POST['uname'];  
        $name_pattern = '/^[a-zA-Z ]*$/';  
        preg_match($name_pattern, $name_subject, $name_matches);  
        if(!$name_matches[0])  
            $msg2_name = "Only alphabets and white space allowed";  
        }

        if(empty($_POST['uemail']))
        { 
            $msg_email = "You must enter your email";  
            $email_subject = $_POST['uemail'];  
            $email_pattern = '/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/';  
            preg_match($email_pattern, $email_subject, $email_matches);  
            if(!$email_matches[0]) $msg2_email = "Must be a valid email address";
        }  

        if($_POST['uphone'])  
        {  
            $phone = $_POST['uphone'];  
            preg_match('/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z {2,3})$/i', $phone, $phone_match);  
            if(!$phone_match[0]) $msg_phone = "Must be a valid phone number";   
            if(strlen($phone)!='8') $msg2_phone = "Must be at least 8 characters long";  
        }  
    }
    //save to db
    $query = "INSERT INTO form (Name,DoB,Email,Phone,Date) VALUES ('$Name','$DoB','$Email','$Phone', CURRENT_TIMESTAMP)";

    $success = $connection->query($query);

    if (!$success) {
        die("Couldn't enter data: ".$connection->error);
    }

    echo "Thank You For Contacting Us";

?>

2 个答案:

答案 0 :(得分:1)

至于你的内联错误消息的显示,我建议做的只是使用一个页面来处理主窗体'logic',而另一个include()来表示窗体本身的原始HTML标记。 “逻辑”页面是您将访问者定位为“表单”的位置。

if(isset($_POST['submit']))内,您将检查提交的数据。如果有效,则继续处理提交。如果它无效,则引发错误,然后再次显示该表单。默认情况下也会显示该表单。

这在以下半伪代码中显示:

$error = ''; // Nothing is wrong at first
if(isset($_POST['submit'])) {
  // Raise error messages based on submission
  if(empty($_POST['uname'])) {  
    $error = "You must enter name";
  }
  if(empty($_POST['email'])) {  
    $error = "You must enter email";
  }

  // Show the form if there are errors
  if ($error) {
    include('form.php');
  }
  // Process the submission if there aren't
  else {
    //$query = ...
    mail($Email, $email_subject, $msg_email);
  }
}
else {
  include('form.php');
}

form.php有条件地检查$error

<?php
if ($error !== '') {
  // Output the error message in a fancy way
  echo "<span class='error'>" . $error . "</span>";
}
?>
<form> ... </form>

至于发送这两封电子邮件,你几乎就在那里!您已经拥有$msg_email$email_subject$Email。您只是想利用PHP的 mail() 功能:

mail($Email, $email_subject, $msg_email);

请注意,您可能还想在其中添加第四个参数(标题)。

我还注意到你目前在if(isset($_POST['submit']));{中有一个分号,这会阻止阻止触发。请务必将其删除。

希望这有帮助! :)

答案 1 :(得分:0)

虽然为了问题清晰而格式化代码,但我认为我发现了问题。

您有2个格式问题会导致此类问题。

1)你有一个分号,阻止你的if成为阻止条件

if(isset($_POST['submit']));

使用该分号,块将分开运行,只是作为范围分隔符。

2)你的正则表达式还没有完成

preg_match('/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z {2,3})$/i', $phone, $phone_match);  

在您的上一个捕获论坛(.[a-z {2,3})中,[a-z]字符选择器的结束方括号不应为(.[a-z]{2,3})

我还要指出您正在设置$msg_name$msg2_name,但我不会在任何地方看到它们使用,并且您不会因错误而停止执行,因此该过程会继续通过查询,即使你说你希望它停止。