Várias entradas com o mesmo nome por meio de POST em php

119

É possível obter várias entradas com o mesmo nome para postar e acessá-las a partir do PHP? A ideia é a seguinte: tenho um formulário que permite a entrada de um número indefinido de endereços físicos junto com outras informações. Se eu simplesmente der a cada um desses campos o mesmo nome em várias entradas e enviar esses dados por postagem, o PHP poderá acessá-los?

Digamos, por exemplo, que tenho cinco entradas em uma página chamada "xyz" e desejo acessá-las usando PHP. Eu poderia fazer algo como:

    $_POST['xyz'][0]

Nesse caso, isso tornaria minha vida dez vezes mais fácil, pois eu poderia enviar uma quantidade indefinida de informações por meio de um formulário e processá-la pelo servidor simplesmente percorrendo a matriz de itens com o nome "xyz".

Adão
fonte

Respostas:

216

Altere os nomes de suas entradas:

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

Então:

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

Nesse caso, isso tornaria minha vida dez vezes mais fácil, pois eu poderia enviar uma quantidade indefinida de informações por meio de um formulário e processá-la pelo servidor simplesmente percorrendo a matriz de itens com o nome "xyz".

Observe que esta é provavelmente a solução errada. Obviamente, isso depende dos dados que você está enviando.

Eric
fonte
Obrigado pela ajuda. Visto que esta é a resposta mais completa à minha pergunta, eu a escolho como A resposta. No entanto, a resposta de Interstellar_coder também é boa, mas você explicou que isso pode ser uma armadilha se usado incorretamente. Eu estarei limitando o número máximo de itens e estarei fazendo muitas validações neste formulário, então não devo encontrar nenhum problema de segurança a menos que haja problemas inerentes a esta abordagem que não foram explicados aqui.
Adam,
10
@Adam: Tendo relido sua pergunta, esta é uma abordagem perfeitamente acessível. Você pode querer ir mais longe e ter address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Você pode ler isso com $_POST['address'][0]['city'], por exemplo
Eric,
Como isso seria nomeado dentro do HTML? Isso potencialmente diminuiria bastante a dificuldade. A abordagem que eu iria adotar é ter vários campos nomeados assim: l1 [], l2 [], cidade [], estado [], zip [], zip4 []. Então, para o primeiro endereço, simplesmente uso $ i == 0 em cada campo. Portanto, se entendi sua abordagem corretamente, provavelmente nomearia meus elementos como: name = "address [] [city]" para um campo de cidade. Isso está correto?
Adam,
@Adam: Possivelmente. Acho que você pode precisar colocar o índice dentro do primeiro [], como [0]. Isso torna o HTML mais difícil de gerar, mas os dados não são mais difíceis de ler no lado do PHP
Eric,
A questão que vem à minha mente aqui é: se o campo irá em ordem aleatória dentro do array? ou eles estarão na ordem em que são apresentados no formulário (mesmo se alguns campos forem deixados em branco)?
rajeev
38

Em seu html você pode passar um array para o nome, ou seja

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

Desta forma, o php receberá uma série de endereços.

aziz punjani
fonte
3
Resposta boa e correta, por isso votei. Você não explicou muito sobre isso, porém, é por isso que eu não o selecionei como a resposta à minha pergunta. Isso me ajuda muito, já que venho tentando descobrir isso há algum tempo (como você pode perceber em uma de minhas perguntas anteriores). Minha abordagem anterior era simplesmente adicionar todas as entradas aos campos ocultos com * valores separados e redefinir os campos de entrada, mas esta abordagem é dez vezes melhor, pois poderei permitir a exclusão de endereços adicionados anteriormente se for descoberto que eles são incorreta.
Adam,
Apenas tome cuidado para lembrar que um array vazio terá uma contagem de 1 tendo sido POST'ed sem nada no índice '0'. Você precisará verificar usando a palavra-chave 'vazia' if (! Empty ($ arrayName)) {// fazer algo}
Fi Horan
10

A resposta de Eric está correta, mas o problema é que os campos não estão agrupados. Imagine que você tem várias ruas e cidades que pertencem uma à outra:

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

O resultado seria

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

Para agrupá-los por endereço, prefiro recomendar usar o que Eric também mencionou na seção de comentários:

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

O resultado seria

$POST = [ 'address' => [ 
                 1 => ['street' => 'Hauptstr', 'city' => 'Berlin'],
                 2 => ['street' => 'Wallstreet', 'city' => 'New York'],
              ]
        ]
Adão
fonte
0

Para qualquer outra pessoa que encontrar isso - é importante notar que você pode definir o valor da chave no nome da entrada. Graças à resposta em POSTAR campos de formulário com o mesmo atributo de nome, você também pode interagir com strings ou inteiros sem aspas.

As respostas assumem que você não se importa com o valor da chave voltando para o PHP, entretanto, você pode definir name=[yourval](string ou int), o que permite que você consulte um registro existente.

Antony
fonte
Isso é um absurdo analisá-lo sozinho. Não há cenário de que isso seja necessário.
Javid
0

Pode ser:

echo "Welcome".$_POST['firstname'].$_POST['lastname'];
Azeemunnisa
fonte