基本上我有几个需要处理的大表格(提交的很多字段),它们非常相似,但可能会有一两个字段不同。首先,所有字段都被转义并分配给其原始名称的变量(因此$_POST['f_name']
将为$ f_name)。
然后我需要验证数据,必须存在某些必填字段,某些字段匹配(确认密码/电子邮件),某些字段必须通过正则表达式检查。我通过一个很长的if / else语句执行此操作,其中每个失败都有自己的错误消息。
现在我当然希望避免重复这些笨拙的代码,并用一些循环函数替换它,这将更容易编辑和维护。
然而,这会带来一些问题,特别是执行检查和分配单个错误消息。
我很想听听您如何开发此类验证/错误报告功能的建议。
以下是代码的简短版本:
$name = mysqli_real_escape_string($mysqli, $_POST['name']);
$password = mysqli_real_escape_string($mysqli, $_POST['password']);
$password_re = mysqli_real_escape_string($mysqli, $_POST['password_re']);
if ($name == '') :
$data = "Please enter name";
elseif ($password != $password_re) :
$data = "Passwords don't match";
endif;
答案 0 :(得分:2)
首先我会创建一个清理你的帖子阵列的功能。
$clean_post = sanitize($_POST);
function sanitize($input) {
if (is_array($input)) {
foreach($input as $var=>$val) {
$output[$var] = sanitize($val);
}
}
else {
if (get_magic_quotes_gpc()) {
$input = stripslashes($input);
}
$input = cleanInput($input);
$output = mysql_real_escape_string($input);
}
return $output;
}
接下来,我将添加与字段同名的div,并在$ data数组中设置错误变量并删除它们之间的ifs,我个人不喜欢用勺子喂我的表单错误。
if ($name == '')
$data['name'] = "Please enter name";
if ($password != $password_re)
$data['password] = "Passwords don't match";
最后,我将div的内容设置为$ data数组值。
<div><?=$data[name];?></div>
<input type="text" name="name" value="<?=$clean_post[name];?>">
<div><?=$data[password];?></div>
<input type="password" name="password" value="<?=$clean_post[password];?>">
<input type="password" name="password_re" value="<?=$clean_post[password_re];?>">
希望这有帮助
答案 1 :(得分:1)
我不确定这个问题有一种切割方法。以下是我公司解决此问题的方法:
1)正面验证。是的,可以绕过。但是,如果你只是将它作为第一道防线使用它是一个很好的解决方案(我的一些大客户可以接受,包括一个国际银行集团)我喜欢Cedric Dugas' inline validation script的简单性,因为它基本上只是一些每个字段的额外字符。内联验证的另一个巨大好处 - 它允许我们使用一个集中警报区域来处理服务器端验证错误,同时通过css对单个元素进行简单的警报触发,同时大多数内联和警报都被捕获,这对FAR更加用户友好
2)处理“东西”的类我们称之为“垃圾进,垃圾出”它需要一系列后期数据,根据元素名称设置字段,并相应地进行处理。这包括数据清理,验证等。验证的问题在于,除非您具有要验证的通用类型数据,否则您可以进入许多细节,这些细节可能会使代码匆忙。此外,这可能会让您实际上必须在前端执行更多工作,因为您的字段名称必须相应地排队。在我们的案例中,我们处理来自客户的外部网络表单响应,他们不一定理解对字段标准化命名的需求,这可能会让人头疼。
3)“分块”部分。在巨大的形式场景中,我们通过Ajax分阶段提交“分块”提交,以最大限度地减少在一次大提交中对服务器造成的损害。因此,用户更新配置文件信息,提交发生。用户执行背景信息部分,更新发生...等。它并不适用于所有情况,但有些情况可以正常工作......并且它允许在您从头到尾移动时逐步验证。不过,我当然不会为每个问题推荐这种方法。
4)“强迫卫生”听起来很邪恶,对吧?在邮政编码,地址等情况下,您只需修复客户的信息即可。您可以自动获取邮政编码,而不是咆哮丢失的邮政编码,100%的时间都是正确的。这就是Google和USPS的美丽 - 他们比普通用户更自由,更聪明。答案 2 :(得分:-1)
我说在提交任何内容之前,最好使用javascript表单验证器在客户端执行此操作。搜索javascript表单验证。它会为您节省页面负载并强制您的用户在提交之前纠正错误。这是一个简单的单向示例,取自第一个谷歌热门“javascript表单验证”:
<form name="myForm" action="demo_form.asp" onsubmit="return validateForm()" method="post">
First name: <input type="text" name="fname">
<input type="submit" value="Submit">
</form>
<script language="javascript">
function validateForm()
{
var x=document.forms["myForm"]["fname"].value
if (x==null || x=="")
{
alert("First name must be filled out");
return false;
}
}
</script>