我即将重写旧的 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()
接收数组元素的键名和值。
尽管依赖用户输入并不是一个好主意,特别是在验证方面,您可以通过各种方式完成此操作。
1-如评论中所述,实现您自己的filter_input。
2- 使用
uopz
扩展来破解 input_filter 行为。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);