PHP filter_input_array - 使用 FILTER_CALLBACK 将键名称发送到自定义过滤器

问题描述 投票:0回答:1

我即将重写旧的 PHP 系统以使用

filter_input()
filter_input_array()
而不是旧的方法。

由于系统已经巧妙地使用字段名称来指示字段应保存什么样的值(

int_name
str_name
flt_name
date_name
等),我认为如果
filter_input_array()
会很聪明提供了一些根据键名选择特定过滤器的方法。 理想情况下,一次过滤输入整个数组,使用
filter_input_array()

我偶然发现了

FILTER_CALLBACK
,它在短时间内看起来很有趣,直到了解到不可能为任何字段调用相同的回调方法。我们必须手动指定每个字段名称。另外,即使有可能,我们似乎也无法在回调方法中看到字段名实际上是什么。仅该字段的值被发送到回调函数。这当然使得不可能根据字段名称选择操作。

文档指出,如果我想对数组中的所有字段使用相同的过滤器,我可以为 filter_input_array 选择单个过滤器类型。但是,这不适用于

FILTER_CALLBACK
,我认为是因为我还需要提供回调方法的名称,而我无法使用该方法做到这一点(?)。

因此,经过大量毫无结果的搜索后,我在这里问:有什么方法可以做我想做的事情:用以下内容一次性过滤整个数组:

$filtered_values = filter_input_array(INPUT_POST, FILTER_CALLBACK, "mycustomfilter");

并让

mycustomfilter()
接收数组元素的键名和值。

php filter-input filter-input-array
1个回答
0
投票

尽管依赖用户输入并不是一个好主意,特别是在验证方面,您可以通过各种方式完成此操作。

1-如评论中所述,实现您自己的filter_input。
2- 使用

uopz
扩展来破解 input_filter 行为。
3-通过创建自定义规则选项来绕过当前的 input_filter_array 实现,如下所示:

function cb($value, $key) {
    return $key . ' >> ' . $value;
}

$rules = [];
foreach ($_GET as $key => $value) {
    $rules[$key] = [
        'filter' => FILTER_CALLBACK,
        'options' => function () use ($key, $value) {
            return cb($value, $key);
        }
    ];
}

$z = filter_input_array(INPUT_GET, $rules);
© www.soinside.com 2019 - 2024. All rights reserved.