Многомерный массив в PHP (данные формы с флажками) - PullRequest
1 голос
/ 17 марта 2012

Я новичок в PHP и у меня проблемы с чтением флажков, отправленных формой. Прежде чем объяснить это, я хотел бы упомянуть, что я пытаюсь отредактировать намного большее приложение, и данные не могут быть отправлены другим способом. Это просто вопрос поиска хорошего метода чтения того, что отправляется.

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

custom[0][type]="text"
custom[0][name]="VariableName"
custom[0][value]="VariableName"

По сути, существует основной «пользовательский» многомерный массив, который имеет несколько элементов (0,1,2,3 и т. Д.), И каждый элемент имеет имя и значение.

Однако, когда один из элементов является флажком, публикуется следующее:

custom[1][type]="list"
custom[1][name]="SelectedOptions"
custom[1][value]="Value1"
custom[1][value]="Value3"
custom[1][value]="Value5"

Что касается PHP, это код, который я использую для чтения данных, отправленных формой. Приведенный ниже код работает нормально в сценарии 1 (с вводом текста), но читает только одно значение, когда у нас есть пользовательские данные типа списка.

foreach($_POST['custom'] as $item){
    if($item['value'] != "") echo $item['name'].'='.$item['value']
}

Проблема в том, что $ item ['value'] читает только одно из значений, а не все 3. Как я могу получить все 3 значения в переменной? Это, наверное, очень простая вещь ...

Чтобы сложить все вместе, это то, что отправляется с POST (3 флажка для Variable2)

custom[0][name] Variable1
custom[0][type] text
custom[0][value]    ValueForVariable1
custom[1][name] Variable2
custom[1][type] checkbox
custom[1][value]    Value1
custom[1][value]    Value3
custom[1][value]    Value5

И это то, что print_r ($ _ POST) показывает для опубликованных данных выше

[custom] => Array
(
[0] => Array
    (
    [value] => ValueForVariable1
    [name] => Variable1
    [type] => text
    )
[1] => Array
    (
    [value] => Value1
    [name] => Variable2
    [type] => checkbox
    )

Просто чтобы убедиться, что мы все на одной странице, фактические данные генерируются более сложной системой, и мы не можем реально изменить это. Мне интересно посмотреть, как мы можем прочитать все 3 значения для Variable2, которые отправляются в POST.

Спасибо!

1 Ответ

2 голосов
/ 17 марта 2012

EDIT: С дополнительной информацией, которую вы предоставили, я вижу, что изначально неправильно понял проблему.

Поскольку у вас нет контроля над формой, которая отправляет данные в ваш PHP-скрипт, и, следовательно, вы не можете изменить ее, чтобы гарантировать, что более поздние флажки с тем же именем не перезаписывают более ранние, вам придется получить доступ и обработать исходные данные непосредственно.

$postdata = file_get_contents("php://input");
echo $postdata;

... выведет постданные точно так же, как строка запроса GET: blah=1&blah=2&blah=3 (бла указывает 3 поля формы с одинаковым именем бла, первые два из которых будут перезаписаны в $_POST, оставляя $_POST['blah'] = 3). с небольшим взрывом на & и циклическим анализом и поиском рассматриваемых переменных или даже любых конфликтующих переменных, вы попадете туда, куда вы пытаетесь пойти.


Оригинальный ответ:

HTML-формы отправляют только те флажки (или переключатели), которые были отмечены. Если они не были проверены, браузер не отправит данные обратно на сервер.

Основной способ решить эту проблему - узнать, что вы ищете, и протестировать его (т. Е. if (isset($_POST['checkboxname'])).

Если вам действительно нужен сервер общего назначения, который будет динамически включать все элементы-флажки, независимо от того, отмечен я или нет, то в прошлом я решил эту проблему, используя javascript для записи всех элементов формы на странице и отправки этой информации с помощью остальная часть формы (и, в моем случае, также укажите, было ли это поле изменено или нет).


Вот функция, которую вы можете запустить в верхней части скрипта для обработки POST так, как вы ожидаете, что она будет обрабатываться на фоне ASP:

function post_process() {
    $rawpostdata = file_get_contents('php://input');
    if (!$rawpostdata) return;
    $fields = explode('&', $rawpostdata);
    $post = array();
    foreach ($fields as $field) {
        list($key, $val) = explode('=', $field);
        if (isset($post[$key])) $post[$key] .= ','.$val;
        else $post[$key] = $val;
    }
    $_POST = $post;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...