Untuk beberapa alasan item "deskripsi" kembali NULL
dengan kode berikut:
<?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);
?>
Berikut skema untuk database saya:
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
Inilah yang digaungkan di halaman:
[{"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"}]
Ada ide?
$r['description']
luar pernyataan for ()?Jawaban:
Saya yakin Anda mengambil data dalam pengkodean non-utf8: coba letakkan
mysql_query('SET CHARACTER SET utf8')
sebelumSELECT
kueri Anda .sumber
Jika Anda memiliki setidaknya PHP 5.5, Anda dapat menggunakan json_last_error_msg () , yang akan mengembalikan string yang menjelaskan masalah.
Jika Anda tidak memiliki 5.5, tetapi berada di / di atas 5.3, Anda dapat menggunakan json_last_error () untuk melihat apa masalahnya.
Ini akan mengembalikan integer, yang dapat Anda gunakan untuk mengidentifikasi masalah dalam dokumentasi fungsi . Saat ini (2012.01.19), pengenalnya adalah:
Ini dapat berubah di versi mendatang, jadi lebih baik untuk membaca manual.
Jika Anda berada di bawah 5.3, Anda kurang beruntung, tidak ada cara untuk menanyakan apa kesalahannya.
sumber
Jawaban ntd tidak menyelesaikan masalah saya. Bagi mereka yang berada dalam situasi yang sama, berikut adalah bagaimana saya akhirnya menangani kesalahan ini: Cukup utf8_encode setiap hasil Anda.
Semoga membantu!
sumber
beberapa hari yang lalu saya mengalami masalah yang SAMA dengan 1 tabel.
Pertama coba:
Jika baris terakhir mengembalikan 5, masalahnya ada pada data Anda . Saya tahu, tabel Anda dalam UTF-8, tetapi tidak memasukkan data . Misalnya input dalam file txt, tetapi dibuat pada mesin Win dengan pengkodean bodoh (dalam kasus saya Win-1250 = CP1250) dan data ini telah dimasukkan ke dalam DB.
Larutan? Cari data baru (excel, halaman web), edit file txt sumber melalui PSPad (atau apa pun), ubah encoding ke UTF-8 , hapus semua baris dan sekarang letakkan data dari aslinya. Menyimpan. Masuk ke DB .
Anda juga hanya dapat mengubah encoding ke utf-8 dan kemudian mengubah semua baris secara manual (berikan kolom dengan karakter khusus - desc, ...). Baik untuk budak ...
sumber
JSON_PARTIAL_OUTPUT_ON_ERROR
opsi untuk melihat masalah (mis. bidang dengan UTF8 akan menjadi nol).Anda harus meneruskan string yang dienkode utf8 di json_encode. Anda dapat menggunakan
utf8_encode
danarray_map()
berfungsi seperti di bawah ini:sumber
AHHH !!! Ini terlihat sangat salah sehingga sakit kepala saya. Coba sesuatu yang lebih seperti ini ...
mysql_num_rows
Anda harus menggunakan<
tidak<=
. Anda juga harus menyimpan nilai ini ke cache (menyimpannya ke variabel) daripada menghitung ulang setiap loop. Siapa yang tahu apa yang dilakukannya di bawah tenda ... (mungkin efisien, saya tidak begitu yakin)mysql_fetch_array
mengembalikan nilai bykey
dan byint
. Anda tidak menggunakan indeks, jadi jangan ambil.Jika ini benar-benar masalah
json_encode
, mungkin saya sarankan untuk mengganti badan loop dengan sesuatu sepertiPerhpas ada beberapa karakter khusus di sana yang mengacaukan ...
sumber
null
null
maka mungkin memang begitunull
. Cobaecho $row['description'].'<br/>';
di loop itu dan lihat apa yang dikatakannya.Cara yang direkomendasikan PHP.net untuk mengatur charset sekarang adalah:
mysqli_set_charset ('utf8')
sumber
Untuk siapa pun yang menggunakan PDO, solusinya mirip dengan jawaban NTD .
Dari halaman konstruksi PHP PDO :: __ , sebagai komentar dari pengguna Kiipa di live dot com :
sumber
Bagi saya, masalah di mana json_encode akan mengembalikan pengkodean null entitas adalah karena implementasi jsonSerialize saya mengambil seluruh objek untuk entitas terkait; Saya memecahkan masalah dengan memastikan bahwa saya mengambil ID dari entitas terkait / terkait dan memanggil -> toArray () ketika ada lebih dari satu entitas yang terkait dengan objek yang akan dijadikan serialisasi json. Perhatikan, saya berbicara tentang kasus di mana satu
implements JsonSerializable
entitas.sumber
Saya memiliki masalah yang sama dan solusinya adalah menggunakan fungsi saya sendiri, bukan
json_encode()
sumber