Кілька входів з тим самим іменем через 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'], наприклад,
Ерік,

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

@Adam: Можливо. Я думаю, вам може знадобитися розмістити індекс всередині першого [], наприклад, як [0]. Це робить HTML складніше для генерування, але дані не важче читати на PHP-стороні
Ерік,

Питання, яке мені спадає на думку, полягає в тому: чи поле піде у випадковому порядку всередині масиву? чи вони будуть в тому порядку, в якому вони будуть викладені у форму (навіть якщо деякі поля залишаються порожніми)?
rajeev

38

У своєму HTML ви можете передати масив для імені ie

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

Таким чином php отримає масив адрес.


3
Гарна і правильна відповідь, саме тому я проголосував за неї. Ти про це не дуже пояснив, тому я не вибрав це як відповідь на моє запитання. Це допомагає мені багато, тому що я намагався розібратися в цьому певний час (як ви можете помітити в одному з моїх попередніх питань). Мій попередній підхід полягав у тому, щоб просто додати всі вхідні дані до прихованих полів із * розділеними значеннями та скинути поля введення, але такий підхід у десять разів кращий, оскільки я зможу дозволити видалення раніше доданих адрес, якщо вони будуть виявлені, що вони є неправильно.
Адам

Будьте обережні, пам’ятайте, що порожній масив матиме кількість 1, який був POST'ed, і нічого не було в індексі '0'. Вам потрібно буде перевірити за допомогою ключового слова 'empty', якщо (! Empty ($ arrayName)) {// do something something
Fi Horan

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](рядок або int), що дозволяє вам посилатися на існуючий запис.


Це нісенітниця, щоб розібрати його самостійно. Немає сценарію, щоб це було потрібно.
Джавід

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.