phpjson_encode返回无效的json


php json_encode returns invalid 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","userID"::"参数5","page1Title6":"参数6","page1Title7":"parameter7","page 1Title8":"parameter8","page1Title9":"parameter9","page1Title10":"arameter10","Page1Text1":"parameter11","Page 1Text2":"Parameters12","page 1Text3":"参数13","页面1Text4":"参数14","佩奇1Text5":"参量15","页码1Text6":"自变量16","页1Text7":"parameter17","页数1Text8":"memeter18","分页1Text9":参数20参数20参数参数20参数20参数参数20参数20参数参数20参数20参数参数20参数20参数参数20","Page1Text11":"parameter21","Page1Text12":"arameter22","Page 1Text13":"parameter23","page 1Text14":"Parameters24","佩奇1Text15":"parameter25","页面1Text16":"参数26","页码1Text17":","页1Text18":"页1Txt19":","Page2Title1":"

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


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

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

此外,它被完美地解析为JavaScript变量:http://jsfiddle.net/FdYE6/

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

  • json_encode期望utf-8编码的数据。你在问题中发布的数据集似乎不包含"有问题"的字符(它似乎都在ascii7范围内,utf-8/ascii7具有相同的字符表示)。不过,这可能是个问题。您必须设置mysql连接字符集才能从mysql服务器获得utf-8编码的数据
  • 您将参数作为字符串文字放入sql语句中。然后,您必须处理sql注入,也就是说,您必须正确地对实际参数值进行编码/转义。即使您(目前)确信$website不能包含可能破坏查询的字符
  • 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);