Beberapa input dengan nama yang sama melalui POST di php


119

Apakah mungkin untuk mendapatkan beberapa input dengan nama yang sama untuk dikirim dan kemudian mengaksesnya dari PHP? Idenya adalah ini: Saya memiliki formulir yang memungkinkan masuknya alamat fisik dalam jumlah tak terbatas bersama dengan informasi lainnya. Jika saya hanya memberi masing-masing bidang itu nama yang sama di beberapa entri dan mengirimkan data itu melalui pos, apakah PHP dapat mengaksesnya?

Katakanlah, misalnya, saya memiliki lima masukan pada satu halaman bernama "xyz" dan saya ingin mengaksesnya menggunakan PHP. Bisakah saya melakukan sesuatu seperti:

    $_POST['xyz'][0]

Jika demikian, itu akan membuat hidup saya sepuluh kali lebih mudah, karena saya dapat mengirim informasi dalam jumlah yang tidak terbatas melalui formulir dan membuatnya diproses oleh server hanya dengan mengulang melalui array item dengan nama "xyz".

Jawaban:


216

Ubah nama input Anda:

<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" />

Kemudian:

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

Jika demikian, itu akan membuat hidup saya sepuluh kali lebih mudah, karena saya dapat mengirim informasi dalam jumlah yang tidak terbatas melalui formulir dan membuatnya diproses oleh server hanya dengan mengulang melalui array item dengan nama "xyz".

Perhatikan bahwa ini mungkin solusi yang salah. Jelas, itu tergantung pada data yang Anda kirim.


Terima kasih untuk bantuannya. Karena ini adalah jawaban paling lengkap untuk pertanyaan saya, saya memilihnya sebagai jawaban ATAS. Namun, jawaban dari Interstellar_coder juga bagus, tetapi Anda telah menjelaskan bahwa ini berpotensi menjadi perangkap jika digunakan secara tidak benar. Saya akan membatasi jumlah item maksimum dan saya akan melakukan banyak validasi pada formulir ini, jadi saya tidak akan mengalami masalah keamanan apa pun kecuali ada masalah yang melekat dalam pendekatan ini yang belum dijelaskan di sini.
Adam

10
@Adam: Setelah membaca ulang pertanyaan Anda, ini adalah pendekatan yang dapat diterima dengan sempurna. Anda mungkin ingin melangkah lebih jauh, dan memiliki address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Anda dapat membacanya dengan $_POST['address'][0]['city'], misalnya
Eric

Lalu bagaimana ini dinamai di dalam HTML? Itu berpotensi meringankan kesulitan dengan cukup banyak. Pendekatan yang akan saya ambil adalah memiliki beberapa bidang bernama seperti: l1 [], l2 [], kota [], negara bagian [], zip [], zip4 []. Kemudian, untuk alamat pertama, saya cukup menggunakan $ i == 0 di setiap kolom. Jadi jika saya memahami pendekatan Anda dengan benar, saya mungkin akan memberi nama elemen saya seperti ini: name = "address [] [city]" untuk bidang kota. Apakah itu benar?
Adam

@Adam: Mungkin. Saya pikir Anda mungkin perlu menempatkan indeks di dalam yang pertama [], seperti [0]. Itu membuat HTML lebih sulit untuk dibuat, tetapi datanya tidak lebih sulit untuk dibaca dari sisi PHP
Eric

Pertanyaan yang muncul di benak saya di sini adalah: apakah bidang akan masuk dalam urutan acak di dalam array? atau akankah mereka diurutkan dalam bentuk (bahkan jika beberapa bidang dibiarkan kosong)?
rajeev

38

Di html Anda, Anda dapat memasukkan array untuk nama mis

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

Dengan cara ini php akan menerima berbagai alamat.


3
Jawaban yang baik dan benar, itulah mengapa saya memilihnya. Anda tidak menjelaskan banyak tentangnya, itulah mengapa saya tidak memilihnya sebagai jawaban atas pertanyaan saya. Ini sangat membantu saya, karena saya telah mencoba memikirkan yang satu ini untuk sementara waktu (seperti yang mungkin Anda perhatikan di salah satu pertanyaan saya sebelumnya). Pendekatan saya sebelumnya adalah dengan menambahkan semua input ke bidang tersembunyi dengan * nilai yang terpisah dan mengatur ulang bidang masukan, tetapi pendekatan ini sepuluh kali lebih baik karena saya akan dapat mengizinkan penghapusan alamat yang ditambahkan sebelumnya jika ditemukan. salah.
Adam

Berhati-hatilah untuk mengingat bahwa array kosong akan memiliki hitungan 1 yang telah di-POST dengan tidak ada apa pun di indeks '0'. Anda harus memeriksa dengan menggunakan kata kunci 'kosong' if (! Empty ($ arrayName)) {// do something}
Fi Horan

10

Jawaban Eric benar, tetapi masalahnya adalah bidang tidak dikelompokkan. Bayangkan Anda memiliki banyak jalan dan kota yang menjadi satu:

<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" />

Hasilnya akan seperti itu

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

Untuk mengelompokkan mereka berdasarkan alamat, saya lebih suka merekomendasikan untuk menggunakan apa yang juga disebutkan Eric di bagian komentar:

<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" />

Hasilnya akan seperti itu

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

0

Untuk orang lain yang menemukan ini - perlu diperhatikan bahwa Anda dapat menyetel nilai kunci dalam nama input. Berkat jawaban di Bidang Formulir POST dengan Atribut Nama yang sama, Anda juga dapat memainkan string atau bilangan bulat tanpa kutipan.

Jawabannya berasumsi bahwa Anda tidak keberatan dengan nilai kunci kembali untuk PHP namun Anda dapat mengatur name=[yourval](string atau int) yang kemudian memungkinkan Anda untuk merujuk ke catatan yang ada.


Ini tidak masuk akal untuk mengurai sendiri. Tidak ada skenario bahwa ini diperlukan.
Javid

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.