处理很多领域
基本上我有几个大的形式(提交的领域很多),需要处理,这是非常相似,但可能会有一个或两个领域的差异。首先,所有字段都会被转义并分配给它们原始名称的变量(因此$_POST['f_name']
将为$ f_name)。 然后我需要验证数据,像某些必填字段必须存在,某些字段很匹配(确认密码/电子邮件),某些字段必须通过正则表达式检查。我通过一个long 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;
首先我会做一个函数来清洁您的帖子阵列。
$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;
}
接下来我将与同名的$ data数组中的字段,并设置错误变量的div添加和删除它们之间的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];?>">
希望这有助于
我会说这是更好地做到这一点上使用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>
您不能依赖客户端验证,因为它可以被绕过。作为一个事实,你必须验证服务器端,这只是一个效率的问题... – 2011-03-21 12:26:50
我不知道,有一个切割和干燥的方法解决这个问题。以下是我公司如何解决此问题的方法:
1)正面验证。是的,可以绕过。但是,如果你只使用它作为防御的第一线这是一个很好的解决方案(和可以接受我的一些最大的客户包括国际银行集团),我爱的Cedric Dugas' inline validation script简单,因为它基本上只是每场一些额外的字符。另一个巨大的好处内嵌验证 - 它使我们能够使用服务器端验证错误,一个集中的警戒区通过对单个元素的CSS一个简单的警报触发沿,而大多数的在线捕获并警告这是更为人性化。
2)以“东西”交易类我们把它称为“垃圾进,垃圾出”这需要后一组数据,都将根据元素名称相应的字段,和交易。这包括数据消毒,验证等方面与验证的问题是,除非你有泛型类型的数据来验证,你可以进入很多细节的这才能真正着急起来胶代码。此外,这可能会让您实际上必须在前端执行更多工作,因为您的字段名称必须相应排列。在我们的案例中,我们处理来自客户的外部Web表单响应,这些响应不一定需要标准化字段名称,这可能会让人头疼。
3)“分块”部分。在巨大的表单场景中,我们通过Ajax逐步“分块”提交,以最大限度地减少在一次大提交中完成的对服务器的损害。所以,用户更新配置文件信息,提交发生。用户做背景信息部分,更新发生...等。这对所有情况都是不正确的,但它有一些可以很好地工作......并且它允许从头到尾移动进行逐步验证。不过,我当然不会为每个问题推荐这种方法。
4)“强迫卫生”听起来很邪恶,是吧?在诸如邮政编码,地址等情况下,您可以简单地修复客户端的信息。而不是咆哮一个缺少的邮编,你可以自动得到它,纠正100%的时间。这就是Google和USPS的美妙之处 - 它们比普通用户更*,更智能。
感谢你,非常有见地。 – 2011-03-22 11:34:57
使用PHP短标签从来不是一个好主意。 – 2011-03-21 00:50:42
还不错,sanitize函数的问题是,我仍然必须将每个POST分配给一个同名的var,仍然试图找出如何避免这种情况。 – 2011-03-21 12:51:36
@nick rulez:短标签在视图中使用时可显着提高可读性,并且唯一的问题是可移植性降低,如果您控制服务器,这对您来说不是问题。 – notJim 2011-03-21 22:54:14