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

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

ただいまの
回答率

88.93%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 8,218

ssmxgo

score 168

追記1

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

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

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

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


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

ちなみに正確なデータは

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

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

最初の投稿

Ajaxでポストしたデータを受けた受け側で値を取得したい

該当のソースコード

main.html

$.ajax({
    url: '/test.php',
    type: 'post',
    data: JSON.stringify({"first_name":"一郎", "last_name":"鈴木"}),
    dataType: "json",
    contentType: 'application/json',
    success: function(result, textStatus, xhr) {
        console.debug(result);
        alert('OK');
    },
    error: function(xhr, textStatus, error) {
        alert('NG...');
    }
});

/test.php

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

結果(コンソール) orz

result: Array[0]

ご教授ください

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

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

jsonで出し入れする場合

$.ajax({
    url: '/test.php',
    type: 'post',
    data: {"first_name":"一郎", "last_name":"鈴木"},
    dataType: "json",
    success: function(result, textStatus, xhr) {
        console.debug(result);
    },
});

textで出し入れする場合

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/19 14:11

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

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/19 13:32

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

    キャンセル

  • 2016/08/19 14:11

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

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/19 14:23

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

    キャンセル

checkベストアンサー

+1

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/19 14:17

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

    結構複雑過ぎて驚いています

    キャンセル

  • 2016/08/19 14:19

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

    キャンセル

  • 2016/08/19 14:30

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

    キャンセル

  • 2016/08/19 14:42

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

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る