質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

4回答

18136閲覧

Ajaxでポストしたデータが、送り先側の$_POSTで取得できない(基礎?)

ssmxgo

総合スコア178

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

2クリップ

投稿2016/08/19 03:38

編集2016/08/19 05:09

##追記1
JSON.stringify({"first_name":"一郎", "last_name":"鈴木"})
のJSON.stringifyを省くことで手動入力した{"first_name":"一郎", "last_name":"鈴木"}は正しく$_POSTとして取得できました。ありがとうございました。

どうも間違っていた部分がありました。
JSON.stringify() の利用はフォームに入力された配列データをjson形式にする際に必要な物でした
(問題の切り分けのため、手動でデータを入力してテストしていました。余計な混乱を与え申し訳ありません)

で、その部分のコードはこのようになっています。

html

1data: JSON.stringify($("#form").serializeArray()), 2 JSONエンコード 配列

このdata をconsole.logに吐き出してみると、その実態は
[{"first_name":"一郎", "last_name":"鈴木"}]
のように、先ほどの手動入力のjsonデータ{"first_name":"一郎", "last_name":"鈴木"}[]でくくられるような形式でした。

ちなみに正確なデータは

[{"name":"0","value":"生年月日"},{"name":"1","value":"氏名"}]

jsonのデータとしては間違っていないような気がしますが、これが問題なのでしょうか?
また、このようなフォームの値をポストしたい場合、みなさんはどうされていますか?

##最初の投稿
###Ajaxでポストしたデータを受けた受け側で値を取得したい

##該当のソースコード
###main.html

javascript

1$.ajax({ 2 url: '/test.php', 3 type: 'post', 4 data: JSON.stringify({"first_name":"一郎", "last_name":"鈴木"}), 5 dataType: "json", 6 contentType: 'application/json', 7 success: function(result, textStatus, xhr) { 8 console.debug(result); 9 alert('OK'); 10 }, 11 error: function(xhr, textStatus, error) { 12 alert('NG...'); 13 } 14});

###/test.php

php

1<?php 2echo json_encode(['result'=>$_POST]);

###結果(コンソール) orz

result: Array[0]

###ご教授ください
根本的にajaxの利用の仕方を理解していないのですが、よろしくご教授ください
※可能であれば、ajaxで呼ばれた側のdebugの仕方のヒントになるようなサイトなど教えていただけると幸いです

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

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

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

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

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

guest

回答4

0

どういった戻り値を期待しているかによりますが

jsonで出し入れする場合

javascript

1$.ajax({ 2 url: '/test.php', 3 type: 'post', 4 data: {"first_name":"一郎", "last_name":"鈴木"}, 5 dataType: "json", 6 success: function(result, textStatus, xhr) { 7 console.debug(result); 8 }, 9});

textで出し入れする場合

javascript

1$.ajax({ 2 url: '/test.php', 3 type: 'post', 4 data: JSON.stringify({"first_name":"一郎", "last_name":"鈴木"}), 5 dataType: "text", 6 success: function(result, textStatus, xhr) { 7 console.debug(result); 8 }, 9});

投稿2016/08/19 04:30

yambejp

総合スコア116724

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

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

ssmxgo

2016/08/19 05:11

詳細までありがとうございます! テスト用データに誤って付けてしまっていたようです。追記を書きましたのでもしよろしければ冒頭だけ目を通していただけたら幸いです。
guest

0

ajax のデバッグですが、Chrome 等の開発ツールで通信内容を確認すると捗ります。
Chrome の例で言うと、
F12 → Network → POST 先のファイル名の選択
で、通信内容を確認することが出来ます。
headers 内の POST 内容と Responce を確認することで、問題ファイルの特定が可能となります。

投稿2016/08/19 04:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssmxgo

2016/08/19 05:23

これは勉強になりました!!! コレを見る限り、contentTypeの指定をコメントアウトしても Request Headers Accept:application/json, になってますねぇ。ということは$_POSTの取得はそもそも不可能ということになるのかなぁ(汗)
guest

0

contentType: 'application/json',
JSON.stringify()
はいらないです
test.phpは
$result = array("result"=>$_POST);
echo json_encode ($result);
などとします。
データを調べるときは要素の検証などを出した後
Object
をクリックするとデータが出てきます。

投稿2016/08/19 04:25

date

総合スコア1820

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

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

ssmxgo

2016/08/19 04:32

きた!!!!出来ました。 どうも根本的に、JSON.stringify() の扱いの理解がわかってないようでした
ssmxgo

2016/08/19 05:11

と、思いましたがすみません、テスト用データに誤って付けてしまっていたようです。追記を書きましたのでもしよろしければ冒頭だけ目を通していただけたら幸いです。
guest

0

ベストアンサー

contentType: 'application/json' 、JSON.stringify() で送る場合、 JSON形式で送るので、PHP側は $_POST で受け取れません。

php

1$json = file_get_contents('php://input'); 2$data = json_decode($json, true); 3echo json_encode( array("result" => $data ));

のようにしないと取得できません。
この件のデータでは普通に送ればいいので不要ですね。

投稿2016/08/19 05:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssmxgo

2016/08/19 05:17

結果的に、予備知識になりましたが衝撃です。 追記を書きましたが、formからデータをserializeArrayで取得しそれをjsonエンコードするのに JSON.stringify を使わざるを得ません…が、そうすると受け口は file_get_contents を使わないといけないのでしょうか? それとも、contentTypeを指定しなければ$_POSTで取得できるのでしょうか? 結構複雑過ぎて驚いています
退会済みユーザー

退会済みユーザー

2016/08/19 05:19

質問が変わってますね… そういうデータを送るときには いわゆる普通のPOST name1=val1&name2=val2 のようなデータにならないので その方法で送るわけです。
ssmxgo

2016/08/19 05:30

なるほど…、理解できたかもしれません。 かつ、ご指摘とおりfile_get_contentsで取得することが出来ました。 ということは、jsonを使う場合はfile_get_contentsがセット POSTで受け取りたい場合はserializeをセット というような形で使うのですね。根本的にfile_get_contents('php://input');を知りませんでした恥
ssmxgo

2016/08/19 05:42

完璧です、理解できました!!!! 今まで悩んできたので大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問