2017-01-15 5 views
0

まず、タイトルがオフであればごめんなさい...私が直面している問題について考えることができる最高のものです。PHP変数はすべてのオブジェクトの代わりにデータベース内の最後のオブジェクトを取得します

私のデータベースには、アプリのリストがあります。 PHPでは、キーからデータを取り出し、そのデータをJSONにエンコードして印刷します(APIを作成しています)。

しかし、最後のアプリだけがJSONでプリントアウトされます。私が必要とするのは、同じキーを持つすべてのアプリケーションを持つJSON配列です。そのため、後でループしてデータを印刷できます。

マイコード:上記の場合

$getApp = "SELECT * FROM tundra.apps WHERE app_key = '" . $api_key . "'"; 
$appData = $dbConnection->query($getApp); 

if ($appData->num_rows > 0){ // Check if app_key exists 
    while($row = $appData->fetch_assoc()) { // While retrieving rows 
     $jsonApp = json_encode(array(// Encode the row data 
      "app_name" => $row['app_name'], 
      "app_theme" => array(
       "primary_color" => $row['app_primary_color'], 
       "primary_color_dark" => $row['app_primary_dark_color'], 
       "accent_color" => $row['app_accent_color'], 
      ), 
      "app_navigation" => $row['app_navigation'], 
      "author_info" => array(
       "author_name" => $row['app_author_name'], 
       "author_bio" => $row['app_author_bio'], 
       "links" => array(
        "website" => $row['app_author_website'], 
        "googleplus" => $row['app_author_gplus'], 
        "twitter" => $row['app_author_twitter'], 
        "dribble" => $row['app_author_dribble'], 
        "behance" => $row['app_author_behance'], 
       ) 
      ), 
      "app_status" => $row['app_status'] 
     ), JSON_UNESCAPED_SLASHES); 
    } 
    // Format and print JSON data 
    echo "<pre>" . prettyPrint($jsonApp) . "</pre>"; 
} else { // No key found, encode error 
    $jsonError = json_encode(
    array(
     array(
      "error" => array(
       "code" => "8", 
       "message" => "Invalid API key specified" 
      ) 
     ) 
    ), JSON_UNESCAPED_SLASHES); 
    echo "<pre>" . prettyPrint($jsonError) . "</pre>"; 
} 

、Iは、whileループでJSONデータをエコーし​​ようとしたが、それは(予想通り)行ごとに<pre>のプリント。データが完全にフォーマットされますが、私は、配列にあることがデータを必要と私はこれを行う方法のようわからないよ:

{ 
    "app_name":"Andrew's Second App", 
    "app_theme":{ 
     "primary_color":"#FFFFFF", 
     "primary_color_dark":"#E0E0E0", 
     "accent_color":"#E91E63" 
    }, 
    "app_navigation":"0", 
    "author_info":{ 
     "author_name":"Andrew Quebe", 
     "author_bio":"I'm a developer of stuff.", 
     "links":{ 
      "website":"http://www.andrewquebe.com", 
      "googleplus":"https://plus.google.com/+AndrewQuebe", 
      "twitter":"https://twitter.com/andrew_quebe", 
      "dribble":"None", 
      "behance":"None" 
     } 
    }, 
    "app_status":"1" 
} 

注:

は、ここで上記のコードからJSON出力です。

+0

、あなたは私がデータを配列にする必要があります*によって何を意味しています*:

は、だからあなたのコードは次のようにすべきですか?サンプル*期待値*の出力を見せてもらえますか? –

+0

あなたは各ループでそれを追加するのではなく、 '$ jsonApp'を上書きします。 – nogad

+0

@RajdeepPaulはい...このようなもの:http://pastebin.com/ZBFkDyXy –

答えて

1

問題あなたはwhile()ループの各反復でjson_encode()関数を適用している、プラスあなたは各反復で$jsonAppを上書きしている、です。そのため、にはという出力が表示されます。

解決策は、while()ループ外の空の結果配列を作成します。 while()ループの各繰り返しでは、を結果配列に配列にプッシュします。最後にループから抜け出した後、結果配列にjson_encode()関数を適用して表示します。

有効なJSON文字列です
// your code 

