返回NULL以进行输入验证

时间:2012-07-02 11:35:33

标签: php null validation

在我的PHP Web应用程序中,我通常使用自定义函数验证用户输入,如果输入与验证条件不匹配,则返回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?

4 个答案:

答案 0 :(得分: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!');
}

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

答案 1 :(得分:0)

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

我想这就是你要找的东西。你可以像我的验证方式一样设置变量true和false。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

从baig772的回答中得到的压缩方式稍微强一些:

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

validation_function()返回一个bool并根据该决定做什么。无需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
}