何らかの理由で、アイテム「description」は次のコードでNULL
を返します。
<?php
include('db.php');
$result = mysql_query('SELECT * FROM `staff` ORDER BY `id` DESC LIMIT 2') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
$rows[] = $row;
}
echo json_encode($rows);
?>
データベースのスキーマは次のとおりです。
CREATE TABLE `staff` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` longtext COLLATE utf8_unicode_ci,
`description` longtext COLLATE utf8_unicode_ci,
`icon` longtext COLLATE utf8_unicode_ci,
`date` longtext COLLATE utf8_unicode_ci,
`company` longtext COLLATE utf8_unicode_ci,
`companyurl` longtext COLLATE utf8_unicode_ci,
`appurl` longtext COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
ページに表示される内容は次のとおりです。
[{"id":"4","name":"Noter 2","description":null,"icon":"http:\/\/images.Apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"},{"id":"3","name":"Noter 2","description":null,"icon":"http:\/\/images.Apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"}]
何か案は?
Utf8以外のエンコーディングでデータを取得しているに違いありません。SELECT
クエリの前にmysql_query('SET CHARACTER SET utf8')
を配置してください。
少なくともPHP 5.5がある場合は、 json_last_error_msg() を使用して、問題を説明する文字列を返します。
5.5を持っていないが、5.3以上である場合は、 json_last_error() を使用して問題の内容を確認できます。
関数のドキュメント で問題を識別するために使用できる整数を返します。現在(2012.01.19)、識別子は次のとおりです。
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8
これらは将来のバージョンで変更される可能性があるため、マニュアルを参照することをお勧めします。
5.3未満の場合、運が悪いため、エラーが何であるかを尋ねる方法はありません。
ntdのアンサーは私の問題を解決しませんでした。同じ状況にある人のために、このエラーを最終的にどのように処理したかを以下に示します。各結果をutf8_encodeするだけです。
while($row = mysql_fetch_assoc($result)){
$rows[] = array_map('utf8_encode', $row);
}
それが役に立てば幸い!
数日前、1つのテーブルに同じ問題があります。
最初に試してください:
echo json_encode($rows);
echo json_last_error(); // returns 5 ?
最後の行が5を返す場合、-問題はデータにあります。あなたのテーブルはUTF-8ですが、入力されたデータではないです。たとえば、入力はtxtファイルでしたが、愚かなエンコーディング(私の場合はWin-1250 = CP1250)を使用してWindowsマシンで作成され、このデータはDBに入力されました。
解決?新しいデータ(Excel、Webページ)、ソースtxtファイルの編集 PSPad(またはその他)を介して、エンコーディングをUTF-8に変更を探し、すべての行を削除して、今すぐ元のデータ。セーブ。 DBに入る。
エンコードをutf-8に変更してから、すべての行を手動で変更することもできます(特別な文字を含むcols-desc、...)。奴隷に良い...
Utf8でエンコードされた文字列をjson_encodeに渡す必要があります。以下のようなutf8_encode
およびarray_map()
関数を使用できます。
<?php
$encoded_rows = array_map('utf8_encode', $rows);
echo json_encode($encoded_rows);
?>
PHP.netが推奨する文字セットの設定方法は次のとおりです。
ああ!これはとても間違っているようで、頭が痛い。このようなものを試してみてください...
<?php
include('db.php');
$result = mysql_query('SELECT `id`, `name`, `description`, `icon` FROM `staff` ORDER BY `id` DESC LIMIT 20') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
$rows[] = $row;
}
echo json_encode($rows);
?>
mysql_num_rows
を反復処理するときは、<
ではなく<=
を使用する必要があります。また、すべてのループを再カウントするのではなく、この値をキャッシュ(変数に保存)する必要があります。誰がそれがボンネットの下で何をしているのかを知っています...(効率的かもしれませんが、私は本当にわかりません)mysql_fetch_array
は、key
とint
の両方で値を返します。インデックスを使用しないので、emをフェッチしないでください。これが本当にjson_encode
に問題がある場合、ループの本体を次のようなものに置き換えることをお勧めします
$rows[] = array_map('htmlentities',$row);
Perhpasには、物をいじっている特別な文字があります...
PDOを使用している人にとって、ソリューションは ntdの答え に似ています。
PHP PDO :: __ construct page から、ユーザーからのコメントとしてライブドットコムのKiiipa:
UTF-8文字セットを取得するには、DSNで指定できます。
$ link = new PDO( "mysql:Host = localhost; dbname = DB;charset = UTF8");
私にとって、json_encodeがエンティティのnullエンコーディングを返す問題は、jsonSerialize実装が関連するエンティティのオブジェクト全体をフェッチしたためです。 jsonシリアル化するオブジェクトに複数のエンティティが関連付けられている場合に、関連/関連付けられたエンティティのIDを取得し、-> toArray()を呼び出すようにして、問題を解決しました。注、私はエンティティに1つのimplements JsonSerializable
がある場合について話しています。