Più ingressi con lo stesso nome tramite POST in php


119

È possibile ottenere più input con lo stesso nome da pubblicare e quindi accedervi da PHP? L'idea è questa: ho un modulo che consente l'inserimento di un numero indefinito di indirizzi fisici insieme ad altre informazioni. Se assegnassi semplicemente a ciascuno di questi campi lo stesso nome in più voci e inviassi i dati tramite posta, PHP sarebbe in grado di accedervi?

Diciamo, per esempio, che ho cinque input su una pagina denominata "xyz" e voglio accedervi utilizzando PHP. Potrei fare qualcosa come:

    $_POST['xyz'][0]

Se è così, ciò renderebbe la mia vita dieci volte più facile, poiché potrei inviare una quantità indefinita di informazioni tramite un modulo e farle elaborare dal server semplicemente scorrendo la matrice di elementi con il nome "xyz".

Risposte:


216

Cambia i nomi dei tuoi input:

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

Poi:

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

Se è così, ciò renderebbe la mia vita dieci volte più facile, poiché potrei inviare una quantità indefinita di informazioni tramite un modulo e farle elaborare dal server semplicemente scorrendo la matrice di elementi con il nome "xyz".

Nota che questa è probabilmente la soluzione sbagliata. Ovviamente dipende dai dati che invii.


Grazie per l'aiuto. Poiché questa è la risposta più completa alla mia domanda, la scelgo come LA risposta. Tuttavia, anche la risposta di Interstellar_coder è buona, ma hai spiegato che questo può potenzialmente essere un trabocchetto se usato in modo errato. Limiterò il numero massimo di elementi e farò molte convalide su questo modulo, quindi non dovrei incorrere in problemi di sicurezza a meno che non ci siano problemi inerenti a questo approccio che non sono stati spiegati qui.
Adam

10
@Adam: Dopo aver riletto la tua domanda, questo è un approccio perfettamente accettabile. Potresti voler andare oltre e avere address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Puoi leggerli con $_POST['address'][0]['city'], ad esempio
Eric

Come verrebbe quindi chiamato questo all'interno dell'HTML? Questo potrebbe potenzialmente alleviare la difficoltà di parecchio. L'approccio che stavo per adottare è avere diversi campi denominati in questo modo: l1 [], l2 [], città [], stato [], zip [], zip4 []. Quindi, per il primo indirizzo, utilizzo semplicemente $ i == 0 in ogni campo. Quindi, se comprendo correttamente il tuo approccio, probabilmente chiamerei i miei elementi in questo modo: nome = "indirizzo [] [città]" per un campo città. È corretto?
Adam

@Adam: forse. Penso che potresti dover posizionare l'indice all'interno del primo [], ad esempio [0]. Ciò rende l'HTML più difficile da generare, ma i dati non sono più difficili da leggere lato PHP
Eric

La domanda che mi viene in mente qui è: se il campo andrà in ordine casuale all'interno dell'array? o saranno nell'ordine in cui sono disposti nella forma (anche se alcuni campi vengono lasciati vuoti)?
rajeev

38

Nel tuo html puoi passare un array per il nome ie

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

In questo modo php riceverà un array di indirizzi.


3
Risposta buona e corretta, motivo per cui ho votato a favore. Non hai spiegato molto al riguardo, motivo per cui non l'ho selezionato come risposta alla mia domanda. Questo mi aiuta moltissimo, poiché ho cercato di capirlo per un po '(come potresti notare in una delle mie domande precedenti). Il mio approccio precedente era semplicemente aggiungere tutti gli input a campi nascosti con * valori separati e reimpostare i campi di input, ma questo approccio è dieci volte migliore in quanto sarò in grado di consentire l'eliminazione di indirizzi aggiunti in precedenza se si scopre che lo sono errato.
Adam

Fai solo attenzione a ricordare che un array vuoto avrà un conteggio di 1 essendo stato POST 'senza nulla all'indice' 0 '. Dovrai controllare utilizzando la parola chiave "vuota" se (! Empty ($ arrayName)) {// do something}
Fi Horan

10

La risposta di Eric è corretta, ma il problema è che i campi non sono raggruppati. Immagina di avere più strade e città che appartengono insieme:

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

Il risultato sarebbe

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

Per raggrupparli per indirizzo, consiglierei piuttosto di utilizzare ciò che Eric ha anche menzionato nella sezione dei commenti:

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

Il risultato sarebbe

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

0

Per chiunque altro trovi questo - vale la pena notare che puoi impostare il valore della chiave nel nome di input. Grazie alla risposta nei campi modulo POST con lo stesso attributo di nome puoi anche interagire con stringhe o numeri interi senza virgolette.

Le risposte presumono che non ti dispiaccia il valore della chiave che ritorna per PHP, tuttavia puoi impostare name=[yourval](string o int) che quindi ti consente di fare riferimento a un record esistente.


Non ha senso analizzarlo da soli. Non c'è scenario in cui ciò sarebbe necessario.
Javid

0

Può essere:

echo "Welcome".$_POST['firstname'].$_POST['lastname'];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.