2012-09-03 121 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);