0

在我的 PHP Web 应用程序中,我通常使用自定义函数验证用户输入,如果输入与验证条件不匹配,则返回 NULL,如果满足验证条件,则返回原始输入值。所以一个基本的流程看起来像这样:

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

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

这样做的好处是我可以接受任意数量的用户输入,验证它们,然后将它们isset()作为参数粘贴到函数中,因为isset()函数接受可变数量的参数。

现在,我已经阅读了很多关于 NULL 返回如何不好的内容,以及这个 SO 问题,“返回 null 是错误的设计吗?” 有一个很好的答案,基本上说“不返回 null 背后的理由是您不必检查它,因此您的代码不需要根据返回值遵循不同的路径”。我了解这对应用程序的内部工作有何好处,但是如何将这一原则应用于输入验证?

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

4

4 回答 4

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!');
}

那是一个简单的骨架。您可以扩展它来为数组中的失败字段设置单独的错误消息、单独的验证规则等。

于 2012-07-02T12:17:03.430 回答
0
if(isset($user_input))
 {
$flg = true;
}
if($flg)
{
//do stuff
}

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

于 2012-07-02T11:40:10.487 回答
0

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

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

于 2012-07-02T11:40:34.693 回答
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
}
于 2012-07-02T12:01:04.647 回答