处理很多领域

问题描述:

基本上我有几个大的形式(提交的领域很多),需要处理,这是非常相似,但可能会有一个或两个领域的差异。首先,所有字段都会被转义并分配给它们原始名称的变量(因此$_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];?>"> 

希望这有助于

+0

使用PHP短标签从来不是一个好主意。 – 2011-03-21 00:50:42

+0

还不错,sanitize函数的问题是,我仍然必须将每个POST分配给一个同名的var,仍然试图找出如何避免这种情况。 – 2011-03-21 12:51:36

+0

@nick rulez:短标签在视图中使用时可显着提高可读性,并且唯一的问题是可移植性降低,如果您控制服务器,这对您来说不是问题。 – notJim 2011-03-21 22:54:14

我会说这是更好地做到这一点上使用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> 
+0

您不能依赖客户端验证,因为它可以被绕过。作为一个事实,你必须验证服务器端,这只是一个效率的问题... – 2011-03-21 12:26:50

我不知道,有一个切割和干燥的方法解决这个问题。以下是我公司如何解决此问题的方法:

1)正面验证。是的,可以绕过。但是,如果你只使用它作为防御的第一线这是一个很好的解决方案(和可以接受我的一些最大的客户包括国际银行集团),我爱的Cedric Dugas' inline validation script简单,因为它基本上只是每场一些额外的字符。另一个巨大的好处内嵌验证 - 它使我们能够使用服务器端验证错误,一个集中的警戒区通过对单个元素的CSS一个简单的警报触发沿,而大多数的在线捕获并警告这是更为人性化。

2)以“东西”交易类我们把它称为“垃圾进,垃圾出”这需要后一组数据,都将根据元素名称相应的字段,和交易。这包括数据消毒,验证等方面与验证的问题是,除非你有泛型类型的数据来验证,你可以进入很多细节的这才能真正着急起来胶代码。此外,这可能会让您实际上必须在前端执行更多工作,因为您的字段名称必须相应排列。在我们的案例中,我们处理来自客户的外部Web表单响应,这些响应不一定需要标准化字段名称,这可能会让人头疼。

3)“分块”部分。在巨大的表单场景中,我们通过Ajax逐步“分块”提交,以最大限度地减少在一次大提交中完成的对服务器的损害。所以,用户更新配置文件信息,提交发生。用户做背景信息部分,更新发生...等。这对所有情况都是不正确的,但它有一些可以很好地工作......并且它允许从头到尾移动进行逐步验证。不过,我当然不会为每个问题推荐这种方法。

4)“强迫卫生”听起来很邪恶,是吧?在诸如邮政编码,地址等情况下,您可以简单地修复客户端的信息。而不是咆哮一个缺少的邮编,你可以自动得到它,纠正100%的时间。这就是Google和USPS的美妙之处 - 它们比普通用户更*,更智能。

+0

感谢你,非常有见地。 – 2011-03-22 11:34:57