初学者正在努力学习PHP表单验证

时间:2017-05-03 14:24:48

标签: javascript php jquery forms validation

过去几周我一直在学习PHP,并且在我的阅读方面有点匆匆忙忙地尝试从头开始创建一个表单并在实践中找出逻辑。

我正在尝试使用PHP验证表单数据(最初在这里使用'name'字段开始),然后将用户发送到“提交成功”页面(并将数据发送到服务器)。

到目前为止,我已经设法通过将 action =“” - 这样的空白设置为表格验证工作(而不是使用 PHP_SELF ,我读过的是安全风险),但这里的问题是,即使正确填写表格,它也不会去任何地方,因为没有设置任何行动。

相反,我已设法将用户发送到“提交成功”页面,其中包含 action = handler.php - 但这样做会忽略我的PHP表单字段验证代码。

我觉得我在这里遗漏了一些非常明显的东西,因为我不确定如何将用户发送到“提交成功”页面结合PHP验证,并将数据存储在某处。

我的 capture.php 表单页面顶部的PHP显示为:

<?php

$name_error = '';

if(isset($_POST["submit"]))  
{  
  if(empty($_POST["name"]))  
  {  
       $name_error = "Please Enter Name";  
  }  
  else  
  {  
       if(!preg_match("/^[a-zA-Z ]*$/", $_POST["name"]))  
       {  
            $name_error = "Only Letters and whitespace";  
       }  
   }    
}  
?>

- 这会扩展到及时包含其他类型的表单字段。

capture.php 中的html:

<body class="capture">

<!--action code #1-->
<form action="" method="post" enctype="multipart/form-data">
<!--action code #2-->
<!--<form action="handler.php" method="post" enctype="multipart/form-data">-->

  <div class="col-lg-6 col-md-6 col-sm-6">
<div class="form-inline">
<div class="form-group">

<label for="name">Your name<span class="text-danger">*</span></label><br/>
<input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70" />  
<span class="text-danger"><?php echo $name_error; ?></span> 

</div>
</div>
</div>

 <div class="col-lg-6 col-md-6 col-sm-6">
  <div class="form-group">

 <label for="games">Your choice</label>
 <select class="form-control" name="games">
  <option> -- </option>
  <option>1</option>
  <option>2</option>
  <option>3</option>
  <option>4</option>
  </select>

  </div>
  </div>

<div class="col-lg-6 col-md-6 col-sm-6">
    <input id="btn-prev" name="prev" type="prev" value="Prev">
    </div>
    <div class="col-lg-6 col-md-6 col-sm-6">
<input id="btn-next" name="submit" type="submit" value="Next"></div>

感谢您提供的任何帮助

5 个答案:

答案 0 :(得分:1)

我认为它正在运行您的代码,只有您错过了结束表单标记。试试这段代码。我使用相同的页面操作所以在capture.php页面中所有代码如果你想设置动作handler.php然后在handler.php中添加php代码,如果错误然后将其重定向到capture.php并使用session或获取para meter来显示错误

<?php

$name_error = '';

if (isset($_POST["submit"])) {
    if (empty($_POST["name"])) {
        $name_error = "Please Enter Name";
    } else {
        if (!preg_match("/^[a-zA-Z ]*$/", $_POST["name"])) {
            $name_error = "Only Letters and whitespace";
        }
    }
}
?>
<!--action code #1-->
<form action="" method="post" enctype="multipart/form-data">
    <!--action code #2-->
    <!--<form action="handler.php" method="post" enctype="multipart/form-data">-->

    <div class="col-lg-6 col-md-6 col-sm-6">
        <div class="form-inline">
            <div class="form-group">

                <label for="name">Your name<span class="text-danger">*</span></label><br/>
                <input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70"/>
                <span class="text-danger"><?php echo $name_error; ?></span>

            </div>
        </div>
    </div>

    <div class="col-lg-6 col-md-6 col-sm-6">
        <div class="form-group">

            <label for="games">Your choice</label>
            <select class="form-control" name="games">
                <option> --</option>
                <option>1</option>
                <option>2</option>
                <option>3</option>
                <option>4</option>
            </select>

        </div>
    </div>

    <div class="col-lg-6 col-md-6 col-sm-6">
        <input id="btn-prev" name="prev" type="prev" value="Prev">
    </div>
    <div class="col-lg-6 col-md-6 col-sm-6">
        <input id="btn-next" name="submit" type="submit" value="Next"></div>
</form>

如果您想在handler.php文件中提交表单,请使用此代码

