За последние 24 часа нас посетил 72471 программист и 1649 роботов. Сейчас ищут 888 программистов ...

filter_input() и значения типа "value[]"

Тема в разделе "Прочие вопросы по PHP", создана пользователем artoodetoo, 8 сен 2014.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    С некоторых пор подчиняюсь прихотям NetBeans и избегаю писать прямое обращение к $_POST, вместо этого пишу
    что-нибудь типа
    Код (PHP):
    1. $email = filter_input(INPUT_POST, 'req_email', FILTER_SANITIZE_EMAIL) ?: ''; 
    но вот понадобилась форма со списком значений, которые я оформил как <input name="email[]"…>
    В переменной $_POST я прекрасно получаю все строки, красиво воспользоваться filter_input без упоминания $_POST я не могу :(

    Дорогие профи, помогите!
     
  2. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Вот здесь немного не понятно

    Добавлено спустя 3 минуты 35 секунд:
    а, все, понял...

    Добавлено спустя 30 секунд:
    нет, не понял
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Не понял, из-за особенностей редактора вы не используете суперглобальные переменные в своей программе? А INPUT_POST - вообще константа, что-ли? Вроде макросы в php отсутствуют... Ну скопируйте $_POST в другую переменную....
     
  4. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Про редактор это была шутка в которой есть только доля шутки. Я правда почти на 100% могу избавиться от упоминания суперглобалс в своих контроллерах.
    Спасибо за моральную поддержку, очевидно с filter_input не знакомы и поэтому суть задачи непонятна :)
    Я знаю, что [vs] использует, подожду когда он заметит.

    Добавлено спустя 7 минут 53 секунды:
    Возможно filter_input_array и решает проблему, возможно я просто запарился и туплю.
    Прошу показать "на примерах": у меня куча email-ов с общим именем инпута…
     
  6. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Код (PHP):
    1. $req_desc = array(
    2.     'email' => array('filter.sanitize' => FILTER_SANITIZE_EMAIL)
    3. );
    4.  
    5. $post = filter_input_array(INPUT_POST, $req_desc);
    6.  
    Добавлено спустя 4 минуты 55 секунд:
    Не, походу мой пример не канает, ждем [vs]...

    Добавлено спустя 4 минуты 5 секунд:
    А, ну да, почти верно...

    Код (PHP):
    1. $req_desc = array(
    2.     'email' => FILTER_SANITIZE_EMAIL
    3. );
    4.  
    5. $req = filter_input_array(INPUT_POST, $req_desc);
    6.  
    Вот так по идее должно быть идентично вышей записи filter_input, только для массивов...
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    dapperkop, нет, твой пример наверное будет работать для единственного <input name="email">, но не для пачки
    <input name="email[]">
    <input name="email[]">
    <input name="email[]">
    чуешь разницу?

    Я закончил тупить и получил почти то, что хотел:
    Код (PHP):
    1. <!doctype html>
    2. <html>
    3. <head>
    4. <meta charset="utf8">
    5. <title>Validate email array from POST</title>
    6. </head>
    7. <body>
    8. <form method="post">
    9. <input type="text" name="email[]" value=""><br>
    10. <input type="text" name="email[]" value=""><br>
    11. <input type="text" name="email[]" value=""><br>
    12. <input type="text" name="email[]" value=""><br>
    13. <input type="text" name="email[]" value=""><br>
    14.  
    15. <input type="submit" name="submit" value=" Send "><br>
    16. </form>
    17. </body>
    18. </html>
    19. <?php
    20.  
    21.  
    22. $args = array(
    23.     'email' => array(
    24.         'filter' => FILTER_VALIDATE_EMAIL,
    25.         'flags'  => FILTER_REQUIRE_ARRAY,
    26.     )
    27. );
    28. $filtered = filter_input_array(INPUT_POST, $args);
    29.  
    30. echo '<pre>$_POST = '.var_export($_POST, true).';</pre>';
    31. echo '<pre>$filtered = '.var_export($filtered, true).';</pre>';
    тестовый прогон:
    Код (Text):
    1. $_POST = array (
    2.   'email' =>
    3.   array (
    4.     0 => 'alfa@beta.com',
    5.     1 => 'alfa.beta.com',
    6.     2 => 'foo@bar.baz.com',
    7.     3 => '',
    8.     4 => 'sdf gh',
    9.   ),
    10.   'submit' => ' Send ',
    11. );
    12. $filtered = array (
    13.   'email' =>
    14.   array (
    15.     0 => 'alfa@beta.com',
    16.     1 => false,
    17.     2 => 'foo@bar.baz.com',
    18.     3 => false,
    19.     4 => false,
    20.   ),
    21. );
    отфильтрованы годные емайлы, все остальные false. нужные мне данные лежат в $filtered['email']