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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

253閲覧

PHPの配列をjQueryで受け取る

Chandler_Bing

総合スコア673

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/02/11 16:39

編集2019/02/13 09:22

PHPには配列が入っており、POST飛んできた場合のみ配列を返します。またPOSTの値によって返す変数が異なります。
関数Pics,Tagsを使用すると、見つからないという旨のエラーが出ます。問題があるとすれば関数の書き方かなと思うのですが、どこが間違っていますでしょうか。

ReferenceError: Can't find variable: res

PHP

1<?php 2$hotels = array( 3 array('hotel_id' => '1', 'country_code'=>'PHL', 'hotel_name'=>'SARROSAホテル', 'hotel_address'=>'セブ シティ, セブ', 'hotel_tel'=>'12345', 'price'=>'30'), 4 array('hotel_id' => '2', 'country_code'=>'PHL', 'hotel_name'=>'SPAホテル', 'hotel_address'=>'セブ シティ, セブ', 'hotel_tel'=>'12345', 'price'=>'40'), 5 array('hotel_id' => '3', 'country_code'=>'PHL', 'hotel_name'=>'MATTHERホテル', 'hotel_address'=>'セブ シティ, セブ', 'hotel_tel'=>'12345', 'price'=>'50') 6); 7$pics = array( 8 array('hotel_id' => '1', 'country_code'=>'PHL', 'pic'=>'hotel_idが1の画像です'), 9 array('hotel_id' => '2', 'country_code'=>'PHL', 'pic'=>'hotel_idが2の画像です'), 10 array('hotel_id' => '3', 'country_code'=>'PHL', 'pic'=>'hotel_idが3の画像です') 11); 12$tags = array( 13 array('hotel_id' => '1', 'country_code'=>'PHL', 'tag'=>'無料Wi-Fi'), 14 array('hotel_id' => '1', 'country_code'=>'PHL', 'tag'=>'後日支払い可'), 15 array('hotel_id' => '1', 'country_code'=>'PHL', 'tag'=>'宿泊施設へ直接支払い'), 16 array('hotel_id' => '2', 'country_code'=>'PHL', 'tag'=>'キャンセル無料'), 17 array('hotel_id' => '2', 'country_code'=>'PHL', 'tag'=>'無料Wi-Fi'), 18 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'無料Wi-Fi'), 19 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'後日支払い可'), 20 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'宿泊施設へ直接支払い'), 21 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'朝食付き'), 22 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'キャンセル無料') 23); 24if ($_SERVER['REQUEST_METHOD'] === 'POST') { 25 if (isset($_POST['kind']) && $_POST['kind'] == 'pics') { 26 header('Content-Type: application/json'); 27 echo json_encode($pics); 28 exit; 29 } elseif (isset($_POST['kind']) && $_POST['kind'] == 'tags') { 30 header('Content-Type: application/json'); 31 echo json_encode($tags); 32 exit; 33 } elseif (isset($_POST['kind']) && $_POST['kind'] == 'hotels') { 34 header('Content-Type: application/json'); 35 echo json_encode($hotels); 36 exit; 37 } 38}

JS

