получение данных из $ _POST, когда вы не знаете, что вам нужно забрать заранее - PullRequest
0 голосов
/ 22 февраля 2011

Это будет иметь смысл с примером:

У вас есть сайт рецептов, который отслеживает 3 точки данных:

  • название рецепта (салат, суп и т.д.)
  • ингредиентов (помидор, картофель, свинина и т. Д.)
  • объем ингредиента (только целые числа, чтобы наш пример был простым)

На первой странице моего Recipe Editor у нас есть форма для перечисления необходимых ингредиентов.

Recipe: salad
  REQUIRES
    __ tomato
    __ lettuce
    __ cheese
    __ schweddy balls

На второй странице мы получаем список всех необходимых ингредиентов и поля ввода для ввода необходимых объемов:

Recipe: salad
Ingredient    Volume
 tomato         2
 lettuce        1
 cheese         1

(придумано, я знаю, но терпите меня)

Теперь список ингредиентов и <input ... /> второй формы динамически генерируется из базы данных в зависимости от рецепта, выбранного для редактирования.

Каждый ингредиент имеет числовой идентификатор, поэтому ваш объем ввода будет выглядеть следующим образом:

<input type="text" name="17" value="" /> // how many tomatoes?

После того, как вы SUBMIT, вам нужно обработать массив $_POST и загрузить все ингредиенты и тома - ноВы (или, по крайней мере, я) не знаете заранее, что будет вв массиве $_POST, потому что каждый рецепт требует разных ингредиентов == $_POST[???]

Супер-клудж, о котором я думал, заключался в том, чтобы поместить все идентификаторы ингредиентов в строку, разделенную запятыми, вставить это в скрытое поле вводаи разнесите его во время обработки и используйте в качестве ключей $ _POST для извлечения значений.Это, конечно, работает, но из-за этого я чувствую себя грязно.

Есть ли лучший подход к получению входных значений из $ _POST, если вы заранее не знаете свои ключи?

Ответы [ 4 ]

2 голосов
/ 22 февраля 2011

Это не редкость, и для получателей подход выглядит правдоподобным. Но есть альтернативный подход, если вы сможете адаптировать логику генерации форм:

<input type="number" name="volume[tomatos]" value="">

Или продолжайте использовать идентификаторы с name="volume[17]" или чем-то похожим.

В любом случае, я думаю, что это легко сгенерировать и с AJAX / DHTML, и PHP может лучше справляться с входным массивом, таким как $_GET["volume"][...] - который в некоторых случаях также может быть более надежным, чем получение неопределенного ID-списка. (Вам все равно понадобится foreach, конечно.)

2 голосов
/ 22 февраля 2011

Самый простой способ - использовать foreach, поскольку $ _POST действует так же, как и любой другой массив:

foreach($_POST as $key => $value)
{
    switch($key)
    {
        case 17:
        // ...
    }
}

Вы также можете проверить наличие определенных клавиш с помощью isset ():

if(isset($_POST['17'])) {
    // ...
}

И для справки: нет ничего плохого в полях ввода, разделенных запятыми. Лучшее решение - это то, которое работает. :)

0 голосов
/ 22 февраля 2011
<input type="text" name="17" value="" />

Предполагается, что ваш метод формы POST ...

foreach($_POST as $key => $value){
    echo "We need $value of item $key";
}

Должны ли вы направиться в правильном направлении.

0 голосов
/ 22 февраля 2011
foreach ($_POST as $key => $value){
    echo "This recipe includes $value of ingredient $key."
}

Чтобы получить список идентификаторов ингредиентов, извлеките его из массива $ _POST:

$ingredientIDs = array_keys($_POST);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...