在我的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?
答案 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
,那么通过抑制输入错误的变量的错误报告,您的生活将更加艰难。
然后,您应该概括您的代码。创建要验证的字段数组。在该数组上运行循环,标记字段true
或false
。弄清楚所有字段是否都是真的。
$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_Form
和Zend_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
}