-2

次の 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":"235","URL":"coucou","themeID":"1","telephone":"","websiteTitle":"","description" :"","キーワード":"","nomEntreprise":"","住所":"","email":"","Page1Title1":"parameter1","Page1Title2":"parameter2","Page1Title3 ":"parameter3","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 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/にコピーすると、何らかの理由でエラーが発生しました。

4

2 に答える 2

0

有効な JSON です。http://jsonlint.com/で試してみたところ、問題なく解析されました。

また、JavaScript 変数として完全に解析されます: http://jsfiddle.net/FdYE6/

于 2012-09-03T11:07:06.317 に答える
0

3 つの (考えられる) 問題のうち、質問に直接関連するのは 1 つだけです。

  • json_encode は、utf-8 でエンコードされたデータを想定しています。質問に投稿したデータセットには、「問題のある」文字が含まれていないようです (すべて ascii7 の範囲内にあり、utf-8/ascii7 の文字表現は同じです)。それでもこれは問題になる可能性があります。mysql サーバーから utf-8 でエンコードされたデータを取得するには、mysql 接続文字セットを設定する必要があります。
  • パラメータを文字列リテラルとして sql ステートメントに入れます。次に、SQL インジェクションを処理する必要があります。つまり、実際のパラメータ値を適切にエンコード/エスケープする必要があります。(現時点で) $website にクエリを壊す可能性のある文字を含めることはできないと確信している場合でも.
  • mysql エクステイオンは非推奨としてマークされています。別の API/モジュールを使用して 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);
于 2012-09-03T11:18:45.090 に答える