2012-09-03 152 views
-2

以下PHP返回無效JSON:PHP json_encode返回無效JSON

$sql = 'select * from website where websiteID = "'. $websiteID .'"'; 
$q = mysql_query($sql) or die(mysql_error()); 
$res = json_encode(mysql_fetch_assoc($q)); 
echo $res; 

這裏是從瀏覽器中複製的JSON:

{ 「websiteID」: 「162」, 「用戶ID」 : 「235」, 「URL」: 「coucou」, 「的ThemeID」: 「1」, 「電話」: 「」, 「websiteTitle」: 「」, 「說明」: 「」, 「關鍵詞」: 「」,」 nomEntreprise 「:」 「 」住址「: 」「, 」電子郵件「: 」「, 」Page1Title1「: 」參數1「, 」Page1Title2「: 」參數2「, 」Page1Title3「: 」參數3「, 」Page1Title4「:」 parameter4 「 」Page1Title5「: 」parameter5「, 」page1Title6「: 」parameter6「, 」page1Title7「: 」parameter7「, 」page1Title8「: 」parameter8「, 」page1Title9「:」 p arameter9" , 「page1Title10」: 「parameter10」, 「Page1Text1」: 「parameter11」, 「Page1Text2」: 「parameter12」, 「Page1Text3」: 「parameter13」, 「Page1Text4」: 「parameter14」, 「Page1Text5」: 「parameter15」 ,「Page1Text6」:「parameter16」,「Page1Text7」:「parameter17」,「Page1Text8」:「parameter18」,「Page1Text9」:「parameter19」,「Page1Text10」:「parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 parameter20 「 」Page1Text11「: 」parameter21「, 」Page1Text12「: 」parameter22「, 」Page1Text13「: 」parameter23「,」 Page1Text14 「:」 parameter24" , 「Page1Text15」: 「parameter25」,「Page1Text16 「:」 parameter26" , 「Page1Text17」: 「」, 「Page1Text18」: 「」, 「Page1Text19」: 「」, 「Page2Title1」: 「」}

我怎樣才能解決這個問題,並通過一個有效的JSON輸出?


顯然json是有效的。由於某種原因,我從瀏覽器複製到http://jsonlint.com/時出錯。

+0

你確定它是無效的json嗎? [它工作正常](http://codepad.viper-7.com/iGIywA) – Leri

+2

這是完全有效的JSON。 – deceze

+0

JSON有什麼問題?我認爲它的正確 – Wearybands

回答

0

三(可能的)問題,只有一個直接關係到你的問題:

  • json_encode預計UTF-8編碼的數據。您在問題中發佈的數據集似乎沒有包含「有問題」的字符(它似乎都在ascii7範圍內,而utf-8/ascii7具有相同的字符表示形式)。這仍然是一個問題。你必須設置mysql連接字符集來從mysql服務器獲取utf-8編碼數據。
  • 您將參數作爲字符串文字放入sql語句中。然後你必須注意sql注入,即你必須正確編碼/逃避實際參數值。即使您(現在)確定$網站不能包含可能會破壞查詢的字符。
  • mysql exteion被標記爲已棄用,最好使用另一個api/modlue與mysql服務器通信,例如,庫MySQLi或pdo

不過,如果你的php,mysql的模塊支持功能mysql_set_charset()有可能得到它與舊的MySQL擴展工作。但是你需要在兩端都做到這一點:插入/更新數據和檢索數據。見https://dev.mysql.com/doc/refman/5.1/en/charset.html

<?php 
$mysql = mysql_connect('localhost', 'localonly', 'localonly') 
if (!$mysql) { 
    youErrorHandler($mysql); 
} 
$rc = mysql_set_charset('utf8', $mysql); 
if (!$rc) { 
    youErrorHandler($mysql); 
} 

$sql = sprintf(
    " 
     SELECT 
      * 
     FROM 
     website 
     WHERE 
      websiteID = '%s' 
     LIMIT 
      1 
    ", 
    mysql_real_escape_string($websiteID, $mysql) 
); 
$q = mysql_query($sql, $mysql) or die(mysql_error($mysql)); 
$row = mysql_fetch_assoc($q); 
if (!$row) { 
    $row = array('error'=>'no result'); 
} 
$res = json_encode($row);