Php 数据验证失败时在表单字段中保留值

Php 数据验证失败时在表单字段中保留值,php,validation,forms,Php,Validation,Forms,当验证失败时,我很难确定如何保留用户数据。我对PHP有些陌生,所以我可能在逻辑上犯了一些大错误 当前,如果验证失败,所有字段都将被清除,$\u Post数据也将消失 下面是一些代码,假设用户输入了无效的电子邮件,我希望保留名称字段。此代码不起作用 <?php if($_POST['doSubmit'] == 'Submit') { $usr_name = $data['Name']; $usr_email = $data['Email']; if (isEmail($

当验证失败时,我很难确定如何保留用户数据。我对PHP有些陌生,所以我可能在逻辑上犯了一些大错误

当前,如果验证失败,所有字段都将被清除,$\u Post数据也将消失

下面是一些代码,假设用户输入了无效的电子邮件,我希望保留名称字段。此代码不起作用

<?php
if($_POST['doSubmit'] == 'Submit') {

   $usr_name = $data['Name'];
   $usr_email = $data['Email'];

   if (isEmail($usr_email)==FALSE){
       $err = "Email is invalid.");
       header("Location: index.php?msg=$err");
       exit();
    }

   //do whatever with data

}

if (isset($_GET['msg'])) {
   $msg = mysql_real_escape_string($_GET['msg']);
   echo "<div class=\"msg\">$msg</div><hr />";
}
if (isset ($_POST['Name'])){
   $reusername = $_POST['Name'];}
else{$reusername = "NOTHING";}//to test

 ?>
 <form action="index.php" method="post" >
 <input name="UserName" type="text" size="30" value="<?echo $reusername;?>">
 <input name="Email" type="text" size="30">
 <input name="doSubmit" type="submit" value="submit">
 </form>




 }

您可以使用AJAX将表单数据提交到PHP脚本,并让它返回指定验证是否成功的JSON数据。这样,你的田地就不会被擦干净

另一种方法是将记录的参数发送回发布页面,并在发布页面中使用PHP填充字段

然而,我认为第一种解决办法更好

更新

编辑使你的代码更清晰,所以我注意到了一些东西。您的输入字段在HTML中称为
UserName
,但在PHP中指的是
Name
。这可能就是它不起作用的原因。您的字段是否总是填充值
NOTHING
?确保输入字段的名称与您在
$\u POST
中使用的下标相同

此外,如果您有错误,也不需要重定向到另一个页面(使用页眉)。维护
$errors
数组或变量,以便在同一页面中打印错误消息。但正如我前面提到的,使用JSON方法可能更好,因为这样可以将视图层(html)与PHP(控制器层)分开。因此,您可以将HTML放在一个文件中,将PHP放在另一个文件中。

EDIT

Vivin评论说我关于
标题的假设是不正确的,他在这方面是正确的。更进一步,OP所做的看起来基本上就是我在下面展示的内容,尽管是以一种不太结构化的方式。进一步Vivin-发现这里可能存在的实际问题-html名称和数组键$\u POST不匹配


因为您正在使用
标题
重定向到另一个页面,所以它被清除了。通常,您会有一个单独的页面来验证数据,如果ok对数据进行了处理并返回某种类型的成功视图,或者返回一个错误视图,直接再次显示表单。使用
标题
实际上是将浏览器重定向到另一个页面(即启动一个全新的请求)

例如:

//myform.php

  if(strtolower($_SERVER['REQUEST_METHOD']) == 'get')
  {
      ob_start();
      include('form.inc.php'); // we load the actual view - the html/php file
      $content = ob_get_clean();
      print $content;  // we print the contents of the view to the browser
      exit;
  }
  elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post')
  {
     $form = santize($_POST); // clean up the input... htmlentities, date format filters, etc..
     if($data = is_valid($form))
     {
       process_data($data); // this would insert it in the db, or email it, etc..
     }
     else
     {
        $errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form
        ob_start();
        include('form.inc.php'); // we load the actual view - the html/php file
        $content = ob_get_clean();
        print $content;  // we print the contents of the view to the browser
        exit;

     } 
   }
因此,这假设您的
form.inc.php
总是将错误消息的输出编码到其中-它只是不显示它们。因此,在此文件中,您可能会看到如下内容:

<fieldset>
  <label for="item_1">
    <?php echo isset($error['item_1']) ? $error['item_1'] : null; ?>
    Item 1: <input id="item_1" value="<?php echo $form['item_1'] ?>" />
  </label>
</fieldset> 


第1项:可以执行类似的操作,如果失败,那么value=$\u POST['value']

但维文的答案是最好的。我对AJAX了解不多,也无法管理它。

好的,首先是
标题(“Location:index.php?msg=$err”)实际上不是必需的。最好的做法是不要在出错时像这样重定向,而是在同一页上显示错误。另外,像这样重定向意味着表单中的所有post数据都将丢失,因此永远无法将其打印回输入

您需要做的是:

<input name="Email" type="text" size="30" value="<?php print (!$err && $usr_email ? htmlentities($usr_email, ENT_QUOTES) : '') ?>">

您似乎正在处理表单所在页面上的帖子。这是一种很好的做事方式,它意味着你就快到了。如果验证成功,您所要做的就是重定向,但如果验证失败,则不必重定向。像这样

<?php
if( isset( $_POST['number'] ) ) {
    $number = $_POST['number'];
    // validate
    if( $number < 10 ) {
        // process it and then;
        header('Location: success_page.php');
    } else {
        $err = 'Your number is too big';
    }
} else {
    $number = '';
    $err = '';
}

?>


<form method="POST">
    Enter a number less than 10<br/>
    <?php echo $err ?><br/>
    <input name="number" value="<?php echo $number ?>"><br/>
    <input type="submit">
</form> 

输入一个小于10的数字


你能提供一些关于它如何不工作的细节吗?+1-很好地抓住了html->php在字段名称中的差异。用户名混淆只是我把一些东西拼凑在一起。但你和大多数评论都回答了我的问题。