php json_encode返回无效的json

时间:2012-09-03 10:56:04

标签: php json

以下PHP返回无效的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 “:” parameter9" , “page1Title10”: “parameter10”, “Page1Text1”: “parameter11”, “Page1Text2”: “parameter12”, “Page1Text3”: “parameter13”, “Page1Text4”: “parameter14”, “Page1Text5” : “parameter15”, “Page1Text6”: “parameter16”, “Page1Text7”: “parameter17”, “Page1Text8”: “parameter18”, “Page1Text9”: “parameter19”, “Page1Text10”:“parameter20   参数20参数20参数20参数20参数20   参数20参数20参数20参数20参数20   参数20参数20参数20参数20参数20   参数20参数20参数20参数20参数20   参数20参数20参数20参数20参数20   parameter20   ”, “Page1Text11”: “parameter21”, “Page1Text12”: “parameter22”, “Page1Text13”: “parameter23”, “Page1Text14”: “parameter24”, “Page1Text15”: “parameter25”, “Page1Text16”: “parameter26” “Page1Text17”: “”, “Page1Text18”: “”, “Page1Text19”: “”, “Page2Title1”: “”}

如何修复此问题并传递有效的json输出?


显然json是有效的。出于某种原因,从浏览器复制到http://jsonlint.com/时出现错误。

2 个答案:

答案 0 :(得分:0)

它是有效的JSON。我在http://jsonlint.com/上尝试了它并解析得很好。

还可以完美地解析为JavaScript变量: http://jsfiddle.net/FdYE6/

答案 1 :(得分:0)

三个(可能的)问题,只有一个与您的问题直接相关:

  • json_encode需要utf-8编码数据。您在问题中发布的数据集似乎不包含“有问题”的字符(它们似乎都在ascii7范围内,而utf-8 / ascii7具有相同的字符表示)。这仍然是一个问题。您必须设置mysql连接字符集以从mysql服务器获取utf-8编码数据。
  • 您将参数作为字符串文字放入sql语句中。然后你必须处理sql注入,即你必须正确编码/转义实际参数值。即使您(目前)确定$ website不能包含可能破坏查询的字符。
  • 将mysql扩展名标记为已弃用,最好使用另一个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);