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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

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

解決済

2回答

2267閲覧

AJAXでjavascriptからphpにjsonデータを送りたい。

sumou_man

総合スコア10

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

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グッド

0クリップ

投稿2022/03/03 09:45

編集2022/03/03 10:46

javascriptファイルからphpファイルへjsonデータを送信したいがnullとなってしまう。

前提・実現したいこと

・javascriptにてjsonデータをPHPファイルに送信。
・phpファイルで受け取ったjsonデータを加工。

発生している問題

phpファイルでjsonデータを受け取れず、nullが返ってくる。

該当のソースコード

javascript

1!function(){ 2 let btn = document.querySelector('#get'); 3 btn.addEventListener('click', function(){ 4 5 //テストJSONデータ 6 var json_data = JSON.stringify({ "Language": "en" }); 7 //送信先PHP 8 var url = "handler"; 9 10 //ajax処理開始 11 var xhr = new XMLHttpRequest(); 12 13 xhr.onreadystatechange = function(){ 14 if(xhr.readyState === 4 && xhr.status === 200){ 15 document.getElementById('out').innerHTML = this.responseText; 16 } 17 }; 18 19 xhr.open('POST', url, true); 20 xhr.setRequestHeader("content-type", "application/json;charset=UTF-8"); 21 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 22 xhr.send(json_data); 23 }); 24}();

PHP

1if ($_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') { 2 die(json_encode(array('stat' => "参照不成功:不正な呼び出し"))); 3} 4// ファイル受け取り 5$json = file_get_contents('php://input'); 6// jsonデコード 7$data = json_decode($json, true); 8var_dump($data);

対応内容

・送信データのリクエストヘッダーはjson形式に修正。
・ajax送信時のセキュリティ対策として'X-Requested-With'を追加。
(上記の記述を消しても問題は解消しませんでした。)
・ajaxのレスポンスは問題なく、phpファイルに作成したコードの出力は問題なし。

使用ツール

・xampp

追記

PHP Version 8.1.2
確認ブラウザ googleChrome microsoft Edge

※回答者様のローカル環境では問題なく動作確認済み。

お手数かけますがよろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/03/03 09:52

Fiddler などのキャプチャツールを使って調べてみましたか?
sumou_man

2022/03/03 11:27 編集

ありがとうございます。当方、勉強不足でキャプチャツールを使ったことがないです。調べてみます! (※追記) FIddler導入してレスポンスコードを確認したところ301のリダイレクト状態になっており、問題解決につながりました!ありがとうございました。
PlugOut777

2022/03/03 10:31 編集

掲示されたソースコードを元に、ローカルで再現させてみようと思ったのですが 該当の症状は発生しませんでした。 (正常にarray(1) { ["Language"]=> string(2) "en" }がHTML内に表示されたという意味です) そのため、掲示された情報以外の部分に問題が潜んでいる可能性が高いと思います。 (ちなみに再現について、XAMPPは利用していません) また、何かのバージョン依存の可能性もありますので ブラウザやPHPのバージョン等を記載しておくと、誰かから何かヒントをもらえるかもしれません。
sumou_man

2022/03/03 10:50

ありがとうございます!正常に表示されてましたか。。。。 仮想環境が原因かもしれないですね。とても助かります。 ブラウザやバージョンについても追記させていただきました。
PlugOut777

2022/03/03 11:22 編集

php8.1.2で試しましたが、やはり再現しませんでした。 ところで一つ気になったのですが > var url = "handler"; こちら、実際には別のURLに置換されるものかと勝手に思い込んでいたのですが もしかしてapache側でルーティングの設定を弄っていますか?
sumou_man

2022/03/03 11:25

ありがとうございます。ちょうど今解決しまして、すみません。おっしゃるとおりルーティングでリダイレクトの状態になっておりそれが原因でした。ベストアンサーにしたいのですが回答にコメントいただけませんか?
PlugOut777

2022/03/03 11:34

いえいえ、解決されたのであれば何よりです。 ベストアンサーにこだわりはありませんので、自己解決にして解決内容を書いていただければと思います。
sumou_man

2022/03/03 11:35

とても助かりました。ありがとうございました。
guest

回答2

0

自己解決しました

fiddlerツールを教えていただき、レスポンスコード301(リダイレクト状態)を確認。
コメントのアドバイスを参考にルーティングの設定変更にて解決しました。
お騒がせしました。ありがとうございました。

投稿2022/03/03 11:39

sumou_man

総合スコア10

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

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

0

ベストアンサー

jsonデータをpostするんですよね?パラメータ名はどうするのでしょうか?

//sample.html

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 get.addEventListener('click',()=>{ 4 const json=JSON.stringify({ "Language": "en" }); 5 const body=new FormData(); 6 body.append('json',json); 7 const url = "api.php"; 8 fetch(url,{method:'post',body}).then(res=>res.text()).then(txt=>out.textContent=txt); 9 }); 10}); 11</script> 12<input type="button" value="get" id="get"> 13<div id="out"></div>

//api.php

PHP

1<?PHP 2$json=filter_input(INPUT_POST,"json"); 3$data = json_decode($json, true); 4var_dump($data);

投稿2022/03/03 10:00

yambejp

総合スコア114843

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

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

sumou_man

2022/03/03 10:10

ご回答ありがとうございます。勉強不足のためご質問の意図がわかりかねます故、お門違いな回答となったら申し訳ありません。 テスト用データとして、jsonデータのパラメータ名は"Language"、値は"en"としております。 本来はもっと長いjsonデータで、あるAPIにjsonデータを送信・結果を加工してページに反映する予定です。 ただ受け渡しがうまくいかないため、できる限り簡略化してjavascriptからphpに受け取るところまで確認しようとしている次第でございます。
yambejp

2022/03/03 10:28 編集

一般にPOST/GETでデータを送るときにはそのデータに対するパラメータ名を別途つけます。 逆に「"Language": "en"」というデータ、つまりLanguageというパラメータ名でenを送りたいなら JSONにする意味はありません。私の回答の流れが普通のやり方です。なにか不都合があるようでしたら ご指摘ください
sumou_man

2022/03/03 10:59

いえいえ、ありがとうございます。特に不都合というのはございません。海外のページが複数あるためlanguageはURLから、それ以外は各項目ごとに任意のパラメータを命名するかと思います。(特徴や色などあるためそれぞれ英文字でパラメータにするかと)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問