-2

私のwhileループは次のとおりです。
挿入しようとしましたが、それぞれを挿入しようとしましjson_decodejson_encodeが、運がありませんでした。エラーJSON.parse が発生し続けます: JSON データの後に予期しない非空白文字

while ($row = $res->fetchRow()){
    $resGold = $row['gold'];
    $resSilver = $row['silver'];
    $resBronze = $row['bronze'];
    $resGdp = $row['gdp'];
    $resPopulation = $row['population'];
    $resCountry = $row['country_name'];
    $gold_score = ($resGold * $gold_value);
    $silver_score = ($resSilver * $silver_value);
    $bronze_score = ($resBronze * $bronze_value);
    $score_pop = (($gold_score + $silver_score + $bronze_score)/$resPopulation);
    $score_gdp = (($gold_score + $silver_score + $bronze_score)/$resGdp);
    if($population == 'true'){ 
        $result = $res->fetchRow();
        $result['score'] = "$score_pop";
        json_encode($result);
    }
    else if($gdp == 'true'){ 
        $result = $res->fetchRow(); 
        $result['score'] = "$score_gdp"; 
        json_encode($result);
    }
}
if($population == 'false' && $gdp == 'false'){
    echo "Please select either population or gdp from view.htm";
}

while ループの外になければならないことは理解json_encodeしていますが、これを行う方法がわかりません。
どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

1

あなたが引用した特定のエラー ( JSON.parse: JSON データの後の予期しない非空白文字) は、Javascript がそれをデコードしているときです。

json_encode混合値引数から文字列を返します。json_encode ドキュメント

echo結果を出力するか、別の変数に追加して後で出力する必要があります。例えば。

while ($row = $res->fetchRow()){
    $resGold = $row['gold'];
    $resSilver = $row['silver'];
    $resBronze = $row['bronze'];
    $resGdp = $row['gdp'];
    $resPopulation = $row['population'];
    $resCountry = $row['country_name'];
    $gold_score = ($resGold * $gold_value);
    $silver_score = ($resSilver * $silver_value);
    $bronze_score = ($resBronze * $bronze_value);
    $score_pop = (($gold_score + $silver_score + $bronze_score)/$resPopulation);
    $score_gdp = (($gold_score + $silver_score + $bronze_score)/$resGdp);
    if($population == 'true'){ 
        $result = $res->fetchRow();
        $result['score'] = "$score_pop";
        echo json_encode($result);
    }
    else if($gdp == 'true'){ 
        $result = $res->fetchRow(); 
        $result['score'] = "$score_gdp"; 
        echo json_encode($result);
    }
}
if($population == 'false' && $gdp == 'false'){
    echo "Please select either population or gdp from view.htm";
}

複数の行をエンコードしてそれらすべてを返そうとする場合は$result、配列に を追加し、whileそうでない場合と同じようにループの外でエンコードする方がよいでしょう。JSON 文字列は次のようになります。

{gold:123,silver:456,bronze:789}{gold:987,silver:654,bronze:321}

一度に 1 つのオブジェクトまたは配列しか解析できないため、これは有効な JSON ではありません。以下は有効な JSON 文字列です

[{gold:123,silver:456,bronze:789},{gold:987,silver:654,bronze:321}]

これはデータの配列表現であり、JSON でエンコードされたオブジェクトのリストに解析されます。JSON をエコーする前に配列を使用して格納するコードを次に示します。

$results = array();
while ($row = $res->fetchRow()){
    $resGold = $row['gold'];
    $resSilver = $row['silver'];
    $resBronze = $row['bronze'];
    $resGdp = $row['gdp'];
    $resPopulation = $row['population'];
    $resCountry = $row['country_name'];
    $gold_score = ($resGold * $gold_value);
    $silver_score = ($resSilver * $silver_value);
    $bronze_score = ($resBronze * $bronze_value);
    $score_pop = (($gold_score + $silver_score + $bronze_score)/$resPopulation);
    $score_gdp = (($gold_score + $silver_score + $bronze_score)/$resGdp);
    if($population == 'true'){ 
        $result = $res->fetchRow();
        $result['score'] = "$score_pop";
        array_push($results,$result);
    }
    else if($gdp == 'true'){ 
        $result = $res->fetchRow(); 
        $result['score'] = "$score_gdp"; 
        array_push($results,$result);
    }
}
if($population == 'false' && $gdp == 'false'){
    echo "Please select either population or gdp from view.htm";
}
else
{
    //Note: This is in the 'else' statement as echoing the JSON then that string
    //      will also cause errors as it ends up not being valid JSON anymore
    echo json_encode($results);
}

上記の例のように、人口または GDP の選択に関する文字列をエコーし​​ています。これは JSON エンコードされておらず、上記の部分は JSON でエンコードされているため、デコードしようとすると解析エラーが発生する可能性があります。この PHP ページが JSON でエンコードされたデータを返すことを意図しており、エラー メッセージが JSON でエンコードされていない場合、値を取得する際に問題が発生する可能性があります。

于 2013-04-27T02:28:05.417 に答える