• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPでのJSONの使い方(3))

PHPでのJSONの使い方での予期せぬエラーの解説

このQ&Aのポイント
  • PHPでのJSONの使い方に関する質問で、ブラウザーエラーの解説を求めています。
  • JSON.parseで予期せぬJSON入力の終わりというエラーが発生しており、その原因を知りたいです。
  • 解決方法やアドバイスがあれば、教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

すみません、見落としてました。 今回、すべてのプログラムをShift_JISでエンコードされているのですね。 https://www.php.net/manual/ja/function.json-encode.php json_encodeの関数のマニュアルに記述されている通り、JSONはUTF-8でなければなりません。 従いまして、配列を生成する際に、すべてshiftjisを、utf-8に変換してからjson_encodeに渡していただけますか。 雑に言えば、 $data[$col]= mb_convert_encoding($val, 'UTF-8', 'sjis-win'); // sjis-winは、windows拡張版Shift_JIS その場合には、HTML、JSは、Shift_JISのままでも動作します。 ※ ここからは余談ですが、現在においてすべての現場、日本語において、よほどの理由がない限りプログラムはUTF-8で記述する、というのがトレンドとなっています。 ついては、次回作からはUTF-8で作成するようにしていただくと文字コードのトラブルは起こりづらくなります。 ご一考くださいませ。

papashiroSooke
質問者

お礼

ご回答有難うございます。 連想配列$data[$col] への代入をUTF-8に変換して、次のようになったgetData.phpを直接走らせました。 <?php require_once "database.php"; global $cycle, $recordCount, $index; $kagi = 25;//$_GET["kagi"]; //echo "kagi = ".$kagi."<br>";///////////////////////// //print_r($index[$kagi-1]); $data = array(); foreach($index[$kagi-1] as $col=>$val){ //$data[$col]= $val; $data[$col]= mb_convert_encoding($val, 'UTF-8', 'sjis-win'); echo $col." -- ".$data[$col]."<br>"; } $Json_data = json_decode($data); //print_r($Json_data); echo $Json_data; ?> しかし次のようなエラーメッセージが出てきました。 id -- 25 english -- indegenous japanese -- ある土地特有の 生来の count -- 0 Fatal error: Uncaught TypeError: json_decode(): Argument #1 ($json) must be of type string, array given in C:\xampp\htdocs\english2japanese\getData.php:17 Stack trace: #0 C:\xampp\htdocs\english2japanese\getData.php(17): json_decode(Array) #1 {main} thrown in C:\xampp\htdocs\english2japanese\getData.php on line 17 json_encode() へは配列は渡せなくて文字列のみという意味の様ですが、今までは json_encode() に配列を渡しても問題はなかったのに変です。 17行目はJSON型式への変換部分です。 $Json_data = json_decode($data); アドバイス頂いた文字コード変換部分をコメントアウトして、先にコメントアウトしてあった$data[$col]= $val; に戻しても同じ趣旨のメッセージが出ます。 hogehoge78さんの貴重な時間をたくさん頂いて恐縮ですが、何かまたアドバイスを頂けたら有難いです。

papashiroSooke
質問者

補足

私は何処かで大きな間違いをしたようです。 今気が付いたのですが、エラーメッセージが出た17行目は json_encode() ではなく、json_decode()になっていました。 それならメッセージの意味も分かります。 いつencode がdecodeになったのかわかりませんが、 コードをいろいろといじりまわしている間にやってしまったのかもしれません。 いずれにしても、これを修正してプログラムがちゃんと動くようになりました。 hogehoge78さんにはいろんなことを教えて頂き、本当に有難うございました。

その他の回答 (1)

回答No.1

エラーメッセージの通りで、シンタックスエラーですね。 単純に、Javascript側で扱えない形式のJSONが帰ってきている、というメッセージです。 つきまして、以下のことをご確認ください。 (1) cacheが効いていないか XmlHttpRequestでAjax通信をする際にHTTPリクエストで抑止しないと結果がキャッシュされますので、 以下の参考資料(ブログ記事:検索して一番最初に出てきた)で示されているように、記載をしてみてください。 https://qt-is-cute.com/xmlhttprequest-no-use-cache/ (2) Google Chromeの開発者ツールでAjax通信のリクエストとレスポンスの結果を確認する F12を押し、開発者ツールを開いてから、Ajax通信を実行すると、「Network」タブに、Ajax通信先の「getData.php」が存在すると思います。 それをクリックすると、右側にHTTPのリクエストとレスポンスが出てきます。 ・「Headers」タブをクリックして、意図したURLへリクエストしているかを確認 ・「Preview」タブをクリックして、レスポンスが正しいかを確認。正しくJSON.parseできる形式であればJSONのデータ表示され展開されます。 そうでない場合は、ただの文字列として表現されます ・「Response」タブをクリックして、レスポンスされた文字列を確認し、想定通りの文字列となっているかを確認する。 尚、レスポンスが空文字の場合(何もレスポンスされなかった場合)も同様にパースエラーとなりますのでそこについてもご確認ください。 よろしくお願いします。

papashiroSooke
質問者

お礼

ご回答ありがとうございます。 今会社で回答を読ませていただき、ご指摘のものを全て確認いたしました。思った通りになっています。 仕事が終わって家に戻って、ご紹介いただいたサイトにあるJavascriptのコードを挿入して走らせ、同様の調査をやり詳しく報告させていただきます。

papashiroSooke
質問者

補足

今家に帰ってきて、キャッシュを読み込まないコードを挿入して走らせましたが、英単語は表示されません。 開発者ツールのnetwork のHeaderタブを開くと、確かにgetdata.phpを呼んで?kagi=以下のパラメータが渡されています。しかしPreviewタブを押しても真っ白なページが表示されるだけです。つまりこれはJSON型式のデータを取得できてないということですよね。 getData.php は現在次のようにいろいろなデバッグ用のecho文をあちこちに入れてあります。 <?php require_once "database.php"; global $cycle, $recordCount, $index; $kagi = 10;//$_GET["kagi"]; //echo "kagi = ".$kagi."<br>";///////////////////////// //print_r($index[$kagi-1]); $data = array(); foreach($index[$kagi-1] as $col=>$val){ $data[$col]=$val; //echo $col." -- ".$data[$col]."<br>"; } print_r($data); //echo $data['english']." = ";/////////////// //echo $data['japanese']."<br>";/////////////// $Json_data = json_encode($data); //print_r($Json_data); echo $Json_data; ?> ちなみにdisplayEnglish.php を介せず、渡すべきパラメータを$kagi=10などにしてgetData.phpを直接実行すると、print_r($data); によって次のように表示されます。 Chrome の場合 Array ( [id] => 10 [english] => muddy [japanese] => V�@���点�� [count] => 0 )  EIの場合:文字コードをShift_JIS に直して Array ([id] => 10[english] => muddy[japanese] => V 濁らせる [count] => 0 ) しかしながら、$Json_data = json_encode($data) とした後の echo $Json_data; では何も表示されません。 何処がおかしいのでしょうか?

関連するQ&A