PHPのPOSTによる同じ名前の複数の入力


119

同じ名前の複数の入力を取得して投稿し、PHPからそれらにアクセスすることは可能ですか?アイデアは次のとおりです。私は、他の情報とともに無制限の数の物理アドレスを入力できるフォームを持っています。複数のエントリでこれらの各フィールドに同じ名前を付けて、そのデータをポスト経由で送信した場合、PHPはそれにアクセスできますか?

たとえば、「xyz」という名前の1つのページに5つの入力があり、PHPを使用してそれらにアクセスしたいとします。次のようなことができますか?

    $_POST['xyz'][0]

もしそうなら、私はフォームを通じて無制限の量の情報を送信し、「xyz」という名前のアイテムの配列をループするだけでサーバーによってそれを処理させることができるので、私の人生を10倍簡単にします。

回答:


216

入力の名前を変更します。

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

次に:

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

もしそうなら、私はフォームを通じて無制限の量の情報を送信し、「xyz」という名前のアイテムの配列をループするだけでサーバーによってそれを処理させることができるので、私の人生を10倍簡単にします。

これはおそらく間違った解決策であることに注意してください。明らかに、それはあなたが送信しているデータに依存します。


助けてくれてありがとう。これが私の質問に対する最も完全な答えなので、私はそれを答えとして選択します。ただし、Interstellar_coderからの回答も適切ですが、誤って使用した場合、これが潜在的な落とし穴になる可能性があることを説明しました。アイテムの最大数を制限し、このフォームで多くの検証を行うので、ここで説明されていないこのアプローチに固有の問題がない限り、セキュリティの問題に遭遇しないでください。
アダム、

10
@アダム:あなたの質問をもう一度読んで、これは完全に受け入れ可能なアプローチです。あなたはさらに1つのステージに進みたいと思うかもしれませんがaddress[0][street] address[0][city] address[0][zip]address[1][street] address[1][city] address[1][zip]...これら$_POST['address'][0]['city']はたとえばで読むことができます
Eric

これをHTML内でどのように命名しますか?それは潜在的にかなり多くの困難を緩和するでしょう。私が取ろうとしていたアプローチは、l1 []、l2 []、city []、state []、zip []、zip4 []のような名前の付いたフィールドをいくつか持つことです。次に、最初のアドレスとして、各フィールドで$ i == 0を使用します。したがって、私があなたのアプローチを正しく理解していれば、おそらく私の要素に次のように名前を付けるでしょう。あれは正しいですか?
アダム

@アダム:たぶん。私はあなたが最初の内側のインデックスを配置する必要があるかもしれないと思う[]ような、しかし[0]。HTMLを生成するのは難しくなりますが、データはPHP側で読み取るのが難しくありません
Eric

ここで私の頭に浮かぶ質問は、フィールドが配列内でランダムな順序で進むかどうかです。または、それらはフォームに配置された順序になりますか?
rajeev 2013年

38

あなたのhtmlでは、名前のための配列を渡すことができますすなわち

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

このようにして、phpはアドレスの配列を受け取ります。


3
正解は正解です。そのため、私は投票しました。あなたはそれについてあまり説明しなかったので、私はそれを私の質問への回答として選択しませんでした。私はこれをしばらくの間理解しようとしてきたので、これは私にトンを助けます(私の以前の質問の1つで気づくかもしれませんが)。私の以前のアプローチは、すべての入力を*で区切られた値を持つ非表示フィールドに単に追加し、入力フィールドをリセットすることでしたが、このアプローチは、以前に追加されたアドレスが削除された場合にそれを削除できるようにするため、10倍優れています。正しくない。
アダム

空の配列は、「0」インデックスに何もない状態でPOSTされたカウントが1になることに注意してください。'empty'キーワードを使用して確認する必要がありますif(!empty($ arrayName)){// do something}
Fi Horan

10

エリックの答えは正しいですが、問題はフィールドがグループ化されていないことです。一緒に属する複数の通りと都市があると想像してください:

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

結果は

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

それらをアドレスでグループ化するには、Ericがコメントセクションでも述べたものを使用することをお勧めします。

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

結果は

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

0

これを見つけた他の人にとっては、入力名にキー値を設定できることは注目に値します。同じ名前属性持つフォームフィールドのPOSTでの回答のおかげで、引用符なしで文字列または整数を相互作用させることもできます。

答えは、PHPに返されるキー値を気にしないことを前提としていますがname=[yourval]、既存のレコードを参照できるように(stringまたはint)を設定できます。


これを自分で解析するのは無意味です。これが必要になるシナリオはありません。
Javid

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.