web-dev-qa-db-ja.com

json_encodeはNULLを返していますか?

何らかの理由で、アイテム「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"}]

何か案は?

116
tarnfeld

Utf8以外のエンコーディングでデータを取得しているに違いありません。SELECTクエリの前にmysql_query('SET CHARACTER SET utf8')を配置してください。

253
ntd

少なくとも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未満の場合、運が悪いため、エラーが何であるかを尋ねる方法はありません。

117
K. Norbert

ntdのアンサーは私の問題を解決しませんでした。同じ状況にある人のために、このエラーを最終的にどのように処理したかを以下に示します。各結果をutf8_encodeするだけです。

while($row = mysql_fetch_assoc($result)){
    $rows[] = array_map('utf8_encode', $row);
}

それが役に立てば幸い!

17
Pablo Abdelhay

数日前、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、...)。奴隷に良い...

9
Ivo Urbanek

Utf8でエンコードされた文字列をjson_encodeに渡す必要があります。以下のようなutf8_encodeおよびarray_map()関数を使用できます。

<?php
    $encoded_rows = array_map('utf8_encode', $rows);
    echo json_encode($encoded_rows);
?>
6
koder

PHP.netが推奨する文字セットの設定方法は次のとおりです。

mysqli_set_charset( 'utf8')

4
bejs

ああ!これはとても間違っているようで、頭が痛い。このようなものを試してみてください...

<?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を反復処理するときは、<ではなく<=を使用する必要があります。また、すべてのループを再カウントするのではなく、この値をキャッシュ(変数に保存)する必要があります。誰がそれがボンネットの下で何をしているのかを知っています...(効率的かもしれませんが、私は本当にわかりません)
  • そのように各値を明示的にコピーする必要はありません...これを自分自身で難しくしているだけです。クエリがそこにリストしたよりも多くの値を返している場合は、SQLに必要な値のみをリストします。
  • mysql_fetch_arrayは、keyintの両方で値を返します。インデックスを使用しないので、emをフェッチしないでください。

これが本当にjson_encodeに問題がある場合、ループの本体を次のようなものに置き換えることをお勧めします

$rows[] = array_map('htmlentities',$row);

Perhpasには、物をいじっている特別な文字があります...

4
mpen

PDOを使用している人にとって、ソリューションは ntdの答え に似ています。

PHP PDO :: __ construct page から、ユーザーからのコメントとしてライブドットコムのKiiipa

UTF-8文字セットを取得するには、DSNで指定できます。

$ link = new PDO( "mysql:Host = localhost; dbname = DB;charset = UTF8");

3
MichaelS

私にとって、json_encodeがエンティティのnullエンコーディングを返す問題は、jsonSerialize実装が関連するエンティティのオブジェクト全体をフェッチしたためです。 jsonシリアル化するオブジェクトに複数のエンティティが関連付けられている場合に、関連/関連付けられたエンティティのIDを取得し、-> toArray()を呼び出すようにして、問題を解決しました。注、私はエンティティに1つのimplements JsonSerializableがある場合について話しています。

0
Victor S