2012-07-02 61 views
0

在我的PHP Web应用程序中,我通常使用自定义函数验证用户输入,如果输入与验证条件不匹配,则返回NULL;如果验证条件满足,则返回原始输入值。因此,一个基本的流程会是这个样子:返回NULL用于输入验证

$user_input = $_POST['fieldname']; 
$user_input = validation_function($user_input); 

if (isset($user_input)) { 
    // do stuff 
} 

关于这样做的好处是,我可以采取任意数量的用户输入,对其进行验证,然后将它们粘到isset()功能参数,因为isset()函数需要可变数量的参数。

现在,我一直在阅读很多有关NULL返回是否很糟糕的问题,并且这个问题"Is returning null bad design?"有一个很好的答案,基本上声明“不返回null的基本原理是您不必检查因此,因此您的代码不需要遵循基于返回值“”的不同路径。我理解这在应用程序的内部工作中是如何有益的,但是如何将此原则应用于输入验证?

问题的关键是,我如何处理输入验证,而不必像上面提供的代码示例那样返回NULL?

回答

0
if(isset($user_input)) 
{ 
$flg = true; 
} 
if($flg) 
{ 
//do stuff 
} 

我想这就是你要找的。你可以设置一个变量true和false作为我的验证方式。

0

对于输入验证,我总是返回原始值,然后以某种方式将该字段标记为无效。这是因为我通常希望显示每个字段的验证错误消息。而不是一个函数,我会用一个类来跟踪所有这些要容易得多。

如果您对该方法感兴趣,请查看Zend_FormZend_Validate如何协同工作来为用户输入提供可扩展验证界面。

0

从baig772的回答得出稍微更紧凑的方式:

if(validation_function($user_input)) 
{ 
// do stuff 
} 

validation_function()返回一个布尔值,并基于该决定做什么。无需isset()。您当然可以在该块中设置标志,并稍后在代码中使用这些标志。 isset()允许您添加混合变量,但可以根据输入类型假设需要不同的验证函数。所以,你可以去这样的:

if(validation_function_fname($first_name) && validation_function_email($email)) 
{ 
//do stuff 
} 

或者,像这样:

所有的
$name_ok = validation_function_fname($first_name); 
$email_ok = validation_function_email($email); 

if($name_ok && $email_ok) 
{ 
// do stuff 
} 
1

首先,不要使用isset这样,你滥用它。

 if at all, use isset here, because 
    this variable *may* actually not be set 
       vvvvvvvvvvvvvvvvvvv 
$user_input = $_POST['fieldname']; 

if (isset($user_input)) { 
    ^^^^^^^^^^^^^^^^^^ 
do not use isset here, because 
this variable is definitely set 

isset具有特定目的并用于正确的错误处理/抑制。如果您以这种方式使用isset,您只能通过抑制错误输入变量的错误报告来让您的生活更加艰难。

然后,你应该推广你的代码。制作一组您想要验证的字段。在该阵列上运行循环,标记字段truefalse。找出是否所有的字段都是真的。

$validate = array_fill_keys(array('firstname', 'lastname', ...), null); 

foreach ($validate as $field => &$valid) { 
    // your validation logic here! 
    $valid = !empty($_POST[$field]) ? $_POST[$field] : false; 
} 

if (array_filter($validate, function ($i) { return $i === false; })) { 
    die('Some fields are invalid!'); 
} 

这是一个简单的骨架。您可以扩展此设置,以便为阵列中的失败字段设置单独的错误消息,个人验证规则等。

+0

有趣,谢谢。我看到你已经写了一篇关于isset正确使用的非常好的帖子,并没有链接到它。推荐阅读其他人:http://kunststube.net/isset –