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

时间:2010-02-08 19:01:20

标签: php validation forms

我在确定如何在验证失败时保留用户数据时遇到问题。我对PHP有点新意,所以我可能在我的逻辑中犯了一些大错。

目前,如果验证失败,则清除所有字段并且$ _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>




 }

5 个答案:

答案 0 :(得分:2)

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

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

但是,我认为第一种解决方案更好。

<强>更新

编辑使您的代码更清晰,所以我注意到了一些东西。您的输入字段在HTML中称为UserName,但您指的是PHP中的Name。这可能就是它无法正常工作的原因。您的字段是否始终填充值NOTHING?确保输入字段的名称和您在$_POST中使用的下标是相同的。

此外,如果您有错误,则无需重定向到另一个页面(使用标题)。维护$errors数组或变量以在同一页面中打印错误消息。但是就像我之前提到的那样,使用JSON方法可能更好,从那时起你可以将视图层(html)与PHP(控制器层)分开。因此,您将HTML放在一个文件中,将PHP放在另一个文件中。

答案 1 :(得分:1)

修改

Vivin评论说我对header的假设是不正确的,他是对的。更进一步看起来OP正在做的事情基本上是我在下面列出的,虽然结构不那么结构化。进一步的Vivin - 抓住了这里的实际问题 - html名称和数组键$ _POST不匹配。


由于您使用header重定向到另一个页面,因此擦除了干净。通常你会有一个页面验证数据,如果确定对它做了什么,并返回某种类型的成功视图,或者返回一个错误视图,直接再次显示该表单。通过使用header,您实际上将浏览器重定向到另一个页面(即启动一个全新的请求)。

例如:

// 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> 

答案 2 :(得分:0)

可以执行类似于失败的操作然后返回值= $ _ POST ['value']

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

答案 3 :(得分:0)

好的,首先header("Location: index.php?msg=$err");并不是真的需要。最好不要在出错时重定向,但在同一页面上显示错误。此外,重定向就像这样意味着您丢失了表单中的所有帖子数据,因此您永远不会将其打印回输入。

您需要做的是:

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

这里我正在检查是否存在任何错误,然后是否设置了$usr_email变量。如果这两个条件都匹配,则后期数据将打印在字段的value属性中。

我使用函数htmlentities()的原因是因为否则用户可以将恶意代码注入页面。

答案 4 :(得分:0)

您似乎正在处理与表单相同的页面上的帖子。这是一种做事的好方法,这意味着你几乎就在那里。如果您的验证成功,您所要做的就是重定向,但如果验证失败则不需要。喜欢这个

<?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>