1<script> 2 $(function() { 3 4 function Pics() { 5 $.post('sampleAjax.php', { 6 kind: 'pics' 7 }, function(reslut) { 8 var res = reslut; 9 }); 10 return res; 11 }; 12 13 14 function Tags() { 15 $.post('sampleAjax.php', { 16 kind: 'tags' 17 }, function(reslut) { 18 var res = reslut; 19 }); 20 return res; 21 }; 22 23 24 $('#push').on('click', function() { 25 // ajax処理 26 $.post('sampleAjax.php', { 27 kind: 'hotels' 28 }, function(reslut) { 29 //配列が返ってくる(動作確認済 30 console.log(reslut); 31 console.log(Tags()); 32 }); 33 return false; 34 }); 35 }); 36</script>

追記

JS

1<script> 2 $(function() { 3 4 var array = []; 5 6 function pics() { 7 $.post('sampleAjax.php', { 8 kind: 'picks' 9 }, function(reslut) { 10 array = reslut; 11 // array.push(reslut); 12 }); 13 return array; 14 }; 15 16 function tags() { 17 $.post('sampleAjax.php', { 18 kind: 'tags' 19 }, function(reslut) { 20 console.log(reslut); 21 array = Object.keys(reslut);; 22 }); 23 return array; 24 }; 25 26 27 $('#push').on('click', function() { 28 $.post('sampleAjax.php', { 29 kind: 'hotels' 30 }, function(reslut) { 31 //配列が返ってくる(動作確認済 32 // console.log(reslut); 33 // console.log(tags()); 34 console.log(pics()); 35 }); 36 return false; 37 }); 38 }); 39</script>

「追記」
回答のおかげで、上手く行きました。
画像ではconsole.logの返り値がPHPの配列$hotelsの部分だけ [Object, Object, Object] なっています。
違いはなんなのでしょうか。他のPHPの配列と形は同じなのですが。。。

また順番を変えたり、

function pics() { return $.post('sampleAjax.php', { kind: 'hotels' }); };

のようにしても同じでした。
イメージ説明

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

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

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

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

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

m.ts10806

2019/02/12 00:07

起きている問題に対してタイトルが大きすぎる。
guest

回答2

0

変数のスコープ

投稿2019/02/12 00:05

m.ts10806

総合スコア80850

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

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

m.ts10806

2019/02/12 01:05

これでピンとこなければあなたがやろうとしていることはあなたの持っている技術知識に対しては難しすぎるので基礎の基礎の基礎からやりなおすことを強くすすめる。 エラー調べません、マニュアル・リファレンス読みません、自分のコードは間違ってない ではteratailで質問する上で話にならない。
退会済みユーザー

退会済みユーザー

2019/02/12 11:07

ちなみに404 not found でも正常にデータがとれると思ってる模様
m.ts10806

2019/02/12 16:29

私のコメント全無視してる時点でお察し案件です。
退会済みユーザー

退会済みユーザー

2019/02/12 23:29

そして 月曜が~木曜の~とかの質問解決済みになってるのに同じての質問がまた投稿されてるし(笑)
m.ts10806

2019/02/13 00:00

もはや質問ではないですからね デバッグ依頼。作業依頼もコメントでしてるようなもんです
guest

0

ベストアンサー

エラーメッセージから察するに、var resを定義している場所によるスコープの違いの問題のように思います。

js

1// resはfunctionの外で定義する 2var res = null; 3$.post('sampleAjax.php', { 4 kind: 'tags' 5}, function(reslut) { 6 // function内部で定義された変数は関数の外では使えない 7 res = reslut; 8}); 9return res;

追記 : 非同期通信の結果を関数からreturnさせるため、全体の構造を修正しました。

js

1 $(function() { 2 var array = []; 3 4 // 関数からは$.postの結果をreturnする 5 function pics() { 6 return $.post('sampleAjax.php', { 7 kind: 'picks' 8 }); 9 }; 10 11 function tags() { 12 return $.post('sampleAjax.php', { 13 kind: 'tags' 14 }); 15 }; 16 17 $('#push').on('click', function() { 18 $.post('sampleAjax.php', { 19 kind: 'hotels' 20 }, function(result) { 21 // 返り値のdone関数を使って、非同期通信の結果を取得できます。 22 pics().done(function(result) { 23 console.log('pics', result); 24 }); 25 tags().done(function(result) { 26 console.log('tags', result); 27 }); 28 }); 29 return false; 30 }); 31 });

投稿2019/02/12 00:05

編集2019/02/12 14:54
noka_blank

総合スコア252

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

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

Chandler_Bing

2019/02/12 08:10

ありがとうございます。追記します。
m.ts10806

2019/02/12 08:17

スコープもそうですけど、returnの場所ですね。非同期ですし。
Chandler_Bing

2019/02/12 12:02

どこに書けば良いのでしょうか
noka_blank

2019/02/12 14:59

ご指摘にあった通り、非同期通信の結果を取得する部分に問題があるようなので、回答に追記しました。 エラーメッセージは確かに変数のスコープのことを指しておりますが、おそらくYutaNkaiさんの欲しい回答はこちらではないでしょうか?
Chandler_Bing

2019/02/13 08:59

ありがとうございます。上手く機能しました。doneを使用していなかった事が問題なのでしょうか。
noka_blank

2019/02/13 09:59

jQuery(だけではないですが)では、非同期通信の結果はすぐにreturnされずに、コールバック関数を使って後から通知されます。 doneはそのコールバック関数にあたるものなので、間違いではないですが、問題はもう少し基礎的な、非同期通信とは何かという部分にあると思います。
Chandler_Bing

2019/02/13 10:44

ありがとうございます。しかし最初の質問でもコールバック関数をfunction(){}を使い記述しているのではないのでしょうか。
noka_blank

2019/02/13 13:09

最初は、以下の書き方でした。 プログラムはコメントの数字の順番に実行されます。 function Pics() { // 1. 最初に非同期通信を開始 $.post('sampleAjax.php', { kind: 'pics' }, function(reslut) { // 3. 通信の結果が返ってきたら実行 var res = reslut; }); // 2. 通信の結果を待たずにreturn return res; }; 2の時点で未定義の変数をreturnしようとしているため、エラーになりました。 エラーは変数を定義することで解消されますが、それは本質的な解決ではない、という指摘がされましたので、回答のように修正しました。 YutaNkaiさんのご質問のコードは、非同期通信の結果を待たずにreturnされたものを、console.logで出力しようとしていた、という事になります。
Chandler_Bing

2019/02/14 07:47

なるほどよくわかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問