2012-07-05 67 views
2

我正在創建一個小php文件來獲取我的android應用程序的mysql行。 檢索每個單列我使用:針對mysql查詢的json_encode返回某些行的某些空列,但列不爲空

$q=mysql_query($sql, $this->conn) or die (mysql_error()); 
while($e=mysql_fetch_assoc($q)) { 
     $output[]=$e; 
    } 
print(json_encode($output)); 

但有時它返回我不一致的輸出。

下面是一個例子: 行:

ID = 1(正確) - 名稱= 「名稱1」(正確) - 價格= 200(正確) - price2 = NULL(正確) - 面積= NULL (不正確)因爲面積的值爲「CentroCittà」..等等..

我該如何解決這個問題?

編輯:值是

[{ 「ID」: 「84」, 「idutente1」:NULL, 「idutente2」:NULL, 「idutente3」:NULL, 「idutente4」:NULL, 「idutente5」 :null,「idagente」:null,「annuncio」:「0」,「archiviato」:「0」,「dataarchiviazione」:「2012-07-05 13:31:19」,「tipoimmobile」:「Residenziale」, 「metodo」:「Vendita」,「area」:null,「presentazione」:「1」,「homepage」:「1」,「mappa」:「1」,「nome」:「Piazza Umberto I」 「:」Crotone「,」descrizione「:」60 mq composto da due vani oltre servizi,centralissimo buono per ufficio。「,」descdettagliata「:」 L'appartamentoèdiviso in due vani con cucina e bagno。</p> \ r \ nPosto nel pieno centro e vicinissimo al lungomare Regina Margherita。/p> \ r \ n Ottimo condominio。Libero e disponibile da subito。/ p>「,」vani「 「2」, 「PREZZO」: 「87000」, 「prezzo1」: 「0」, 「prezzo2」: 「0」, 「prezzo3」: 「0」, 「prezzo4」: 「0」, 「prezzo5」:」 0「,」metriquadri「:」58「,」stato「:」in buono stato「,」riscaldamento「:」Autonomo「,」classeenergetica「:」Non dotato「,」piano「:」Primo/secondo/terzo「, 「indicazioni」: 「」, 「墨脫」: 「沒有」, 「邦卡」: 「」, 「importo」: 「」, 「finalita」: 「」, 「tipologia」: 「」, 「ammortamento」: 「」, 「visite」:「20」,「timestamp」:「2012-06-25 10:48:01」,「nomefile」:「HPIM2268.jpg」}]

area字段不爲空,而是「Centro Città酒店」。其餘是正確的。 我試圖用mysql_fetch_assoc($ query)只顯示「area」字段,它返回正確的結果:「CentroCittà」。這個問題只適用於json_encode。

的SQL variabile的是:

$sql = sprintf("SELECT i.*, f.nomefile FROM immobili i LEFT JOIN foto f on(i.id=f.idimmobile AND f.copertina=1) WHERE i.id=%s", $_GET['id']); 

這只是一個例子,如果我問其他行,區域字段返回正確也與json_encode等領域返回null。它可能是與字符串和文本格式有關的問題嗎?

+0

至於['的mysql_query()'](http://php.net/manual PHP手冊說/en/function.mysql-query.php)函數:*不推薦使用這個擴展名。相反,[MySQLi](http://www.php.net/manual/en/book.mysqli.php)或[PDO_MySQL](http://www.php.net/manual/en/ref.pdo-應該使用mysql.php)擴展名。另請參見[MySQL:選擇API](http://www.php.net/manual/en/mysqlinfo.api.choosing.php)指南和[相關FAQ](http://www.php.net/manual /en/faq.databases.php#faq.databases.mysql.depcated)以獲取更多信息。* – eggyal 2012-07-05 12:02:57

+0

請顯示您的$ sql變量的值。 – eggyal 2012-07-05 12:03:13

+0

增加值謝謝 – Release 2012-07-05 14:39:24

回答

4

這是一個編碼問題。 json_encode()只接受UTF-8字符串,如果字符串不是有效的UTF-8,則返回null

您可以通過在將數據傳遞給json_encode之前轉換數據的編碼來解決此問題。看看iconv()mb_convert_encoding()

例如,假設您的數據編碼LATIN1:

$e = array_map(function($string) { 
    return iconv("iso-8859-1", "utf-8", $string); 
}, $e); 

$output[] = $e; 

或者,如果你有PHP < 5。3:

function cb($string) { 
    return iconv("iso-8859-1", "utf-8", $string); 
} 

$e = array_map('cb', $e); 

$output[] = $e; 
+0

我的varchars編碼在latin1_swedish_ci。它有幫助嗎?你的例子中的字符串是什麼?它是json編碼的結果嗎? – Release 2012-07-05 13:52:30

+0

是的,這證實了這是一個編碼問題,示例代碼應該可以不用修改 – arnaud576875 2012-07-05 13:55:10

+0

謝謝!我想知道什麼是$ string變量。它是json編碼的結果還是什麼?在我的情況(與latin_swedish_ci)我怎麼能轉換PHP腳本? – Release 2012-07-05 13:57:27

5

問題解決

$result = $mysql->query($sql); 
while($row = mysql_fetch_assoc($result)) { 
    $r[] = array_map('utf8_encode', $row); 
} 
echo json_encode($r); 

謝謝