我想知道实体表单验证的最佳方法是什么
JavaScript做了一个很好的jon,但它不是一个可靠验证的基础,因为它可以被操纵甚至禁用。
如果你用PHP检查数据,并在出现错误时重新填充表单,那么发布表单会有几个问题。
- 如果表单在没有重定向的情况下显示,那么如果用户想重新发送数据,F5将显示一个确认框,这并不是很好
- 如果用户再次重定向到表单,则数据必须由
GET
或POST
提交。对于POST
,再次存在如上所述的F5问题。对于GET
,当传递内部有&
的值时会出现问题(PHP在符号后面猜测另一个参数) - 第三种方法是将数据存储在数据库中,例如提交或类似的东西。但是,在重定向之后,您实际上必须清除数据
另一个问题是表单本身的重新填充:像这样的代码:
echo "<input type='text' value='".$val."' />";
如果变量$val
包含一个包含撇号的值,则会生成无效的HTML。
正如您所看到的,在表单验证场景中有很多失败的可能性。如顶部所述,处理表单验证的最可靠方法是什么?
服务器端语言是验证表单的唯一方法。出于同样的目的,您可以将表单数据存储在会话或cookie中。您可以在完成验证后对其进行刷新。如果数据中的引号有问题,那么可以使用PHP内置函数addslashes()
和stripslashes()
来避免它们。
您的三个要点,一个接一个:
- 是的,这是正确的,不,它不是很优雅。但正如你所说:重定向解决了这个问题。所以重定向
- 不,将安培数转换为
&
应该不会有问题 - 为什么要使用数据库来存储这样的数据?会话有什么问题?或者,如果需要的话:一块饼干
在继续:重定向以避免出现确认框时,如果您需要在服务器端存储一些提交的数据,并将"与"符号转换为它们的html实体,则可以使用会话,并且一切就绪
转换&
可以这样实现:
var tmpDiv = document.createElement('div');
tmpDiv.innerText = '&';
var entity = tmpDiv.innerHTML;//returns &
我有一些解决方案。
-
您需要将用户重定向到同一页面并释放帖子数据。
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 */){ }
通过这种方式,您可以避免在刷新时重新发送数据。
-
使用$_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