質問するログイン新規登録

回答編集履歴

3

制御文字削除について追記

2017/09/10 08:42

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -141,3 +141,42 @@
141
141
 
142
142
  exit();
143
143
  ```
144
+
145
+ #### 追記3
146
+
147
+ コメント欄で頂いた、エラーのJSON文字列をコピーしたところ先頭になぜか`BOM(\ufeff)`が入っていました。何かBOM付ファイルを参照していたりしないでしょうか?
148
+
149
+ DBから値を取得して配列を作成するときに、\n→<br>が必要な場合は`nl2br()`を行ってから下記のコードのように`制御文字コード`を削除するようにします。
150
+
151
+ 下記のコードでもJsonの構文エラーが出る場合は、Jsonをそもそも表示する前に制御文字が出力されている可能性があるので、`ob_start(), ob_end_clean()`の行をコメントアウトしてみます。
152
+ `ob_start(), ob_end_clean()`間ですべての出力を切り捨てて、制御文字が出力されないようにします。
153
+
154
+ ```php
155
+ /* garally2.php */
156
+ //ob_start();
157
+ require_once('./php/ponta.php');// DBに接続
158
+
159
+ $db->query('set names utf8');
160
+ $ps = $db->query('select * from wan2 order by ban desc');
161
+ $users = [];
162
+
163
+ while ($row = $ps->fetchObject())
164
+ {
165
+ foreach (['ban','nam','ttl','mes','gaz','dat'] as $column) {
166
+ //制御文字を削除
167
+ $value = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $row->{$column});
168
+ //nl2br()付制御文字削除
169
+ //$value = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', nl2br($row->{$column}));
170
+ $users[] = [$column => $value];
171
+ }
172
+ }
173
+
174
+ //ob_start()からここまでの出力を切り捨て
175
+ //ob_end_clean();
176
+
177
+ //日本語をユニコードエスケープしない(JSON_UNESCAPED_UNICODE)
178
+ //JSONをインデントと改行をつけて見やすい形式で表示(JSON_PRETTY_PRINT)
179
+ echo json_encode($debug + $users, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
180
+
181
+ exit();
182
+ ```

2

回答追記2

2017/09/10 08:41

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -40,7 +40,7 @@
40
40
  });
41
41
  ```
42
42
 
43
- #### 追記
43
+ #### 追記
44
44
 
45
45
  うまくいかない原因として、JavaScriptが原因なのかPHPが原因なのか明確にします。
46
46
  `garally2.php`を下記のようにしてみます。正しく表示されればPHPが原因ということになります。逆に正しく表示されない場合は、JavaScriptが原因ということになります。
@@ -60,3 +60,84 @@
60
60
 
61
61
  JavaScriptコンソールには「Parse Error」となっているので必ずなにかJson文字列として認識できない文字列が入っているはずですが、`jQuery`のバグの可能性もあります。
62
62
  ですので、`jQuery`のバージョンをダウングレードしてみるのも良いかもしれません。
63
+
64
+
65
+ #### 追記2
66
+
67
+ **■Jsonエンコードエラーチェック**
68
+ Jsonのエンコードでエラーが発生している場合は下記のコードのように`json_last_error()`でチェックすることができます。エンコードエラーが発生していない場合は、下記のように`Json Lintチェッカー`で構文チェックします。
69
+
70
+ **■Jsonエンコードオプション**
71
+ その他、Jsonエンコードではオプションを複数渡すことができます。PHPマニュアルの[jsonの定義済み定数](http://php.net/manual/ja/json.constants.php)を参照してください。日本語のユニコードエスケープをさせないようにしたり、Json文字列の構文チェックすることを念頭に置いてインデントと改行でフォーマットして表示することも可能です。
72
+
73
+ **■Json Lintチェッカー**
74
+ Jsonフォーマットは下記のような`Json Lint`でチェックできます。このようなチェッカーサイトでは、ピンポイントでどの行がフォーマットエラーなのか表示してくれます。
75
+ [https://jsonlint.com/](https://jsonlint.com/)
76
+
77
+ ブラウザのデバッグ(`F12`)の「`ネットワーク`」などから**レスポンスソース(JSON文字列)をそのまま上記サイトにコピー&ペースト**してJsonフォーマットをチェックします。
78
+
79
+ ```php
80
+ /* garally2.php */
81
+ require_once('./php/ponta.php');// DBに接続
82
+
83
+ $db->query('set names utf8');
84
+ $ps = $db->query('select * from wan2 order by ban desc');
85
+ $users = [];
86
+
87
+ while ($row = $ps->fetchObject())
88
+ {
89
+ $users[] = array(
90
+ 'ban'=> $row->ban
91
+ ,'nam' => $row->nam
92
+ ,'ttl' => $row->ttl
93
+ ,'mes' => $row->mes
94
+ ,'gaz' => $row->gaz
95
+ ,'dat' => $row->dat
96
+ );
97
+ }
98
+
99
+ //JSONエンコードしてみる(エラーチェック用)
100
+ json_encode($users, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
101
+
102
+ $debug = [];
103
+
104
+ //JSONエンコードエラーチェック
105
+ switch (json_last_error()) {
106
+ case JSON_ERROR_NONE :
107
+ $debug = ['SUCCESS' => 'エラーは発生しませんでした'];
108
+ break;
109
+ case JSON_ERROR_DEPTH :
110
+ $debug = ['FAIL' => '配列の深さが最大値を超えました'];
111
+ break;
112
+ case JSON_ERROR_STATE_MISMATCH :
113
+ $debug = ['FAIL' => 'JSON の形式が無効、あるいは壊れています'];
114
+ break;
115
+ case JSON_ERROR_CTRL_CHAR :
116
+ $debug = ['FAIL' => '制御文字エラー。おそらくエンコーディングが違います'];
117
+ break;
118
+ case JSON_ERROR_SYNTAX :
119
+ $debug = ['FAIL' => '構文エラー'];
120
+ break;
121
+ case JSON_ERROR_UTF8 :
122
+ $debug = ['FAIL' => '正しくエンコードされていないなど、不正な形式の UTF-8 文字'];
123
+ break;
124
+ case JSON_ERROR_RECURSION :
125
+ $debug = ['FAIL' => 'エンコード対象の値に再帰参照が含まれています'];
126
+ break;
127
+ case JSON_ERROR_INF_OR_NAN :
128
+ $debug = ['FAIL' => 'エンコード対象の値に NAN あるいは INF が含まれています'];
129
+ break;
130
+ case JSON_ERROR_UNSUPPORTED_TYPE :
131
+ $debug = ['FAIL' => 'エンコード不可能な型の値が渡されました'];
132
+ break;
133
+ default :
134
+ $debug = ['FAIL' => '不明なエラー - Unknown error'];
135
+ break;
136
+ }
137
+
138
+ //日本語をユニコードエスケープしない(JSON_UNESCAPED_UNICODE)
139
+ //JSONをインデントと改行をつけて見やすい形式で表示(JSON_PRETTY_PRINT)
140
+ echo json_encode($debug + $users, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
141
+
142
+ exit();
143
+ ```

1

追記

2017/09/10 03:10

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -38,4 +38,25 @@
38
38
  }).fail(function(XMLHttpRequest, textStatus, errorThrown) {
39
39
  console.log(XMLHttpRequest, textStatus, errorThrown);
40
40
  });
41
- ```
41
+ ```
42
+
43
+ #### 追記
44
+
45
+ うまくいかない原因として、JavaScriptが原因なのかPHPが原因なのか明確にします。
46
+ `garally2.php`を下記のようにしてみます。正しく表示されればPHPが原因ということになります。逆に正しく表示されない場合は、JavaScriptが原因ということになります。
47
+
48
+ Content-Typeは上記に書いたように`dataType`を指定すれば普通は必要ありません。
49
+
50
+ ```php
51
+ //garally2.php
52
+ echo json_encode(array(
53
+ 'ban' => 'ban1',
54
+ 'nam' => 'nam1',
55
+ 'ttl' => 'ttl1',
56
+ 'gaz' => 'gaz1',
57
+ 'dat' => 'dat1',
58
+ ));
59
+ ```
60
+
61
+ JavaScriptコンソールには「Parse Error」となっているので必ずなにかJson文字列として認識できない文字列が入っているはずですが、`jQuery`のバグの可能性もあります。
62
+ ですので、`jQuery`のバージョンをダウングレードしてみるのも良いかもしれません。