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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

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回答

679閲覧

mysql→php→jsonをjs_Ajax dataの中身が自身のhtml

eruko

総合スコア9

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

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

1クリップ

投稿2017/09/09 05:26

編集2017/09/09 14:50

###前提・実現したいこと
mysqlのデータをphpで取得し、jsonにして
Ajaxで取得したいのです。

###発生している問題・エラーメッセージ

Ajaxのエラーでこちらがでました。

SyntaxError: Unexpected token < in JSON at position 0

こちらのサイトでも同じエラーので質問されている方がいらっしゃって、
形式がjsonじゃないからということでした。

そこでエラーの内容から
data:textに変更してconsole.logに出力してみると、
自身ののHTMLデータが入っていました。。。

初心者なのですが、ご教授下さい。

###該当のソースコード

php

1/* garally2.php */ 2require_once('./php/ponta.php');// DBに接続 3$db->query('set names utf8'); 4$ps = $db->query('select * from wan2 order by ban desc'); 5$users = null; 6while ($row = $ps->fetchObject()) 7 { 8 $users[] = array( 9 'ban'=> $row->ban 10 ,'nam' => $row->nam 11 ,'ttl' => $row->ttl 12 ,'mes' => $row->mes 13 ,'gaz' => $row->gaz 14 ,'dat' => $row->dat 15 ); 16 } 17// JSON形式で出力する 18 header('Content-Type: application/json; charset=utf-8'); 19 json_decode($users); 20 $users = json_encode( $users ); 21 echo $users; 22?>

"gallery1.php"に別jsファイルとしてこちらを読込ませました。
"gallery2.php"は同じディレクトリです。

js