<?php
session_start();
?>
<body class="capture">

    <!--action code #1-->
    <form action="handler.php" method="post" enctype="multipart/form-data">
        <!--action code #2-->
        <!--<form action="handler.php" method="post" enctype="multipart/form-data">-->

        <div class="col-lg-6 col-md-6 col-sm-6">
            <div class="form-inline">
                <div class="form-group">

                    <label for="name">Your name<span class="text-danger">*</span></label><br/>
                    <input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70"/>
                    <?php if (isset($_SESSION['form_error']['name'])) { ?>
                        <span class="text-danger"><?php echo $_SESSION['form_error']['name']; ?></span>
                        <?php
                    } ?>
                </div>
            </div>
        </div>

        <div class="col-lg-6 col-md-6 col-sm-6">
            <div class="form-group">

                <label for="games">Your choice</label>
                <select class="form-control" name="games">
                    <option>--</option>
                    <option>1</option>
                    <option>2</option>
                    <option>3</option>
                    <option>4</option>
                </select>

                <?php if (isset($_SESSION['form_error']['game_error'])) { ?>
                    <span class="text-danger"><?php echo $_SESSION['form_error']['game_error']; ?></span>
                    <?php
                } ?>

            </div>
        </div>

        <div class="col-lg-6 col-md-6 col-sm-6">
            <input id="btn-prev" name="prev" type="prev" value="Prev">
        </div>
        <div class="col-lg-6 col-md-6 col-sm-6">
            <input id="btn-next" name="submit" type="submit" value="Next"></div>
    </form>
    <?php
    unset($_SESSION['form_error']);
     ?>

然后这是你的hanlder.php

<?php
session_start();
$name_error = array();

if (isset($_POST["submit"])) {
    if (empty($_POST["name"])) {
        $name_error['name'] = "Please Enter Name";
    } else {
        if (!preg_match("/^[a-zA-Z ]*$/", $_POST["name"])) {
            $name_error['name'] = "Only Letters and whitespace";
        }
    }

    if ($_POST["games"] == '--') {
        $name_error['game_error'] = "Please Select Game";
    }
}
if (!empty($name_error)) {
    $_SESSION['form_error'] = $name_error;
    header("Location: capture.php");
}

?>

答案 1 :(得分:0)

Just set the action of the form to capture.php As this is where your php is at work, validating the form, this is where you want to send it!

If you want to redirect after the validation you can redirect to another page using header

header('Location: handler.php');

答案 2 :(得分:0)

您可以将操作放回handler.php并将您在capture.php中的验证放在handler.php的顶部。

capture.php

    <body class="capture">

    <!--action code #1-->
    <form action="handler.php" method="post" enctype="multipart/form-data">
    <!--action code #2-->
    <!--<form action="handler.php" method="post" enctype="multipart/form-data">-->

      <div class="col-lg-6 col-md-6 col-sm-6">
    <div class="form-inline">
    <div class="form-group">

    <label for="name">Your name<span class="text-danger">*</span></label><br/>
    <input class="form-control" type="text" placeholder="e.g. Joe Bloggs" name="name" maxlength="70" />  
     <?php
     if(isset($_GET["name_error"])) { ?>  
        <span class="text-danger"><?php echo $name_error; ?></span> 
      <?php } ?>

    </div>
    </div>
    </div>

     <div class="col-lg-6 col-md-6 col-sm-6">
      <div class="form-group">

     <label for="games">Your choice</label>
     <select class="form-control" name="games">
      <option> -- </option>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      </select>

      </div>
      </div>

    <div class="col-lg-6 col-md-6 col-sm-6">
        <input id="btn-prev" name="prev" type="prev" value="Prev">
        </div>
        <div class="col-lg-6 col-md-6 col-sm-6">
    <input id="btn-next" name="submit" type="submit" value="Next"></div>

<强> Handler.php

<?php

$name_error = null;

if(isset($_POST["submit"]))  
{  
  if(empty($_POST["name"]))  
  {  
       $name_error = "Please Enter Name";  
  }  
  else  
  {  
       if(!preg_match("/^[a-zA-Z ]*$/", $_POST["name"]))  
       {  
            $name_error = "Only Letters and whitespace";  
       }  
   }    
  if($name_error != null) {
     header("Location: capture.php?message=".$name_error.");
}  
?>

我更改了验证,因此您的邮件会发送回您的表单。在那里它检查是否设置了错误消息,如果是,它将显示错误。

答案 3 :(得分:0)

在您完成表单验证后,使用标题重定向将用户发送到感谢页面

if(!preg_match("/^[a-zA-Z ]*$/", $_POST["name"]))  
{  
   $name_error = "Only Letters and whitespace";  
} else {
   // no errors - redirect to success page
   header('Location:./handler.php');
}

验证后会重定向用户。 只有在验证成功时才允许运行。

执行重定向也意味着页面重新加载不会重新提交表单。

您应该仔细查看PHP清理和验证过滤器,以清理和检查表单输入。

http://php.net/manual/en/filter.filters.sanitize.php
http://php.net/manual/en/filter.filters.validate.php

如果您计划将名称存储在数据库中,请特别注意学习如何避免SQL注入(https://www.w3schools.com/sql/sql_injection.asp

答案 4 :(得分:0)

务必让您的表单识别您要提交的操作文件。 按照它的样子编辑它: