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

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

新規登録して質問してみよう
ただいま回答率
85.50%
jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

PHP

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

Ajax

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

Q&A

解決済

2回答

951閲覧

Ajaxの遷移先のPHPのエラー特定方法

Chandler_Bing

総合スコア673

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

PHP

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

Ajax

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

1グッド

0クリップ

投稿2019/02/22 09:15

編集2019/02/22 09:39

jQueryを使用し、PHPファイルに飛び配列を返すプログラムがあります。コードが機能することは確認済みなのですが、引数等を変更している間にどこかが狂ってしまいました。

PHP

1<?php 2ini_set('display_errors', 1); 3 4var_dump(1);//console.logにでない 5 6$reviews = array( 7 array('hotel_id' => '1', 'country_code'=>'PHL', 'title'=>'気に入りました', 'date'=>'2016/09/21', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'レビューが良かったので気になってたホテル。初めて泊まりましたが常宿決定。 新館に泊まりましたが、価格に対して部屋の広さ、設備が良い。周りに日本食屋が多い。隣りの焼肉屋がとても美味しかった。 ホテルのマッサージも良かった。 8 アヤラモールもタクシーですぐだし、銀行も徒歩圏内。旅行会社も並びにあるみたいで翌日のボホール島のチケットも買えるらしい。とにかく便利で部屋も満足。熱いシャワーも出る。'), 9 10 array('hotel_id' => '1','country_code'=>'PHL', 'title'=>'ロケーション良い', 'date'=>'2016/10/21', 'number'=>'9', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'レビューが良かったので気になってたホテル。初めて泊まりましたが常宿決定。 新館に泊まりましたが、価格に対して部屋の広さ、設備が良い。周りに日本食屋が多い。隣りの焼肉屋がとても美味しかった。 ホテルのマッサージも良かった。 11 アヤラモールもタクシーですぐだし、銀行も徒歩圏内。旅行会社も並びにあるみたいで翌日のボホール島のチケットも買えるらしい。とにかく便利で部屋も満足。熱いシャワーも出る。'), 12 13 array('hotel_id' => '1', 'country_code'=>'PHL','title'=>'セブでベスト', 'date'=>'2016/10/23', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'この値段でこのクオリティは素晴らしい。広さを除けば、部屋のグレードはマルコポーロ・ホテルと遜色ありません。 14 立地もよく便利なホテルです。前面道路の騒音だけがマイナスポイント。おススメです。'), 15 16 array('hotel_id' => '1', 'country_code'=>'PHL','title'=>'good hotel', 'date'=>'2018/10/03', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'PHL', 'text'=>'動きやすい場所にあり、知名度もありホテルに帰るのが楽。部屋はリノベーションされてて綺麗で居心地よい。 17 近くにあるタイのスパはオススメです。前回に続き二度目の利用ですが、次回もここかな。'), 18 19 array('hotel_id' => '1', 'country_code'=>'PHL','title'=>'評判通りの良いホテル”', 'date'=>'2019/01/03', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'評判通りの良いホテル'), 20 21 array('hotel_id' => '1', 'country_code'=>'PHL','title'=>'良いホテル”', 'date'=>'2016/01/23', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'また行きたいと思います'), 22 23 array('hotel_id' => '1','country_code'=>'PHL', 'title'=>'便利なロケーション', 'date'=>'2017/08/07', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'セブに滞在の際利用しますが、交通の利便性、立地環境などがいいとおもいます。 24 価格に対するパフォーマンスもgood!です。') 25); 26 27 28function getReviews($limitation, $cpage, $hotelid, $countrycode) 29{ 30 if (isset($limitation, $cpage, $hotelid, $countrycode)) { 31 global $reviews; 32 $results = array();//返す配列 33 $selectedreviews = array();//国コードとホテルidで選ばれたreviews 34 foreach ($reviews as $review) { 35 if ($review['hotel_id'] == $hotelid && $review['country_code'] == $countrycode) { 36 $selectedreviews[] = $review; 37 } 38 } 39 40 $i = ($cpage * $limitation) - $limitation; 41 $k = $i + $limitation; 42 for ($i; $i < $k ; $i++) { 43 if (isset($selectedreviews[$i])) { 44 $results[] = $selectedreviews[$i]; 45 } 46 } 47 if (count($results) == 0) { 48 return 0; 49 } 50 return $results; 51 } 52} 53 54var_dump(getReviews(5, 1, 1, 'PHL')); 55var_dump(getMaxpage(1, 'PHL')); 56 57 58function getMaxpage($hotelid, $countrycode) 59{ 60 if (isset($hotelid, $countrycode)) { 61 global $reviews; 62 $selectedreviews = array(); 63 foreach ($reviews as $review) { 64 if (($review['hotel_id'] == $hotelid) && ($review['country_code'] == $countrycode)) { 65 $selectedreviews[] = $review; 66 } 67 } 68 return count($selectedreviews); 69 } 70} 71 72if ($_SERVER['REQUEST_METHOD'] === 'POST') { 73 if (isset($_POST['cpage'],$_POST['limitation'],$_POST['hotelid'],$_POST['countrycode'])) { 74 $limitation = $_POST['limitation']; 75 $cpage = $_POST['cpage']; 76 $hotelid = $_POST['hotelid']; 77 $countrycode = $_POST['countrycode']; 78 header('Content-Type: application/json'); 79 echo json_encode(getReviews($limitation, $cpage, $hotelid, $countrycode)); 80 exit; 81 } 82} 83 84if ($_SERVER['REQUEST_METHOD'] === 'POST') { 85 if (isset($_POST['function'],$_POST['hotelid'],$_POST['countrycode']) && $_POST['function'] == 'getMaxpage') { 86 header('Content-Type: application/json'); 87 $hotelid = $_POST['hotelid']; 88 $countrycode = $_POST['countrycode']; 89 $maxpage = getMaxpage($hotelid, $countrycode); 90 echo json_encode([ 91 'maxpage' => $maxpage 92 ]); 93 exit; 94 } 95}

