2017-07-19 2 views
0

Ich fing an, JSON zu lernen und eine Quiz-App zu entwickeln, die JSON von einer PHP-Seite holt, um es als HTML anzuzeigen. Ich wähle Daten von mysql Tabelle mit PHP aus und drucke es als json.php json_encode der gleiche Schlüssel wie Array

<?php 
    header('Access-Control-Allow-Origin: *'); 
    header("Cache-Control: no-cache"); 
    header('Content-Type: application/json'); 
    include("dbcon.php"); 
    $sql = "SELECT * FROM quiz;"; 
    $result = $conn->query($sql); 
    if ($result->num_rows > 0) { 
     // output data of each row 
     while($row = $result->fetch_assoc()) { 
      echo json_encode($row, JSON_PRETTY_PRINT)."\r\n"; 
     } 
    } 
    else { 
     echo "nodata"; 
    } 
$conn->close(); 
?> 

das Ergebnis:

{ 
"id": "1", 
"question": "ques1?", 
"opt1": "Microsoft", 
"opt2": "W3C", 
"opt3": "Google", 
"opt4": "IBM", 
"answer": "W3C" 
} 
{ 
"id": "2", 
"question": "ques2?", 
"opt1": "Yahoo", 
"opt2": "Google", 
"opt3": "Bing", 
"opt4": "DuckDuckGo", 
"answer": "Google" 
} 

Dieser Code funktioniert völlig in Ordnung und ziemlich druckt json. Aber wie die gleiche Schlüsselwert als Array zu drucken, so dass die Ausgabe wie-ist

{ 
    "id":[ "1", "2" ], 
    "question":[ "ques1?", "ques2?" ], 
    "opt1":[ "asd", "fgh" ], 
    "opt2":[ "qwe", "rty" ], 
    "opt3":[ "qwer", "vbbn" ], 
    "opt4":[ "asdfg", "ascvb" ], 
    "answer":[ "asd", "fgh" ], 
} 

Ich glaube, das Ergebnis i machen erwarten wird es einfach Daten von ihm zu lesen, mit Hilfe von Javascript durch etwas wie folgt aus: -

var q1 = myObj.question[0]; 

Ich sah viele Fragen mit dem gleichen Titel, aber sie sind alle verschiedenen Fälle. Bitte stelle eine Lösung bereit und korrigiere meine Dummheit, wenn ich falsch liege.

+2

Was Sie tun möchten, ist ein Array '$ Fragen', dann verwenden Sie $ Fragen [] = $ row; '. Danach können Sie mit 'json_encode ($ questions)' abschließen, um Ihr einzelnes Array von Frageobjekten zu erhalten. –

+1

Das ist * nicht * gültiger JSON. Und was Sie erreichen wollen, ist bestenfalls suboptimal. Sie wollen etwas wie '[{" id ": ...," question ": ..., ...}, {" id ": ..., ...}]'. – deceze

+2

"dieser Code funktioniert perfekt gut und schön druckt JSON" - oh nein, tut es nicht - das ist nicht JSON. – symcbean

Antwort

1

gültig JSON Um mit dem, was Sie im Moment haben Sie dies tun müssen:

header('Access-Control-Allow-Origin: *'); 
header("Cache-Control: no-cache"); 
header('Content-Type: application/json'); 
include("dbcon.php"); 
$sql = "SELECT * FROM quiz;"; 
$result = $conn->query($sql); 
$theResultIWant = []; 
if ($result->num_rows > 0) {   
    while($row = $result->fetch_assoc()) { 
     $theResultIWant[] = $row; 
    } 
} 
else { 
    echo "nodata"; 
} 
$conn->close(); 
echo json_encode($theResultIWant, JSON_PRETTY_PRINT); 
//That is all 

Um das gewünschte Ergebnis zu bekommen zu bekommen:

header('Access-Control-Allow-Origin: *'); 
header("Cache-Control: no-cache"); 
header('Content-Type: application/json'); 
include("dbcon.php"); 
$sql = "SELECT * FROM quiz;"; 
$result = $conn->query($sql); 
$theResultIWant = []; 
if ($result->num_rows > 0) {   
    while($row = $result->fetch_assoc()) { 
     foreach ($row as $key=>$value) { 
      $theResultIWant[$key] = $theResultIWant[$key]??[]; //or isset($theResultIWant[$key])?$theResultIWant[$key]:[]; in PHP < 7 
      $theResultIWant[$key][] = $value; 
     } 
    } 
} 
else { 
    echo "nodata"; 
} 
$conn->close(); 
echo json_encode($theResultIWant, JSON_PRETTY_PRINT); 

Entweder Ansatz sinnvoll ist JavaScript zu lesen mit , aber der zweite ist kompakter in Bezug auf die Größe (aber der erste kann mehr komprimiert werden, wenn Sie das Ergebnis GZipping).

+0

Die Zeile 12 gibt einen Fehler aus. Sollte ich den Code ändern und nicht kopieren wie ein Dummy? Kann nicht verwenden [] zum Lesen in /home/hackupv7/public_html/hacksercise/data/quiz.php in Zeile 12 Ich vermisse etwas offensichtlich. –

+0

@TusharTyagi welches ist die Linie 12? Welche Version von PHP benutzt du? – apokryfos

+0

ok nur mit $ theResultIWant [$ key] [] = $ value; erzeugt das gewünschte Ergebnis Dank –

1

definieren ein Array für Objekt vor der while-Schleife beispiel

$json=array(); 

Mit in der while-Schleife zu tun, wie folgend

$json['object-key'][]=$row['key']; 

Beispiel

$json['id'][]=$row['id']; 

Nach der while-Schleife convert $ json-Array für json-Objekt mit json_encode(); Funktion

1
 <?php 
     header('Access-Control-Allow-Origin: *'); 
     header("Cache-Control: no-cache"); 
     header('Content-Type: application/json'); 
     include("dbcon.php"); 
     $sql = "SELECT * FROM quiz;"; 
     $result = $conn->query($sql); 
     $dataArr = []; 
     if ($result->num_rows > 0) { 
      // output data of each row 
      while($row = $result->fetch_assoc()) {     

        $dataArr['id'][] = $row['id']; 

        $dataArr['question'][] = $row['question']; 

        $dataArr['opt1'][] = $row['opt1']; 

        $dataArr['opt2'][] = $row['opt2']; 

        $dataArr['opt3'][] = $row['opt3']; 

        $dataArr['opt4'][] = $row['opt4']; 

        $dataArr['answer'][] = $row['answer']; 

      } 
     } 
     else { 
      echo "nodata"; 
     } 
    $conn->close(); 
    ?> 
echo json_encode($dataArr, JSON_PRETTY_PRINT); 

Sie können verwenden, wie ich oben codiert habe.

+0

mit $ dataArr ['id'] [] = $ row ['id']; ist viel kürzer und einfacher und funktioniert ohne if-Anweisung. –

+0

ja du hast Recht –