PHP和JS中表单验证的最佳方式


Best way for form validation in PHP and JS

我想知道实体表单验证的最佳方法是什么

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

如果你用PHP检查数据,并在出现错误时重新填充表单,那么发布表单会有几个问题。

  • 如果表单在没有重定向的情况下显示,那么如果用户想重新发送数据,F5将显示一个确认框,这并不是很好
  • 如果用户再次重定向到表单,则数据必须由GETPOST提交。对于POST,再次存在如上所述的F5问题。对于GET,当传递内部有&的值时会出现问题(PHP在符号后面猜测另一个参数)
  • 第三种方法是将数据存储在数据库中,例如提交或类似的东西。但是,在重定向之后,您实际上必须清除数据

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

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

如果变量$val包含一个包含撇号的值,则会生成无效的HTML。

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

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

您的三个要点,一个接一个:

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

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

var tmpDiv = document.createElement('div');
tmpDiv.innerText = '&';
var entity = tmpDiv.innerHTML;//returns &amp;

我有一些解决方案。

  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来存储数据,而不是数据库。

如果我错了,请纠正我。

我使用的是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