【问题标题】:Filtering multi-dimensional POST with PHP filter_input_array使用 PHP filter_input_array 过滤多维 POST
【发布时间】:2015-09-10 11:47:39
【问题描述】:

有没有办法使用 PHP 的 filter_input_array 过滤/清理多维 POST 数据?

给定一个导致以下 POST 数据的表单:

$_POST[
    'level1a' => [
        'level2a' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ],
        'level2b' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ],
    'level1b' => [
        'level2a' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ],
        'level2b' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ]
]

我没有办法告诉filter_input_array 函数要检查的数据嵌套更深一层。似乎只有标志FILTER_REQUIRE_ARRAY,但无法判断它需要检查哪个级别。

尺寸较小的工作示例:

如果它只是一组嵌套较少的数据,那就很简单了:

$_POST[
    'level1a' => [
        'level2a' => 'value1',
        'level2b' => 'value2'
    ],
    'level1b' => [
        'level2a' => 'value1',
        'level2b' => 'value2'
    ]
]

可以过滤:

$args = array(
    'level1a' => array(
        'filter' => FILTER_SANITIZE_STRING, 
        'flags' => FILTER_REQUIRE_ARRAY
    ),
    'level1b' => array(
        'filter' => FILTER_SANITIZE_STRING, 
        'flags' => FILTER_REQUIRE_ARRAY
    )
);
$form_data = filter_input_array(INPUT_POST, $args);

但是如何用更多的嵌套数据来解决呢?有没有办法不拆分/展平 POST 数据?

【问题讨论】:

  • 你可以很容易地编写一个递归函数来对一些数据运行filter_input_array,然后递归到内部数组。
  • 我现在正在处理类似的问题。我会让你知道我的想法。
  • 我可能会尝试设计我的 HTML 表单,以便它只创建标量和/或二维数组。由于$_POSTINPUT_POST 不一样,所以扁平化$_POST 不会对INPUT_POST 产生任何影响。从纯粹的意义上说,我认为您希望将$_POST 排除在外。如果可能的话,我的建议是让你扁平化你的 HTML 表单,而不是输入源数组。是的,诡计可以做,但代价是什么?处理时间?维护?文档?一旦您超越了二维,PHP 就会让您使用自己的设备。 :) 注意没有 INPUT_FILES。
  • 你可以试试这个答案stackoverflow.com/a/4995863的第二个想法

标签: php arrays post filter sanitize


【解决方案1】:
/**
* Trim and filter every value in the nested array
*/
function filter(array &$array)
{
    array_walk_recursive($array, function (&$value) {
         $value = filter_var(trim($value), FILTER_SANITIZE_STRING);
    });

    return $array;
}

/**
* Get filtered POST data
*/
function post(){
  return filter($_POST);
}

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2019-11-20
    相关资源
    最近更新 更多