Wiele wejść o tej samej nazwie poprzez POST w php

119

Czy można uzyskać wiele danych wejściowych o tej samej nazwie do opublikowania, a następnie uzyskać do nich dostęp z PHP? Pomysł jest następujący: mam formularz, który umożliwia wprowadzenie nieokreślonej liczby adresów fizycznych wraz z innymi informacjami. Gdybym po prostu nadał każdemu z tych pól tę samą nazwę w kilku wpisach i przesłał te dane pocztą, czy PHP miałby do nich dostęp?

Powiedzmy na przykład, że mam pięć danych wejściowych na jednej stronie o nazwie „xyz” i chcę uzyskać do nich dostęp za pomocą PHP. Czy mógłbym zrobić coś takiego:

    $_POST['xyz'][0]

Jeśli tak, to uczyniłoby to moje życie dziesięciokrotnie łatwiejszym, ponieważ mógłbym wysłać nieokreśloną ilość informacji przez formularz i uzyskać je przez serwer, po prostu przeglądając tablicę elementów o nazwie „xyz”.

Adam
źródło

Odpowiedzi:

216

Zmień nazwy swoich wejść:

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

Następnie:

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

Jeśli tak, to uczyniłoby to moje życie dziesięciokrotnie łatwiejszym, ponieważ mógłbym wysłać nieokreśloną ilość informacji przez formularz i uzyskać je przez serwer, po prostu przeglądając tablicę elementów o nazwie „xyz”.

Zauważ, że jest to prawdopodobnie złe rozwiązanie. Oczywiście zależy to od przesyłanych danych.

Eric
źródło
Dzięki za pomoc. Ponieważ jest to najpełniejsza odpowiedź na moje pytanie, wybieram ją jako odpowiedź. Jednak odpowiedź od Interstellar_coder jest również dobra, ale wyjaśniłeś, że może to być potencjalnie pułapka, jeśli zostanie użyta nieprawidłowo. Będę ograniczał maksymalną liczbę pozycji i będę przeprowadzał wiele weryfikacji w tym formularzu, więc nie powinienem napotykać żadnych problemów związanych z bezpieczeństwem, chyba że istnieją problemy związane z tym podejściem, które nie zostały tutaj wyjaśnione.
Adam
10
@Adam: Po ponownym przeczytaniu Twojego pytania jest to całkowicie akceptowalne podejście. Może chcesz iść jeden krok dalej, i address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Można odczytać z nich$_POST['address'][0]['city'] , na przykład
Eric
Jak by to nazwał w HTML? To potencjalnie znacznie zmniejszyłoby tę trudność. Podejście, które zamierzałem zastosować, obejmuje kilka pól nazwanych w ten sposób: l1 [], l2 [], miasto [], stan [], zip [], zip4 []. Następnie dla pierwszego adresu używam po prostu $ i == 0 w każdym polu. Więc jeśli dobrze zrozumiem twoje podejście, prawdopodobnie nazwałbym moje elementy w ten sposób: nazwa = "adres [] [miasto]" dla pola miasta. Czy to jest poprawne?
Adam
@Adam: Możliwe. Myślę, że może być konieczne umieszczenie indeksu wewnątrz pierwszego [], takiego jak [0]. To sprawia, że ​​HTML trudniej jest wygenerować, ale dane nie są trudniejsze do odczytania po stronie PHP
Eric,
Nasuwa mi się pytanie: czy pole pójdzie w losowej kolejności wewnątrz tablicy? czy też będą w kolejności, w jakiej są ułożone w formie (nawet jeśli niektóre pola pozostaną puste)?
rajeev
38

W swoim html możesz podać tablicę dla nazwy, np

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

W ten sposób php otrzyma tablicę adresów.

aziz punjani
źródło
3
Dobra i poprawna odpowiedź, dlatego zagłosowałem za nią. Nie wyjaśniłeś jednak zbyt wiele na ten temat, dlatego nie wybrałem tego jako odpowiedzi na moje pytanie. To mi bardzo pomaga, ponieważ od jakiegoś czasu próbuję to rozgryźć (jak możesz zauważyć w jednym z moich poprzednich pytań). Moje poprzednie podejście polegało po prostu na dodaniu wszystkich danych wejściowych do ukrytych pól z * wartościami oddzielonymi i zresetowaniu pól wejściowych, ale to podejście jest dziesięć razy lepsze, ponieważ będę mógł zezwolić na usunięcie wcześniej dodanych adresów, jeśli okaże się, że są błędny.
Adam
Po prostu uważaj, aby pamiętać, że pusta tablica będzie miała liczbę 1 po przesłaniu POST bez niczego w indeksie „0”. Musisz to sprawdzić, używając słowa kluczowego „empty” if (! Empty ($ arrayName)) {// zrób coś}
Fi Horan
10

Odpowiedź Erica jest poprawna, ale problem polega na tym, że pola nie są pogrupowane. Wyobraź sobie, że masz wiele ulic i miast, które należą do siebie:

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

Wynik byłby

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

Aby pogrupować je według adresu, poleciłbym raczej skorzystać z tego, o czym Eric również wspomniał w sekcji komentarzy:

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

Wynik byłby

$POST = [ 'address' => [ 
                 1 => ['street' => 'Hauptstr', 'city' => 'Berlin'],
                 2 => ['street' => 'Wallstreet', 'city' => 'New York'],
              ]
        ]
Adam
źródło
0

Dla każdego, kto to znajdzie - warto zauważyć, że możesz ustawić wartość klucza w nazwie wejścia. Dzięki odpowiedzi w POSTing Form Fields z tym samym atrybutem nazwy można również łączyć łańcuchy lub liczby całkowite bez cytowania.

Odpowiedzi zakładają, że nie przeszkadza ci powrót wartości klucza dla PHP, jednak możesz ustawić name=[yourval](ciąg lub int), co pozwala ci odwołać się do istniejącego rekordu.

Antony
źródło
Samo analizowanie tego jest nonsensem. Nie ma scenariusza, że ​​byłoby to potrzebne.
Javid
0

To może być:

echo "Welcome".$_POST['firstname'].$_POST['lastname'];
Azeemunnisa
źródło