Несколько входов с одинаковым именем через POST в php


119

Можно ли получить несколько входов с одинаковым именем для публикации, а затем получить к ним доступ из PHP? Идея такова: у меня есть форма, которая позволяет вводить неопределенное количество физических адресов вместе с другой информацией. Если бы я просто дал каждому из этих полей одно и то же имя в нескольких записях и отправил эти данные по почте, смог бы PHP получить к ним доступ?

Скажем, например, у меня есть пять входов на одной странице с именем «xyz», и я хочу получить к ним доступ с помощью PHP. Могу я сделать что-нибудь вроде:

    $_POST['xyz'][0]

Если так, это упростило бы мою жизнь в десять раз, поскольку я мог бы отправлять неопределенное количество информации через форму и обрабатывать ее на сервере, просто просматривая массив элементов с именем «xyz».

Ответы:


216

Измените имена ваших входов:

<input name="xyz[]" value="Lorem" />
<input name="xyz[]" value="ipsum"  />
<input name="xyz[]" value="dolor" />
<input name="xyz[]" value="sit" />
<input name="xyz[]" value="amet" />

Затем:

$_POST['xyz'][0] == 'Lorem'
$_POST['xyz'][4] == 'amet'

Если так, это упростило бы мою жизнь в десять раз, поскольку я мог бы отправлять неопределенное количество информации через форму и обрабатывать ее на сервере, просто просматривая массив элементов с именем «xyz».

Обратите внимание, что это, вероятно, неправильное решение. Очевидно, это зависит от данных, которые вы отправляете.


Спасибо за помощь. Поскольку это наиболее полный ответ на мой вопрос, я выбираю его как ответ. Однако ответ от Interstellar_coder тоже хорош, но вы объяснили, что это потенциально может быть ловушкой при неправильном использовании. Я буду ограничивать максимальное количество элементов, и я буду проводить много проверок этой формы, поэтому я не должен сталкиваться с какими-либо проблемами безопасности, если только нет проблем, присущих этому подходу, которые не были объяснены здесь.
Адам

10
@Adam: Перечитав ваш вопрос, я понял, что это вполне приемлемый подход. Вы можете пойти на один шаг дальше, и есть address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Вы можете прочитать их с $_POST['address'][0]['city'], например
Eric

Как тогда это будет называться внутри HTML? Это потенциально могло бы значительно облегчить трудность. Подход, который я собирался использовать, состоит в том, чтобы несколько полей назывались так: l1 [], l2 [], city [], state [], zip [], zip4 []. Затем для первого адреса я просто использую $ i == 0 в каждом поле. Так что, если я правильно понимаю ваш подход, я, вероятно, назову свои элементы так: name = "address [] [city]" для поля города. Это правильно?
Адам

@ Адам: Возможно. Я думаю, вам может потребоваться разместить индекс внутри первого [], например [0]. Это затрудняет создание HTML, но данные на стороне PHP читать не сложнее,
Эрик,

Здесь у меня возникает вопрос: будет ли поле идти в произвольном порядке внутри массива? или они будут в том порядке, в котором они расположены в форме (даже если некоторые поля оставлены пустыми)?
Rajeev

38

В вашем html вы можете передать массив для имени, т.е.

<input type="text" name="address[]" /> 

Таким образом php получит массив адресов.


3
Хороший и правильный ответ, поэтому я проголосовал за него. Однако вы мало что объяснили об этом, поэтому я не выбрал его в качестве ответа на свой вопрос. Это мне очень помогает, так как я некоторое время пытался понять это (как вы могли заметить в одном из моих предыдущих вопросов). Мой предыдущий подход заключался в том, чтобы просто добавить все входные данные в скрытые поля с разделенными * значениями и сбросить поля ввода, но этот подход в десять раз лучше, поскольку я смогу разрешить удаление ранее добавленных адресов, если обнаружится, что они неверен.
Адам

Просто будьте осторожны, помните, что пустой массив будет иметь счетчик 1, который был отправлен POST без нуля в индексе '0'. Вам нужно будет проверить с помощью ключевого слова empty if (! Empty ($ arrayName)) {// что-нибудь сделать}
Фи Хоран,

10

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

<h1>First Address</h1>
<input name="street[]" value="Hauptstr" />
<input name="city[]" value="Berlin"  />

<h2>Second Address</h2>
<input name="street[]" value="Wallstreet" />
<input name="city[]" value="New York" />

Результат был бы

$POST = [ 'street' => [ 'Hauptstr', 'Wallstreet'], 
          'city' => [ 'Berlin' , 'New York'] ];

Чтобы сгруппировать их по адресам, я бы рекомендовал использовать то, что Эрик также упомянул в разделе комментариев:

<h1>First Address</h1>
<input name="address[1][street]" value="Hauptstr" />
<input name="address[1][city]" value="Berlin"  />

<h2>Second Address</h2>
<input name="address[2][street]" value="Wallstreet" />
<input name="address[2][city]" value="New York" />

Результат был бы

$POST = [ 'address' => [ 
                 1 => ['street' => 'Hauptstr', 'city' => 'Berlin'],
                 2 => ['street' => 'Wallstreet', 'city' => 'New York'],
              ]
        ]

0

Для всех, кто это обнаружит, стоит отметить, что вы можете установить значение ключа в имени входа. Благодаря ответу в полях формы POSTing с таким же атрибутом имени вы также можете взаимодействовать со строками или целыми числами без использования кавычек.

Ответы предполагают, что вы не возражаете против возврата значения ключа для PHP, однако вы можете установить name=[yourval](string или int), что затем позволит вам ссылаться на существующую запись.


Это чушь разбирать самому. Нет никакого сценария, что это может понадобиться.
Джавид

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.