1$.ajax({ 2 type: "POST", 3 data: "gallery2.php", 4 dataType: "json", 5 crossDomain: false, 6 scriptCharset: "UTF-8", 7 cache: false 8}).done(function(data) { 9 //console.log(data); 10 console.log($.parseJSON(data)); 11}).fail(function(XMLHttpRequest, textStatus, errorThrown) { 12 alert('Error : ' + errorThrown); 13});

###試したこと
まず、gallery2.phpを直接たたいたところ、形式はjsonの形になっているようでした。

gallery2.php

1[{"ban":"56","nam":"eru","ttl":"\u30dd\u30f3\u592a","mes":"\u306e\u306e","gaz":"20170905230540IMG_0322.JPG","dat":"2017-09-05"} 2(中略) 3{"ban":"47","nam":"eru","ttl":"fff","mes":"furanku","gaz":"2017090322121104_10_03_13_34.jpg","dat":"2017-09-03"}]

そこでエラーの内容から
data:textに変更してconsole.logに出力してみると、
自身のgallery1.phpのHTMLデータが入っていました。。。

js

1$.ajax({ 2 type: "POST", 3 data: "gallery2.php", 4 dataType: "text", 5 crossDomain: false, 6 scriptCharset: "UTF-8", 7 cache: false 8}).done(function(data) { 9 //console.log(data); 10 //console.log($.parseJSON(data)); 11}).fail(function(XMLHttpRequest, textStatus, errorThrown) { 12 alert('Error : ' + errorThrown); 13});

###なおしたことその2
php側で
json_decode()→json_encode()のみにして
header('Content-Type~はdatatypeがjsonなら不要なのではずした。
また、
指摘を頂いてphp側に
echo json_encode(array(
'ban' => 'ban1',
'nam' => 'nam1',
'ttl' => 'ttl1',
'gaz' => 'gaz1',
'dat' => 'dat1',
));

json側でちゃんと読込まれていたので
原因はphp側と判明。

gallery2.php

1<?php 2require_once('./php/ponta.php'); 3$db->query('set names utf8'); 4$ps = $db->query('select * from wan2 order by ban desc'); 5$users = []; 6 7while ($row = $ps->fetchObject()) 8{ 9 $users[] = array( 10 'ban'=> $row->ban 11 ,'nam' => $row->nam 12 ,'ttl' => $row->ttl 13 ,'mes' => $row->mes 14 ,'gaz' => $row->gaz 15 ,'dat' => $row->dat 16 ); 17} 18 19echo json_encode($users); 20?>

一応js側

js

1$.ajax({ 2 type: "POST", 3 data: "gallery2.php", 4 dataType: "json", 5 crossDomain: false, 6 scriptCharset: "UTF-8", 7 cache: false 8}).done(function(data) { 9 //console.log(data); 10 console.log($.parseJSON(data)); 11}).fail(function(XMLHttpRequest, textStatus, errorThrown) { 12 alert('Error : ' + errorThrown); 13});

###補足情報(言語/FW/ツール等のバージョンなど)
PHP 5.6.31
jquery-2.1.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、PHPコードは下記のようにします。json_encode()です。$.ajax()dataTypeの設定は返された文字列をどのように解釈するかの設定で、jsonに設定しておけば勝手にjsonに解釈されます。

php

1/* garally2.php */ 2require_once('./php/ponta.php');// DBに接続 3 4$db->query('set names utf8'); 5$ps = $db->query('select * from wan2 order by ban desc'); 6$users = []; 7 8while ($row = $ps->fetchObject()) 9{ 10 $users[] = array( 11 'ban'=> $row->ban 12 ,'nam' => $row->nam 13 ,'ttl' => $row->ttl 14 ,'mes' => $row->mes 15 ,'gaz' => $row->gaz 16 ,'dat' => $row->dat 17 ); 18} 19 20// JSON形式で出力する 21echo json_encode($users); 22?>

JavaScriptは下記のようにします。

js

1$.ajax({ 2 type: "POST", 3 url: "gallery2.php", 4 dataType: "json", 5 cache: false 6}).done(function(data) { 7 console.log(data); 8}).fail(function(XMLHttpRequest, textStatus, errorThrown) { 9 console.log(XMLHttpRequest, textStatus, errorThrown); 10});

追記1

うまくいかない原因として、JavaScriptが原因なのかPHPが原因なのか明確にします。
garally2.phpを下記のようにしてみます。正しく表示されればPHPが原因ということになります。逆に正しく表示されない場合は、JavaScriptが原因ということになります。

Content-Typeは上記に書いたようにdataTypeを指定すれば普通は必要ありません。

php

1//garally2.php 2echo json_encode(array( 3 'ban' => 'ban1', 4 'nam' => 'nam1', 5 'ttl' => 'ttl1', 6 'gaz' => 'gaz1', 7 'dat' => 'dat1', 8));

JavaScriptコンソールには「Parse Error」となっているので必ずなにかJson文字列として認識できない文字列が入っているはずですが、jQueryのバグの可能性もあります。
ですので、jQueryのバージョンをダウングレードしてみるのも良いかもしれません。

追記2

■Jsonエンコードエラーチェック
Jsonのエンコードでエラーが発生している場合は下記のコードのようにjson_last_error()でチェックすることができます。エンコードエラーが発生していない場合は、下記のようにJson Lintチェッカーで構文チェックします。

■Jsonエンコードオプション
その他、Jsonエンコードではオプションを複数渡すことができます。PHPマニュアルのjsonの定義済み定数を参照してください。日本語のユニコードエスケープをさせないようにしたり、Json文字列の構文チェックすることを念頭に置いてインデントと改行でフォーマットして表示することも可能です。

■Json Lintチェッカー
Jsonフォーマットは下記のようなJson Lintでチェックできます。このようなチェッカーサイトでは、ピンポイントでどの行がフォーマットエラーなのか表示してくれます。
https://jsonlint.com/

ブラウザのデバッグ(F12)の「ネットワーク」などからレスポンスソース(JSON文字列)をそのまま上記サイトにコピー&ペーストしてJsonフォーマットをチェックします。

php

1/* garally2.php */ 2require_once('./php/ponta.php');// DBに接続 3 4$db->query('set names utf8'); 5$ps = $db->query('select * from wan2 order by ban desc'); 6$users = []; 7 8while ($row = $ps->fetchObject()) 9{ 10 $users[] = array( 11 'ban'=> $row->ban 12 ,'nam' => $row->nam 13 ,'ttl' => $row->ttl 14 ,'mes' => $row->mes 15 ,'gaz' => $row->gaz 16 ,'dat' => $row->dat 17 ); 18} 19 20//JSONエンコードしてみる(エラーチェック用) 21json_encode($users, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); 22 23$debug = []; 24 25//JSONエンコードエラーチェック 26switch (json_last_error()) { 27 case JSON_ERROR_NONE : 28 $debug = ['SUCCESS' => 'エラーは発生しませんでした']; 29 break; 30 case JSON_ERROR_DEPTH : 31 $debug = ['FAIL' => '配列の深さが最大値を超えました']; 32 break; 33 case JSON_ERROR_STATE_MISMATCH : 34 $debug = ['FAIL' => 'JSON の形式が無効、あるいは壊れています']; 35 break; 36 case JSON_ERROR_CTRL_CHAR : 37 $debug = ['FAIL' => '制御文字エラー。おそらくエンコーディングが違います']; 38 break; 39 case JSON_ERROR_SYNTAX : 40 $debug = ['FAIL' => '構文エラー']; 41 break; 42 case JSON_ERROR_UTF8 : 43 $debug = ['FAIL' => '正しくエンコードされていないなど、不正な形式の UTF-8 文字']; 44 break; 45 case JSON_ERROR_RECURSION : 46 $debug = ['FAIL' => 'エンコード対象の値に再帰参照が含まれています']; 47 break; 48 case JSON_ERROR_INF_OR_NAN : 49 $debug = ['FAIL' => 'エンコード対象の値に NAN あるいは INF が含まれています']; 50 break; 51 case JSON_ERROR_UNSUPPORTED_TYPE : 52 $debug = ['FAIL' => 'エンコード不可能な型の値が渡されました']; 53 break; 54 default : 55 $debug = ['FAIL' => '不明なエラー - Unknown error']; 56 break; 57} 58 59//日本語をユニコードエスケープしない(JSON_UNESCAPED_UNICODE) 60//JSONをインデントと改行をつけて見やすい形式で表示(JSON_PRETTY_PRINT) 61echo json_encode($debug + $users, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); 62 63exit();

追記3

コメント欄で頂いた、エラーのJSON文字列をコピーしたところ先頭になぜかBOM(\ufeff)が入っていました。何かBOM付ファイルを参照していたりしないでしょうか?

DBから値を取得して配列を作成するときに、\n→<br>が必要な場合はnl2br()を行ってから下記のコードのように制御文字コードを削除するようにします。

下記のコードでもJsonの構文エラーが出る場合は、Jsonをそもそも表示する前に制御文字が出力されている可能性があるので、ob_start(), ob_end_clean()の行をコメントアウトしてみます。
ob_start(), ob_end_clean()間ですべての出力を切り捨てて、制御文字が出力されないようにします。

php

1/* garally2.php */ 2//ob_start(); 3require_once('./php/ponta.php');// DBに接続 4 5$db->query('set names utf8'); 6$ps = $db->query('select * from wan2 order by ban desc'); 7$users = []; 8 9while ($row = $ps->fetchObject()) 10{ 11 foreach (['ban','nam','ttl','mes','gaz','dat'] as $column) { 12 //制御文字を削除 13 $value = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $row->{$column}); 14 //nl2br()付制御文字削除 15 //$value = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', nl2br($row->{$column})); 16 $users[] = [$column => $value]; 17 } 18} 19 20//ob_start()からここまでの出力を切り捨て 21//ob_end_clean(); 22 23//日本語をユニコードエスケープしない(JSON_UNESCAPED_UNICODE) 24//JSONをインデントと改行をつけて見やすい形式で表示(JSON_PRETTY_PRINT) 25echo json_encode($debug + $users, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); 26 27exit();

投稿2017/09/09 09:25

編集2017/09/10 08:42
Tomak

総合スコア1652

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

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

eruko

2017/09/09 10:30

回答ありがとうございます。 余計なことをしていたのですね。。。 なおしたのですが parsererror" SyntaxError: Unexpected token  in JSON at position 0 と、fail()に入ってしまいました。 responseTextにはちゃんとはいっていました。 [{"ban":"56","nam":"eru","ttl":"\u30dd\u30f3\u592a","mes":"\u306e\u306e","gaz":"20170905230540IMG_0322.JPG","dat":"2017-09-05"},{"ban":"55","nam":"eru","ttl":"\u3069\u3046\u3082","mes":"\u3042\u3044\u3075\u3049\u3093\u7528\u306e\u51e6\u7406\u304b\u3046\u307e\u304f\u3044\u3063\u3066\u3044\u306a\u3044\u3002\u3002\u3002","gaz":"20170905220856image.jpg","dat":"2017-09-05"}] statusCodeは200でした。
Tomak

2017/09/09 10:41

json_decode() → json_encode()も修正されましたでしょうか? PHPフレームワークなどを使用していますでしょうか?この手のエラーは「Content-Type: text/html」と返してしまっていることによる原因が多いです。 ブラウザのデバッグの「ネットワーク」などで実際にPHPから文字列が帰ってきているときのContent-Typeを確認してみてはいかがでしょうか。 関係ないかもしれませんが、Ajax通信の場合は必ず「timeout」プロパティを設定するようにしたほうがよいです。 -- $.ajax({ type: "POST", url: "gallery2.php", dataType: "json", cache: false, timeout: 60000 //←追加 })
eruko

2017/09/09 12:58

はい、json_encode()にしてそのままコピペさせて頂きました。 特にフレームワークは使用していません。 しかしながら頻雑なのでいったん全部けしてやってみました。 timeoutというのがあるのですね! デバックのネットワークで確認したところ ResponsHeadersは 確かにContent-Type: text/htmlになっていました。 そこでphp上に header('Content-Type: application/json;'); と記載したら デバックのネットワーク上でResponsHeadersは application/jsonになったのですが、 やはり "parsererror" SyntaxError: Unexpected token  in JSON at position 0 at JSON.parse (<anonymous>) でした。。。
Tomak

2017/09/09 13:30

json_decode($users); ←は消しましたでしょうか?消さないとWarningでます。
eruko

2017/09/09 14:56

なるほど、ご指摘をうけましてphp側に 入れて確認したろころ、正しく表示されました! php側での問題と判明しました。 json_decode($users);は消しました。 mysqlのテーブルにiphoneからの絵文字があったので、 消してみましたが、関係ありませんでした。
Tomak

2017/09/09 15:43

なるほど、DBには何かユーザーの入力値なわけですね。。。昔、JSONとは関係ないですが、ユーザーからの入力値で「\0」が入っていて予期しないエラーになったことがあります。 DBに入力する時に\0の後に数字が入ってしまっていたりすると下記のようなコードは使えません。 -- //\0を消してみる $users[] = array( 'ban' => str_replace("\0", "", $row->ban), ... ); あとは、echo json_encode();の後になんらかのコードが表示されている可能性があるので、下記のようにしてみるのもいいかもしれません。 -- echo json_encode($users); exit();
eruko

2017/09/09 16:18

exit();はそういうために使うんですね。 なるほど、\0・・・恐ろしいですね。 \0を消してみましたがparsererrorになるので jsonの構文チェッカーにかけてみましたが、 やはりエラーになるので構文がおかしいんだと思いました。 しかしながら、この構文のどこをなおせば正しいのか調べてみます。 今日は一日かかってしましました。 ありがとうございます。
eruko

2017/09/10 07:58

追記ありがとうございます。 Jsonエンコードエラーチェックやってみたところエラーは出ないのですが、 チェッカーにかけるとエラーがでました。 チェッカーやネットワークのレスポンスソースでは先頭に半角スーペースみたいなものがついてくることがわかりました。 と、言ってもテキストに貼り付けると何もないのです。 ならばとtrim(json_encode($users));をしてみたりもしたのですが、 効果はなく、もしかしたらこちらの記事と同じ現象なのかな ・・・とおもいました。 http://yamataka.hatenablog.com/entry/2014/10/16/130336 \0より怖いものはないのかもしれません。。。
eruko

2017/09/10 08:23

先頭の\0を削除する方法はわからなかったのですが、 とりあえず、js側でテキストデータとして取得し、 data.trim()で空白を取り除き、 jQuery.parseJSON()でjsonとして扱うことにしました。 色々ありがとうございました。 問題解決能力を日々はやめていきたいですw
Tomak

2017/09/10 08:43

すみません、既に解決済みでした。 モヤモヤ感はありますが、方針が決まったということでとりあえず良かったです。
eruko

2017/09/10 09:37

確かに最初、テキストエディターがBOMつきになっていました。 よくないことがわかったので、そうじゃないのに変更したのですが、うまくいっていなかったのかもしれません。。。 なんとなく、まやかしっぽい解決策な感は否めませんが 許して下さい。 ありがとうございます。
guest

0

data: "gallery2.php",url: "gallery2.php", では?

【jQuery.ajax() | jQuery API Documentation】
http://api.jquery.com/jquery.ajax/

投稿2017/09/09 05:29

kei344

総合スコア69407

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

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

eruko

2017/09/09 05:56

変更しました! data: "gallery2.php", → url: "gallery2.php", 変更したところ dataType:textでconsole.logで確認すると gallery2.phpのデータが入っていました! そこでこのデータをjson形式にしようと SON.parse(data); したところ Uncaught SyntaxError: Unexpected token  in JSON at position 0 とエラーになりました。 取得してきたデータが文字化けしているようで それが原因なのか・・・ [{"ban":"44","nam":"eru","ttl":"\u4eca\u5ea6\u3053\u305d","mes":"\u3053\u3044","gaz":"20170902150820IMG_0155.JPG","dat":"2017-09-02"}]
kei344

2017/09/09 06:11

全角の空白などがphpのコードに含まれていないか確認してみてください。あと、json_decode($users);は無意味なので外したほうが良いです。
eruko

2017/09/09 06:21

回答ありがとうございます。 json_decode($users);を外して、 全角を調べたのですが見つからずでした。 もうちょっと調べてみます。。。
kei344

2017/09/09 06:31

dataType: "json",でconsole.log(data);で確認しても内容がきていませんか? 【Chrome デベロッパーツール Networkパネルの使い方 | Web Tips】 http://weback.net/utility/1491/
eruko

2017/09/09 06:37

そうなんです。。。 dataType: "json",にすると .done()に入らず .fail()に入って エラーが表示されるのです。 SyntaxError: Unexpected token  in JSON at position 0 dataType:text,だと .done(function(data){ console.log(data); }) が表示されます。
kei344

2017/09/09 06:45

Networkパネルで内容を確認して、それがパースできるか確認してみては?
eruko

2017/09/09 07:32

NetworkパネルのPreviwで見るとちゃんとしたjsonで文字化けしないで表示されました。。。 なぜdoneに入っていってしまうのか。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問