json_encode NULL dönüyor?

7 Cevap php

Nedense aşağıdaki kodla öğe "açıklama" döner 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);
?>

İşte benim veritabanı şema:

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

İşte, sayfa üzerinde yankılandı budur:

[{"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"}]

Herhangi bir fikir?

7 Cevap

Ben olmayan utf8 kodlama veri alma bahis: Lütfen SELECT sorgudan önce mysql_query('SET CHARACTER SET utf8') koymak deneyin.

En az PHP 5.5 varsa, sorunu açıklayan bir dize döndürür, hangi json_last_error_msg() kullanabilirsiniz.

Eğer 5.5 var ama 5.3 üzeri / üzerinde değil ise, json_last_error() sorunun ne olduğunu görmek için kullanabilirsiniz.

Bu function's documentation sorunu tanımlamak için kullanabileceğiniz bir tamsayı döndürür. Şu anda (2012.01.19), belirteçleri:

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

Bunlar gelecekteki sürümlerinde değişebilir, bu nedenle kılavuzuna başvurmanızı iyidir.

Eğer 5.3 altında ise, şans dışında, hata ne olduğunu sormak için hiçbir yolu yoktur.

Birkaç gün önce ben 1 tablo ile aynı sorun var.

Öncelikle deneyin:

echo json_encode($rows);
echo json_last_error();  // returns 5 ?

Son satırı 5 dönerse, problem is with your data. Ben senin tabloları UTF-8 vardır, biliyorum, ama not entered data. Örneğin giriş txt dosyasında oldu, ama (benim durumumda Win-1250 = CP1250 olarak) aptal kodlama ile kazan makine üzerinde oluşturulan ve bu veriler veritabanına girildi.

Çözüm? PSPad (ya da başka ne olursa olsun) aracılığıyla yeni veriler (excel, web sayfası), edit source txt file arayın, change encoding to UTF-8, tüm satırları silin ve artık orijinal veri koydu. Kaydedin. Enter into DB.

Ayrıca, sonra sadece değişiklik utf-8 kodlama ve (- azalan, ... özel karakter cols vermek) elle tüm satırları değiştirebilirsiniz. Köleler için iyi ...

ntd's anwser didn't solve my problem. For those in same situation, here is how I finally handled this error: Just utf8_encode each of your results.

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

Umarım yardımcı olur!

AHHH! Bu Başımı acıtıyor çok yanlış görünüyor. Daha böyle bir şey deneyin ...

<?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);
?>
  • Yineleme zaman mysql_num_rows kullanmak < değil <=. Gerekir Ayrıca yerine her döngü yeniden sayılmasını olan bu değer (bir değişkene kaydetmek) önbelleğe. Bu başlık altında ne yaptığını bilir ... Kim (ben gerçekten emin değilim, verimli olabilir)
  • Siz sadece kendinizi zor bu yapıyoruz ... böyle açıkça her değerini kopyalamak gerekmez. Sorgu Eğer SQL yalnızca istediğiniz olanları listelemek, burada listelenen ettik daha fazla değer dönen varsa.
  • mysql_fetch_array key tarafından ve int hem değerleri döndürür. Sen endeksleri kullanarak değil, bu yüzden onları almak yok.

Bu gerçekten json_encode ile ilgili bir sorun varsa, o zaman ben gibi bir şey ile döngünün gövdesini değiştirirken önerebiliriz

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

Perhpas şeyleri emme vardır orada bazı özel karakter vardır ...

Siz json_encode içinde utf8 kodlanmış dize geçmelidir. Sen utf8_encode kullanın ve aşağıdaki gibi array_map() function yapabilirsiniz:

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

Ben aynı sorunu vardı ve çözüm yerine json_encode() benim kendi işlevini kullanmak oldu

echo '["' . implode('","', $row) . '"]';