if ($appData->num_rows > 0){ // Check if app_key exists 
    $resultArr = array(); 
    while($row = $appData->fetch_assoc()) { // While retrieving rows 
     $resultArr[] = array(// Encode the row data 
      "app_name" => $row['app_name'], 
      "app_theme" => array(
       "primary_color" => $row['app_primary_color'], 
       "primary_color_dark" => $row['app_primary_dark_color'], 
       "accent_color" => $row['app_accent_color'], 
      ), 
      "app_navigation" => $row['app_navigation'], 
      "author_info" => array(
       "author_name" => $row['app_author_name'], 
       "author_bio" => $row['app_author_bio'], 
       "links" => array(
        "website" => $row['app_author_website'], 
        "googleplus" => $row['app_author_gplus'], 
        "twitter" => $row['app_author_twitter'], 
        "dribble" => $row['app_author_dribble'], 
        "behance" => $row['app_author_behance'], 
       ) 
      ), 
      "app_status" => $row['app_status'] 
     ); 
    } 
    $jsonApp = json_encode($resultArr, JSON_UNESCAPED_SLASHES); 
    // Format and print JSON data 
    echo "<pre>" . prettyPrint($jsonApp) . "</pre>"; 
} else { // No key found, encode error 
    $jsonError = json_encode(
    array(
     array(
      "error" => array(
       "code" => "8", 
       "message" => "Invalid API key specified" 
      ) 
     ) 
    ), JSON_UNESCAPED_SLASHES); 
    echo "<pre>" . prettyPrint($jsonError) . "</pre>"; 
} 
+0

素敵です。どうもありがとうございます!私は論理的に考えていなかったと思う;) –

+0

@AndrewQuebeよろしくお願いします!お役に立てて嬉しいです。 ;-) –

0

あなたの例の6行目で、json_encodeの出力を$ jsonApp変数に割り当てていると思います。そのような配列を使う方が簡単です。

$jsonApp[] = array(

最後にjson_encodeを使用してください。あなたのwhileループで

echo "<pre>" . prettyPrint(json_encode($jsonApp)) . "</pre>"; 
+0

これは無効なJSONを表示します。文字列を連結するだけで配列内の値を結合するのではなく、APIを使用してアプリをクラッシュさせる可能性があるからです。 –

+0

確かにこの出力を参照してください:http://pastebin.com/zjKTJc8q –

1

、あなたは$jsonAppに絶えず再asigning値です。

$getApp = "SELECT * FROM tundra.apps WHERE app_key = '" . $api_key . "'"; 
 
$appData = $dbConnection->query($getApp); 
 

 
if ($appData->num_rows > 0){ // Check if app_key exists 
 
    for($i=0;$row = $appData->fetch_assoc();i++) { // While retrieving rows 
 
     $jsonApp[i] = array(// Encode the row data 
 
      "app_name" => $row['app_name'], 
 
      "app_theme" => array(
 
       "primary_color" => $row['app_primary_color'], 
 
       "primary_color_dark" => $row['app_primary_dark_color'], 
 
       "accent_color" => $row['app_accent_color'], 
 
      ), 
 
      "app_navigation" => $row['app_navigation'], 
 
      "author_info" => array(
 
       "author_name" => $row['app_author_name'], 
 
       "author_bio" => $row['app_author_bio'], 
 
       "links" => array(
 
        "website" => $row['app_author_website'], 
 
        "googleplus" => $row['app_author_gplus'], 
 
        "twitter" => $row['app_author_twitter'], 
 
        "dribble" => $row['app_author_dribble'], 
 
        "behance" => $row['app_author_behance'], 
 
       ) 
 
      ), 
 
      "app_status" => $row['app_status'] 
 
     ); 
 
    } 
 
    $json = json_encode($jsonApp,JSON_UNESCAPED_SLASHES); 
 
    // Format and print JSON data 
 
    echo "<pre>" . prettyPrint($json) . "</pre>"; 
 
} else { // No key found, encode error 
 
    $jsonError = json_encode(
 
    array(
 
     array(
 
      "error" => array(
 
       "code" => "8", 
 
       "message" => "Invalid API key specified" 
 
      ) 
 
     ) 
 
    ), JSON_UNESCAPED_SLASHES); 
 
    echo "<pre>" . prettyPrint($jsonError) . "</pre>"; 
 
}

これは、個々のアプリのエントリを表す配列の各要素に、JSONの配列を表示する必要があります:私はより多くのこのような値を追加することをお勧めします。

+0

このアプローチはあなたのコードを読むことによって論理的だと思われますが、実装すればHTTP 500エラーが発生します。私は何が文法的に間違っているのか分からない。 –

0

これはJSONの形式です。異なる形を出力することはできません。ただし、このJSON出力をデコードするときは、objcetまたはarrayをデコードすることができます。

$object = json_decode($json); 

$array = json_decode($json, true); 
+0

これはどのようにして問題を解決しますか? –

+0

@LeoWilsonは問題がコードに興味がないので解決しません。クライアントはこのjson出力を読むのに興味があります。 –

+0

これは私の状況には当てはまりません。 –

関連する問題