2017-05-03 74 views
0

我在过去的几周里一直在学习PHP,我承认在我的阅读之前有点尝试从头开始创建一个表单并在实践中计算逻辑。初学者苦于PHP表单验证

我试图在将用户发送到'提交成功'页面(以及数据到服务器)之前,使用PHP验证表单数据(最初从'name'字段开始)。

到目前为止我设法离开行动得到表单验证工作=“” - 空白像这样(而不是使用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> 

感谢所有帮助提供

+1

我认为正在进行验证的页面从不会看到POST数据。将表单验证移动到'handler.php'(在验证错误时重定向)或者将表单元素的'action'设置为''capture.php''。 – amphetamachine

回答

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

+0

真棒谢谢你。另外还要感谢清洁表单输入的链接,这也是我一直在研究的内容。 – Dicky

0

只需设置形式的行动,capture.php 因为这是你的PHP工作,验证表单,这是你想要发送的地方!

如果你想验证后重定向你可以使用header

header('Location: handler.php'); 
1

我认为这是工作你的代码重定向到另一个页面,只有你错过年底的表单标签。试试这个代码。我使用相同的页面动作,所以在capture.php页面中的所有代码,如果你想设置动作handler.php,然后添加php代码在handler.php中,如果错误然后重定向到capture.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"; 
     } 
    } 
} 
?> 
<!--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"); 
} 

?> 
+0

是的,提供你的问题是正确的,丢失的标签会阻止它。 此外,为了扩展它,添加到一个错误数组,然后你可以列出所有未通过验证的项目。 – Brian

+0

检查我的更新回答哪个提交表单到hanlder.php文件并列出所有错误,如果不退出。你可以改变它,如果你想 –

0

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

捕获。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."); 
} 
?> 

我改变了验证所以你的邮件将得到退还到您的表单。在那里它检查是否设置了错误消息,如果是,它将显示错误。

0

务必让你的表格识别您要提交的动作文件。 按如下方式编辑它: