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”.

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.


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.


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'],
              ]
        ]

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.


Samo analizowanie tego jest nonsensem. Nie ma scenariusza, że ​​byłoby to potrzebne.
Javid

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.