Поля формы POSTing с тем же атрибутом имени - PullRequest
36 голосов
/ 05 февраля 2010

Если у вас есть форма, содержащая текстовые вводы с дублирующимися атрибутами name, и форма опубликована, вы все равно сможете получать значения всех полей из массива $_POST в PHP?

Ответы [ 4 ]

71 голосов
/ 05 февраля 2010

Нет. Будет доступен только последний элемент ввода.

Если вы хотите использовать несколько входов с одинаковым именем, используйте name="foo[]" для атрибута имени входа. $_POST будет содержать массив для foo со всеми значениями из входных элементов.

<form method="post">
    <input name="a[]" value="foo"/>
    <input name="a[]" value="bar"/>
    <input name="a[]" value="baz"/>
    <input type="submit" />
</form>

См. Ссылку HTML в Sitepoint .

.

Причина, по которой $_POST будет содержать последнее значение, только если вы не используете [], заключается в том, что PHP в основном просто взорвется и передаст необработанную строку запроса для заполнения $_POST. Когда он встречает пару имя / значение, которая уже существует, он перезапишет предыдущую.

Однако вы все равно можете получить доступ к необработанной строке запроса следующим образом:

$rawQueryString = file_get_contents('php://input'))

Предположим, у вас есть такая форма:

<form method="post">
    <input type="hidden" name="a" value="foo"/>
    <input type="hidden" name="a" value="bar"/>
    <input type="hidden" name="a" value="baz"/>
    <input type="submit" />
</form>

$ rawQueryString будет содержать a=foo&a=bar&a=baz.

Затем вы можете использовать свою собственную логику, чтобы разобрать это в массив. Наивный подход был бы

$post = array();
foreach (explode('&', file_get_contents('php://input')) as $keyValuePair) {
    list($key, $value) = explode('=', $keyValuePair);
    $post[$key][] = $value;
}

, который затем даст вам массив массивов для каждого имени в строке запроса.

7 голосов
/ 12 апреля 2013

Вместо name="nfo[val]" просто используйте name="nfo[val][]", а в PHP вы можете использовать foreach()

HTML код:

<form method="post">
    <input name="nfo[val][]" value="val1"/>
    <input name="nfo[val][]" value="val2"/>
    <input name="nfo[val][]" value="val3"/>
    <input type="submit" />
</form>

PHP код:

$output='';
foreach ($nfo['val'] as $key=>$val) {
    $output.= $val.", ";
}

$output будет: val1, val2, val3

Надеюсь, это поможет!

6 голосов
/ 05 февраля 2010

Вы должны создать их массив: с name=inputname[] и получите с почтой, запросом или получите

$inputs = $_POST['inputname'];

print_r($inputs);
2 голосов
/ 05 февраля 2010

Только если имя имеет тип массива names[], в этом случае вы получите массив в качестве переменной в переменной $ _POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...