PHP'de POST aracılığıyla aynı ada sahip birden çok giriş


119

Göndermek için aynı isimde birden fazla girdi almak ve sonra bunlara PHP'den erişmek mümkün müdür? Fikir şudur: Diğer bilgilerle birlikte sınırsız sayıda fiziksel adresin girilmesine izin veren bir formum var. Bu alanların her birine birkaç girişte aynı adı verirsem ve bu verileri posta yoluyla gönderirsem, PHP buna erişebilir mi?

Örneğin, "xyz" adlı bir sayfada beş girişim var ve onlara PHP kullanarak erişmek istiyorum. Şöyle bir şey yapabilir miyim:

    $_POST['xyz'][0]

Eğer öyleyse, bu benim hayatımı on kat daha kolay hale getirirdi, çünkü bir form aracılığıyla belirsiz miktarda bilgi gönderebilir ve basitçe "xyz" adındaki öğeler dizisinde döngü yaparak sunucu tarafından işlenmesini sağlayabilirdim.

Yanıtlar:


216

Girişlerinizin adlarını değiştirin:

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

Sonra:

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

Eğer öyleyse, bu benim hayatımı on kat daha kolay hale getirirdi, çünkü bir form aracılığıyla belirsiz miktarda bilgi gönderebilir ve basitçe "xyz" adındaki öğeler dizisinde döngü yaparak sunucu tarafından işlenmesini sağlayabilirdim.

Bunun muhtemelen yanlış çözüm olduğuna dikkat edin. Açıkçası, gönderdiğiniz verilere bağlıdır.


Yardım için teşekkürler. Sorumun en eksiksiz cevabı bu olduğundan, cevabı olarak seçiyorum. Bununla birlikte, Interstellar_coder'ın cevabı da iyidir, ancak yanlış kullanıldığında bunun potansiyel olarak bir tuzak olabileceğini açıkladınız. Maksimum öğe sayısını sınırlayacağım ve bu form üzerinde çok fazla doğrulama yapacağım, bu nedenle bu yaklaşımda burada açıklanmayan sorunlar yoksa herhangi bir güvenlik sorunuyla karşılaşmamalıyım.
Adam

10
@Adam: Sorunuzu tekrar okuduktan sonra, bu tamamen kabul edilebilir bir yaklaşım. Sen daha ileri bir aşamaya gidin ve sahip isteyebilirsiniz address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Sen bu okuyabilir $_POST['address'][0]['city'], örneğin
Eric

Daha sonra bu HTML içinde nasıl adlandırılır? Bu, potansiyel olarak zorluğu oldukça azaltacaktır. Benim izleyeceğim yaklaşım şu şekilde adlandırılmış birkaç alana sahip olmaktır: l1 [], l2 [], şehir [], eyalet [], zip [], zip4 []. Sonra, ilk adres için her alanda $ i == 0 kullanıyorum. Dolayısıyla, yaklaşımınızı doğru anlarsam, muhtemelen öğelerimi bir şehir alanı için şu şekilde adlandırırım: ad = "adres [] [şehir]". Bu doğru mu?
Adam

@Adam: Muhtemelen. Sanırım dizini ilk dizinin içine yerleştirmeniz gerekebilir [], örneğin [0]. Bu, HTML'nin oluşturulmasını zorlaştırır, ancak verilerin PHP tarafında okunması daha zor değildir
Eric,

Burada aklıma gelen soru şudur: Alan dizi içinde rastgele sırayla gidip gitmeyecek mi? veya formda yerleştirildikleri sırada mı olacaklar (bazı alanlar boş bırakılsa bile)?
rajeev

38

Html'nizde ie adı için bir dizi geçirebilirsiniz.

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

Bu şekilde php bir dizi adres alacaktır.


3
İyi ve doğru cevap, bu yüzden oy verdim. Yine de bu konuda çok fazla açıklama yapmadınız, bu yüzden sorumun cevabı olarak onu seçmedim. Bir süredir bunu çözmeye çalıştığım için (önceki sorularımdan birinde fark edebileceğiniz gibi) bu bana çok yardımcı oluyor. Önceki yaklaşımım, tüm girdileri gizli alanlara * ayrılmış değerlerle eklemek ve giriş alanlarını sıfırlamaktı, ancak bu yaklaşım on kat daha iyidir çünkü önceden eklenmiş adreslerin silinmesine izin verebileceğim tespit edilirse yanlış.
Adam

Sadece boş bir dizinin '0' indeksinde hiçbir şey olmadan POST'lanmış 1 sayısının olacağını unutmamaya dikkat edin. İf (! Empty ($ arrayName)) {// do something} 'empty' anahtar kelimesini kullanarak kontrol etmeniz gerekecek
Fi Horan

10

Eric'in cevabı doğru, ancak sorun alanların gruplanmaması. Birbirine ait birden çok cadde ve şehir olduğunu hayal edin:

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

Sonuç olurdu

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

Bunları adrese göre gruplandırmak için, Eric'in yorum bölümünde de bahsettiği şeyi kullanmanızı tavsiye ederim:

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

Sonuç olurdu

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

0

Bunu bulan başka biri için - giriş adındaki anahtar değerini ayarlayabileceğinizi belirtmek gerekir. Aynı Ad Özniteliğine sahip POSTing Form Alanlarındaki cevap sayesinde, dizeleri veya tam sayıları alıntı yapmadan da karşılıklı oynayabilirsiniz.

Cevaplar, PHP için anahtar değerinin geri gelmesini önemsemediğinizi varsayar, ancak name=[yourval]daha sonra var olan bir kayda başvurmanıza izin verecek şekilde (string veya int) ayarlayabilirsiniz .


Bunu kendiniz ayrıştırmak saçmalık. Bunun gerekli olacağına dair bir senaryo yok.
Javid

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.