質問するログイン新規登録
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

836閲覧

PHPでの$_POSTデータ受信 配列の値が上書きされる

ojikakara

総合スコア1

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2022/04/09 20:30

0

1

行き詰ってしまったので質問させてください。

経緯

某サービス案件にて、システムを担当する会社様【以下、先方】サーバからPOSTデータが送信され
それを自社サーバ側(Xサーバ、PHP)で受け取る。というだけの内容となりますが、
先方の仕様上、hoge(仮)という名前の配列[1,2]が送られてくる事が想定される場合、自サーバ側PHPで以下のように実装をします。

$hoge = $_POST["hoge"]; $hoge1 = $hoge[0]; $hoge2 = $hoge[1];

しかし、この結果、以下のような結果となります。

$hoge1 //2 $hoge2 //"" ←空

そこで先方へ問い合わせたところ、以下のような通知ログというファイルが送られてきました

my_site.co.jp → 自社サイトドメイン(仮)
get_post.php → 上記PHPを記載するファイル名(仮)
とします。

wire.header - >> "POST /get_post.php HTTP/1.1[\r][\n]" wire.header - >> "Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS[\r][\n]" wire.header - >> "User-Agent: Jakarta Commons-HttpClient/3.0[\r][\n]" wire.header - >> "Host: my_site.co.jp[\r][\n]" wire.header - >> "Content-Length: 1794[\r][\n]" wire.header - >> "[\r][\n]" wire.content - >> "hoge=1&hoge=2"

私も、あまり自信がないのですが、
wire.contentの、"hoge=1&hoge=2"が配列とは思えず、単に同名のプロパティが上書きされているように思えたので、
先方に再度問い合わせしましたが、配列で取得できるはずとの事なので、
どうも私の取得方法に問題があるようです。
とはいえ、何をどうすれば良いかわからないのですが
上記の情報から、原因が特定できるヒントはありませんでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2022/04/09 20:41

とりあえず var_dump($_POST["hoge"]); やってみたら?
ojikakara

2022/04/09 20:54

ご返答ありがとうございます。 dumpをすると、"2"だけが入ってきます。 array("2", "")という結果を想定していたのですが、2だけでした。。
takasima20

2022/04/09 21:14 編集

まあ、そうなりますよね。 相手方がやるべきは… GET 送信で所定の書式を使うことではないかと。 parse_str('hoge[]=1&hoge[]=2',$x);var_dump($x); 外野からいえるのはこんくらいでしょか。
takasima20

2022/04/09 21:17

あー、ひょっとしたら POST送信でもいけるかもしれません。
madoka-t

2022/04/09 21:38

POSTでも<input type=text name=hoge[]>みたいに書けば配列として取得できますね。 var_dumpの結果を添えて、inputタグのname属性の形式の再確認を先方に依頼した方がよさそうですね。
ojikakara

2022/04/10 08:24

ありがとうございます。先方に再確認してみます
guest

回答1

0

ベストアンサー

PHPの場合パラメータ名の競合を回避するためにはパラメータ名に「[]」をつけることになっています
ついてない場合は後から記載したもので上書きされます

PHP

1<?PHP 2$hoge = filter_input(INPUT_POST,"hoge",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3var_dump($hoge); 4?> 5<form method='post'> 6<input name="hoge[]" value="1"> 7<input name="hoge[]" value="2"> 8<input type="submit" value="send"> 9</form>

投稿2022/04/11 00:46

yambejp

総合スコア118073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ojikakara

2022/04/13 19:30

ご回答ありがとうございます。 上記の本文内で言うところの wire.content - >> "hoge=1&hoge=2"が ↓ wire.content - >> "hoge[]=1&hoge[]=2" になることが正しいという認識で合っていますでしょうか
yambejp

2022/04/14 00:16

wire.contentの仕様はわかりませんが、考え方としてそうです
ojikakara

2022/04/15 06:03

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問