2

我想知道进行可靠表单验证的最佳方法是什么。

JavaScript 做得很好,但它不是可靠验证的基础,因为它可以被操纵甚至禁用。

如果您使用 PHP 检查数据并在发生错误时重新填充表单,则 post 表单存在几个问题。

  • 如果表单显示没有重定向,那么如果用户想重新发送数据,F5会显示一个确认框,这不是很漂亮。
  • 如果用户再次被重定向到表单,则数据必须由GETor提交POST。有了POST,又出现了上面提到的 F5 问题。用GET, 用 inside 传递值时存在问题&(PHP猜测符号后面的另一个参数)
  • 第三种方法是将数据存储在数据库中,例如 SUBMITTRIALS 或类似的东西。但是你实际上必须在重定向后清除数据。

另一个问题伴随着表单本身的重新填充:像这样的代码:

echo "<input type='text' value='".$val."' />";

如果变量$val包含一个包含撇号的值,这是一个很大的问题,这会生成无效的 HTML。

如您所见,在表单验证场景中有很多失败的可能性。如顶部所述,处理表单验证的最可靠方法是什么?

4

4 回答 4

2

服务器端语言是验证表单的唯一方法。出于相同目的,您可以将表单数据存储在会话或 cookie 中。完成验证后,您可以刷新它们。如果您对数据中的引号有疑问,那么您可以使用 PHP 内置函数addslashes()stripslashes()避免它们。

于 2012-09-04T16:09:37.130 回答
1

你的三个要点,一一说明:

  1. 是的,这是正确的,不,它不是很优雅。但正如你所说:重定向解决了这个问题。所以重定向。
  2. 不,将&符号转换为不&amp;应该造成问题
  3. 为什么要使用数据库来存储这样的数据?会话有什么问题?或者,如果需要:饼干?

在恢复:重定向以避免确认框,如果您需要在服务器端存储一些提交的数据并将&符号转换为它们的 html 实体,则使用会话,并且您已准备就绪。
转换&可以这样实现:

var tmpDiv = document.createElement('div');
tmpDiv.innerText = '&';
var entity = tmpDiv.innerHTML;//returns &amp;
于 2012-09-04T11:17:29.970 回答
0

我有一些解决方案给你。

  1. 您需要将用户重定向到同一页面并释放帖子数据。

    header("Location: samefile.php?success=true");//or ?errors[]=blabla
    exit();
    
    if(isset($_GET['success']) && $_GET['success'] == true){
        //handle true
    }else if(/* here you can ask about errors or what ever */){
    
    }
    

    通过这种方式,您可以避免在刷新时重新发送数据。

  2. 使用 $_SESSION 来存储数据而不是数据库。

如果我错了,请纠正我。

于 2012-09-04T11:40:20.343 回答
-2

我正在使用 jquery 表单验证器,效果很好。

在你的头标签中:

<script language="javascript" type="text/javascript" src="/media/js/jquery-latest.js"></script>

<script language="javascript" type="text/javascript" src="/media/js/jquery.validate.min.js"></script>
<script>
  $(document).ready(function(){
    $( "#commentform" ).validate();
  });
</script>

然后使用这样的表格:

  <form id="commentform" action="/index/addcomment" method="POST">

    <p>
      <input type="text" name="Name" id="name" value="" size="22" class="required" minlength="3">
      <label for="name"><em>*</em><?= _("Name") ?></label>
    </p>

    <p>
      <input type="text" name="EMail" id="email" value="" size="22" class="required email">
      <label for="email"><em>*</em><?= _("EMail") ?> <?= _("(will not be published)") ?></label>
    </p>

    <p>
      <input type="text" name="Url" id="url" value="" size="22">
      <label for="url"><?= _("Website") ?></label>
    </p>

    <p>
      <textarea name="Content" id="comment" cols="100%" rows="10" class="required" minlength="5"></textarea>
    </p>

    <p>
      <input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment">
      <input type="hidden" name="BlogId" value="<?= $this->model->BlogId ?>" />
    </p>

  </form>

更多信息:http ://docs.jquery.com/Plugins/Validation

于 2012-09-04T11:08:11.317 回答