Используя $_POST, я могу перебирать все переменные POST с

foreach($_POST as $key => $value) {
    // do something
}

Но есть ли что-нибудь подобное для перебора каждого $key, такого, что filter_input(INPUT_POST, $key) дает переменную из POST?

Очевидно, я мог бы использовать

foreach(array_keys($_POST) as $key) {
    if(filter_has_var(INPUT_POST, $key) {
        $value = filter_input(INPUT_POST, $key);
        // do something
    }
}

Но этого не всегда было достаточно. Если, например, некоторые из ключей $_POST были сброшены, было бы полезно узнать, какие ключи были изначально доступны, поскольку они все равно будут доступны через filter_input. Кроме того, мне бы хотелось никогда не иметь прямого доступа к каким-либо суперглобалам.

php
0
Magnar Myrtveit 22 Июл 2014 в 17:41

2 ответа

Лучший ответ

Я думаю, что есть проблема дизайна, использование FILTER_INPUT аналогично использованию SUPERGLOBALS. Если вы хотите отменить установку какой-либо переменной $ _POST, вы должны сохранить копию этой переменной, прежде чем снимать ее. Нет ничего плохого в том, чтобы разобрать $ _POST как есть:

   // backup your $_POST (or $_POST keys)
   $_post_backup = $_POST;

   // remove 'foo'
   unset($_POST['foo']);

   // itereate
   foreach($_post_backup as $key => $value) {
       $filtered_value = filter_input(INPUT_POST, $key);
       // do something
   }
0
cardeol 22 Июл 2014 в 14:11

Я только что видел это на сайте разработчиков Paypal IPN:

$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
  $keyval = explode ('=', $keyval);
  if (count($keyval) == 2)
     $myPost[$keyval[0]] = urldecode($keyval[1]);
}

Протестировал, работает. Не знаю, надежно ли это, но в большинстве случаев это более чем хорошо. Вам все еще нужно фильтровать ввод, но теперь вы можете сделать это с помощью filter_input_array

0
Hendrik Hamming 28 Мар 2016 в 13:01