これがajax空の遷移先のPHPです。最上部付近にあるvar_dump(1)が表示されません。どこまでプログラムが進んでいるか分からず困っています。
よろしくお願いします。またPHPのエラーログも更新されていないです。

ちなみにメソッド機能は確認済みなので、動く方のPHPを貼ります。

PHP

1if ($_SERVER['REQUEST_METHOD'] === 'POST') { 2 if (isset($_POST['hotelid'],$_POST['action'],$_POST['countrycode']) && $_POST['action'] == 'plus') { 3 try { 4 $hotelid = $_POST['hotelid']; 5 $action = $_POST['action']; 6 $countrycode = $_POST['countrycode']; 7 $dtabase->updateLikes($hotelid, $countrycode, $action); 8 $reslut = $dtabase->getLikes($hotelid, $countrycode); 9 header('Content-Type: application/json'); 10 echo json_encode($reslut); 11 } catch (PDOException $e) { 12 return false; 13 } 14 exit; 15 } elseif (isset($_POST['hotelid'],$_POST['action'],$_POST['countrycode']) && $_POST['action'] == 'minus') { 16 try { 17 $hotelid = $_POST['hotelid']; 18 $action = $_POST['action']; 19 $countrycode = $_POST['countrycode']; 20 $dtabase->updateLikes($hotelid, $countrycode, $action); 21 $reslut = $dtabase->getLikes($hotelid, $countrycode); 22 header('Content-Type: application/json'); 23 echo json_encode($reslut); 24 } catch (PDOException $e) { 25 return false; 26 } 27 exit; 28 } elseif (isset($_POST['hotelid'],$_POST['action'],$_POST['countrycode']) && $_POST['action'] == 'get') { 29 try { 30 $hotelid = $_POST['hotelid']; 31 $countrycode = $_POST['countrycode']; 32 $reslut = $dtabase->getLikes($hotelid, $countrycode); 33 header('Content-Type: application/json'); 34 echo json_encode($reslut); 35 } catch (PDOException $e) { 36 return false; 37 } 38 exit; 39 } 40}

こちらもAjaxからの処理です。

