ページを更新させずにjavascriptファイルからPHPファイルへの値渡しをしたくて、ajaxで非同期通信をしようとしているのですが、[null,null]という値しか渡ってきません。
successの場合にコンソールに「ajax通信に成功しました」と表示されるようにしていて、それは表示されているので通信はしているのだと思います。
どうすればjavascriptファイルの変数の値がPHPファイルで取得できるようになるでしょうか?
PHP
1index.php 2<!DOCTYPE html> 3<html> 4<head> 5 <meta charset="UTF-8" /> 6 <meta http-equiv="x-ua-compatible" content="IE=Edge" /> 7 <meta name="viewport" content="width=device-width, user-scalable=no" /> 8 <meta name="apple-mobile-web-app-capable" content="yes" /> 9 <title>仮のタイトル</title> 10 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 11 12 <script type="text/javascript" src="main.js"></script> 13 <style type="text/css"> 14 body { 15 margin: 0; 16 padding: 0; 17 } 18 </style> 19 20 <?php 21 require("ajax.php"); 22 ?> 23 24</head> 25<body> 26</body> 27</html>
JavaScript
1main.js 2jQuery(function($){ 3 //ajax送信 4 $.ajax({ 5 url : "ajax.php", 6 type : "POST", 7 dataType:"json", 8 data : {post_data_1:"hoge", post_data_2:"piyo"}, 9 error : function(XMLHttpRequest, textStatus, errorThrown) { 10 console.log("ajax通信に失敗しました"); 11 }, 12 success : function(response) { 13 console.log("ajax通信に成功しました"); 14 console.log(response[0]); 15 console.log(response[1]); 16 } 17 }); 18});
PHP
1ajax.php 2<?php 3//ajax送信でPOSTされたデータを受け取る 4$post_data_1 = $_POST['post_data_1']; 5$post_data_2 = $_POST['post_data_2']; 6//受け取ったデータを配列に格納 7$return_array = array($post_data_1, $post_data_2); 8//「$return_array」をjson_encodeして出力 9echo json_encode($return_array); 10?>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサー
修正
まずajaxの通信先と、jsを読み込んで実行するページは別にしてください。HTMLを表示するためのphpと、Ajax通信するためのphpが一緒のファイルだとわけの分からない動作になります。仮にAjax通信のためのファイルをajax.phpとして、ページ表示のためのファイルをindex.phpとして、Ajax通信を行うJavaScriptファイルをmain.jsとして下記に記述します。
index.php
HTML
1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8" /> 5 <meta http-equiv="x-ua-compatible" content="IE=Edge" /> 6 <meta name="viewport" content="width=device-width, user-scalable=no" /> 7 <meta name="apple-mobile-web-app-capable" content="yes" /> 8 <title>仮のタイトル</title> 9 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 10 <script src="http://code.jquery.com/jquery.js"></script> 11 <script type="text/javascript" src="main.js"></script> 12 <style type="text/css"> 13 body { 14 margin: 0; 15 padding: 0; 16 } 17 </style> 18</head> 19<body> 20 21</body> 22</html>
ajax.php
PHP
1<?php 2//ajax送信でPOSTされたデータを受け取る 3$post_data_1 = $_POST['post_data_1']; 4$post_data_2 = $_POST['post_data_2']; 5//受け取ったデータを配列に格納 6$return_array = array($post_data_1, $post_data_2); 7//ヘッダーの設定 8header('Content-type:application/json; charset=utf8'); 9//「$return_array」をjson_encodeして出力 10echo json_encode($return_array); 11 12?>
main.js
JavaScript
1jQuery(function($){ 2 //ajax送信 3 // ********************** 4 // URLをajax.phpにすること 5 // ********************** 6 $.ajax({ 7 url : "ajax.php", 8 type : "POST", 9 data : {post_data_1:"hoge", post_data_2:"piyo"}, 10 error : function(XMLHttpRequest, textStatus, errorThrown) { 11 console.log("ajax通信に失敗しました"); 12 }, 13 success : function(response) { 14 console.log("ajax通信に成功しました"); 15 console.log(response[0]); 16 console.log(response[1]); 17 } 18 }); 19});
あと、このAjaxの書き方はかなり古い時代の書き方です。jQuery1.8以降はこう書きます。
JavaScript
1$.ajax({ 2 url : "ajax.php", 3 type : "POST", 4 data : {post_data_1:"hoge", post_data_2:"piyo"} 5}).done(function(response, textStatus, xhr) { 6 console.log("ajax通信に成功しました"); 7 console.log(response[0]); 8 console.log(response[1]); 9}).fail(function(xhr, textStatus, errorThrown) { 10 console.log("ajax通信に失敗しました"); 11});
もう一点、よく見たらjQuery2回読み込んでるじゃないですか…1回で十分です。jQueryは2回以上読み込むとわけのわからない動作になります。たとえ同一バージョン、同一ファイルであってもです。
HTML
1<script src="http://code.jquery.com/jquery.js"></script>
この行を消してください。あと、こういった「外部のサイトのファイル」を勝手に使うのはご法度です。外部公開用のCDNや、googleapisの埋め込み用はいいですが、他者のサイトのjsを勝手に読み込んだりすると、そのサイトの人に不要なアクセス負荷がかかりますしやめましょう。
追記
AjaxでPHPにデータを飛ばしても、それは「Ajaxに対するレスポンス」が変わるだけで、現在表示されている「ページ」が変わるわけではありません。一般的に、TwitterやFacebookのように「ページの再読み込みをせずに、内容だけ書き換わっていく」処理は、更新するためのデータをPHPからもらい、ページの書き換えはJavaScriptで行います。
index.phpを元ページ、ajax.phpを更新データ用PHP、main.jsをページ更新用処理として説明します。
#index.php
HTML
1<!--省略--> 2<body> 3 <div id="response0"></div> 4 <div id="response1"></div> 5</body>
元ページにresponse0、response1というdivを記述しておくことで、ajaxからのレスポンスを入れる箱を用意します。
#ajax.php
PHP
1<?php 2//ajax送信でPOSTされたデータを受け取る 3$post_data_1 = $_POST['post_data_1']; 4$post_data_2 = $_POST['post_data_2']; 5//受け取ったデータを配列に格納 6//そのまま返すだけだと伝わりにくいので、文字を加工して返す 7$return_array = array("PHPに送られたpost_data_1:".$post_data_1, "PHPに送られたpost_data_2:".$post_data_2); 8//ヘッダーの設定 9header('Content-type:application/json; charset=utf8'); 10//「$return_array」をjson_encodeして出力 11echo json_encode($return_array); 12 13?>
AjaxからPHPに送られてきた値を元に、元ページに表示するためのデータをPHPの中で作成して、Ajaxにレスポンスとして返します。
#main.js
JavaScript
1 2jQuery(function($){ 3 //ajax送信 4 // ********************** 5 // URLをajax.phpにすること 6 // ********************** 7 $.ajax({ 8 url : "ajax.php", 9 type : "POST", 10 data : {post_data_1:"hoge", post_data_2:"piyo"} 11 }).done(function(response, textStatus, xhr) { 12 console.log("ajax通信に成功しました"); 13 14 //responseにはajax.phpが返したレスポンスが入っている 15 16 // 元ページのresponse0のdivに、PHPから返されたresponse[0]を入れる 17 $("#response0").text(response[0]); 18 19 // 元ページのresponse1のdivに、PHPから返されたresponse[1]を入れる 20 $("#response1").text(response[1]); 21 22 }).fail(function(xhr, textStatus, errorThrown) { 23 console.log("ajax通信に失敗しました"); 24 }); 25});
最後に、ajax通信で受け取ったレスポンスを使って、元ページを書き換えます。
#PHPの動作、JavaScriptの動作を理解していないようなので
PHPを事務員、ブラウザをあなたに例えて話をしましょう。
事務員さんにあなたはindex.phpという書類を紙に書いて自分に渡してくれと頼みました。事務員さんは自分の手元にあるindex.phpというお手本を元に、紙に書き込んであなたに渡しました(レスポンス)。その後、あなたは事務員さんに「ちょっとここ変えたいから書き直して」とお願いしても、PHPさんは事務処理上もう渡しちゃった紙(レスポンス)を書き直すことはできません。事務員さんに紙を書き直して、と頼むことはそれはすなわちブラウザのリロードです。部分的に書き換える処理がしたいのであれば、あなた(ブラウザ)の持つ修正用のペン(JavaScript)とajaxという手続きを使います。あなた(ブラウザ)は「じゃあこういうデータを渡すから、書き直す内容だけ教えて(ajax)」と頼みます。すると事務員さんはあなたから渡されたデータ(POSTデータ)を元に、書き直すべき内容をあなた(ブラウザ)に教えてくれます(Ajaxに対するレスポンス)。あなたは自分が使うことのできる修正用のペン(JavaScript)を使って、もらった内容を元に書き換えるのです。
投稿2017/03/22 00:59
編集2017/03/23 02:37総合スコア9210
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
とりあえずこうしてみてください
HTML
1<?PHP 2if($_SERVER["REQUEST_METHOD"]=="POST"){ 3 $post_data_1 = filter_input(INPUT_POST,'post_data_1'); 4 $post_data_2 = filter_input(INPUT_POST,'post_data_2'); 5 $return_array = array($post_data_1, $post_data_2); 6 header('Content-type:application/json; charset=utf8'); 7 echo json_encode($return_array); 8 exit; 9} 10?> 11<!DOCTYPE html> 12<html> 13<head> 14<meta charset="UTF-8" /> 15<meta http-equiv="x-ua-compatible" content="IE=Edge" /> 16<meta name="viewport" content="width=device-width, user-scalable=no" /> 17<meta name="apple-mobile-web-app-capable" content="yes" /> 18<title>仮のタイトル</title> 19<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 20<script> 21$(function(){ 22 $.ajax({ 23 url : "index.php", 24 type : "POST", 25 data : {post_data_1:"hoge", post_data_2:"piyo"}, 26 error : function(XMLHttpRequest, textStatus, errorThrown) { 27 console.log("ajax通信に失敗しました"); 28 }, 29 success : function(response) { 30 console.log("ajax通信に成功しました"); 31 console.log(response[0]); 32 console.log(response[1]); 33 } 34 }); 35}); 36</script> 37<style type="text/css"> 38body { 39margin: 0; 40padding: 0; 41} 42</style> 43</head> 44<body> 45test 46</body> 47</html>
投稿2017/03/22 02:37
編集2017/03/22 02:37総合スコア117674
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
echo $post_data_1 = $_POST['post_data_1'];
こういう書き方できたかな…?
とりあえずechoを取って普通に変数に入れて見たらどうでしょうか?
後いくつか疑問といいますか、直した方が良さそうなところがあったのだそれも追記しておきます。
1
jQueryが2つ読み込まれているので1つだけにした方がいいです。
2
多分ajaxの結果はjsonで出力したいのだと思いますので、htmlタグは不要なので取った方がいいと思います
投稿2017/03/21 23:23

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
イメージです。データを送信して帰ってくるhtmlをA、送られてきたデータを処理するPHPをBとします。AがBにhogeというデータを送るとします。Bはhogeを受け取り、それを使いPHPに書類のような形でhogeを出します。それをAが見てこんなのが来てるなということで、それを受け取りなんかするならします。Aが処理が終わったらBはそれを処分します。Bは書類を作って渡すという作業をするだけで、自分自身のところには何も残しません。なのでいくらBを見ても、Aの処理が終わった後なのでBには何も残っていません。Aから送られてきた時にBで何か障害が出ればエラー表示くらいしてくれるかもしれませんが、基本Bを見ても値が送られて来てるかわかりません。
投稿2017/03/22 23:40
総合スコア2052
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
PHP は知らない自分がレスするのもなんですが(jQuery.ajax の方は多少分かりますが)・・・
data : {post_data_1:"hoge", post_data_2:"piyo"},
data として渡しているのは JavaScript オブジェクトですね。Web サーバーには JSON 文字列にシリアライズしてコンテンツに含めて渡したい(POST したい)のだと思いますが、そうだとするとそこは JavaScript オブジェクトではなく JSON 文字列にする必要があるのでは?
その理由は以下の記事を見てください。
jQuery.ajax の data の型
http://surferonwww.info/BlogEngine/post/2015/10/05/what-must-be-set-to-data-option-in-jquery-ajax.aspx
上の記事にも書いてありますが、Fiddler などのキャプチャツールを使って、要求ヘッダやコンテンツを見ると何かヒントが得られるかもしれません。
あと、contentType: "application/json; charset=utf-8" の設定がないとうまくいかないということが自分のケースではありました。
質問者さんのケースでは違うかもしれませんが、ご参考まで。
投稿2017/03/22 02:08

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/22 02:36

退会済みユーザー
2017/03/22 03:27 編集
2017/03/22 03:26 編集

退会済みユーザー
2017/03/22 03:44
2017/03/22 03:56

退会済みユーザー
2017/03/22 04:07

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。