bochan2👍を押しています

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

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

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

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

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

FKM

2019/02/22 09:21

そのAjax、jsonを使っていますか?
guest

回答2

0

Ajaxはバックグラウンド実行
デバッグしたいときはログファイルに吐き出して実行後に確認するのが通例です。

JavaScript側で確認したければレスポンスの形にあわせてデータを詰め込むしかありません。
決して途中で出力してはいけません。php単体で考えていては成り立たない。

投稿2019/02/22 09:37

編集2019/02/22 09:41
m.ts10806

総合スコア80765

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

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

Chandler_Bing

2019/02/22 09:45

phpのerrorlogに何も出ない場合は、PHPにはエラーがないのでしょうか。 再読み込みしても最終の時間が1時間前から変化ありません。
m.ts10806

2019/02/22 09:48

「ログファイル」はphpのエラーログの話ではないです。 適当なテキストファイルと言ってもいい、自分で作るものです。 でないと、デバッグのためとのログとの切り分け面倒でしょ
guest

0

ベストアンサー

これが原因です。ヘッダ情報を宣言する前に、値を返したらエラーになりますよ。

PHP

1 2var_dump($hoge);//ヘッダの前に値を返したらダメ 3header("Content-Type: application/json; charset=UTF-8"); //ヘッダで宣言してから値を返す 4 5 6echo json_encode($data); //ここで値を返す 7

header

header()関数の前に、何かしら出力させる関数を利用すると、header()関数が機能しなくなり、この時点でPHPプログラムがjsonを認識しなくなります。その状態でjson_encode()を実行しても、jsonにはなりません。

また、javascriptでdataTypeをjsonと指定していると、jsonしか値を受け取れないので、jsonじゃない値が返ってきた場合、レスポンスエラーを表示させます。

試すならば、
0. ヘッダを先頭に持ってきてecho json_encode($hoge)とする。
0. scirptのdataTypeのjsonをコメントアウトし、かつヘッダ情報をコメントアウトする。

いずれかを試してください。

投稿2019/02/22 09:29

編集2019/02/22 10:20
FKM

総合スコア3608

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

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

Chandler_Bing

2019/02/22 09:37

ありがとうございます。私の理解不足ですが、どこの事をおしゃっていただいているのでしょうか。 header('Content-Type: application/json'); echo json_encode(getReviews($limitation, $cpage, $hotelid, $countrycode)); のようにheaderの後に値を返しています。
Chandler_Bing

2019/02/22 09:44

header('Content-Type: application/json'); $hotelid = $_POST['hotelid']; $countrycode = $_POST['countrycode']; $maxpage = getMaxpage($hotelid, $countrycode); echo json_encode([ 'maxpage' => $maxpage ]); exit; ここもしゅうせしましたが、同じでした。 またheaderを消してもconsole.logには何も出ません。
FKM

2019/02/22 09:57 編集

そのheaderの前にvar_dump()を使っていますよね?header()関数の前に出力したりすると、 headerが機能しなくなります。そして、それだとjson_encode()も働かないので、echoで変数を返してしまい、レスポンスエラーとなります。 また、jQueryの方のスクリプトの記述がどうなっているかによりますが、dataType: jsonと指定していると、jsonしか値は返りません。 スクリプトの方に.error(xml,status,err)を記述して、alert(err)としてみてください。エラーが返ってきているはずです。mts10806氏の言う通り、PHPはあくまで値をjsonにして返しているだけで、主役はjavascriptです
m.ts10806

2019/02/22 10:05

マニュアル読まないエラー調べない自分の(コピペ)コードは正しい という方なのであまり本気回答しない方がいいかもしれません。 たぶん2%くらいしか伝わってません…
Chandler_Bing

2019/02/22 10:07

'そのheaderの前にvar_dump()' 解決しました。本当に助かりました。まだまだです。頑張ります。
FKM

2019/02/22 10:13 編集

よかったです、自分もPHPとjsonでのAjaxは気が狂いそうなぐらい悩まされた部分なので。 (Qiitaに記事を書いたぐらい、他の人には迷ってほしくない場所です)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問