JSON codiert MySQL-Ergebnisse


304

Wie verwende ich die json_encode()Funktion mit MySQL-Abfrageergebnissen? Muss ich die Zeilen durchlaufen oder kann ich sie einfach auf das gesamte Ergebnisobjekt anwenden?


1
Ich weiß, dass dies eine sehr alte Frage ist. Aber niemand zeigt die einfachste Alternative zur Behebung des Problems, dass Ganzzahlen als Zeichenfolgen angezeigt werden. @mouckatron bietet das JSON_NUMERIC_CHECK-Flag von json_encode()in der Antwort unten an. Einfach und es funktioniert wie ein Zauber! stackoverflow.com/questions/1390983/…
AlexGM

1
Es gibt eine passende Frage + Antwort bezüglich des String-Typ-Problems unter: stackoverflow.com/questions/28261613/…
Marcel Ennix

Antworten:


493
$sth = mysqli_query("SELECT ...");
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
    $rows[] = $r;
}
print json_encode($rows);

Die Funktion json_encodebenötigt PHP> = 5.2 und das php-json- Paket - wie hier erwähnt

HINWEIS : mysqlAb PHP 5.5.0 veraltet. Verwenden Sie mysqlistattdessen die Erweiterung http://php.net/manual/en/migration55.deprecated.php .


69
Ich würde Ihnen ebenso raten, zu erwähnen, dass dies während der Auswahlabfrage, mit ASder die Spalten in etwas für die Öffentlichkeit umbenannt werden sollen SELECT blog_title as title, sauberer ist und die Öffentlichkeit nicht weiß, welche genauen Spalten aus der Datenbank stammen.
RobertPitt

14
Dieser Code codiert fälschlicherweise alle numerischen Werte als Zeichenfolgen. Zum Beispiel hätte ein numerisches mySQL-Feld namens score einen JSON-Wert von "12" anstelle von 12 (beachten Sie die Anführungszeichen).
Theo

24
@RobertPitt, Sicherheit basierend auf dem Verbergen von Namen Ihrer Spalten ist Sicherheit durch Dunkelheit !
TMS

4
@Tomas wahr, aber die genauen Spaltennamen zu kennen, macht SQL-Injection-Angriffe erheblich einfacher
Tim Seguine

16
@Tim: Wenn Sie an einem Punkt angelangt sind, an dem die Bekanntheit Ihrer Spaltennamen das einzige Hindernis für die SQL-Injection ist, das Sie bereits verloren haben, nein?
Paolo Bergantino

44

Versuchen Sie dies, dies wird Ihr Objekt richtig erstellen

 $result = mysql_query("SELECT ...");
 $rows = array();
   while($r = mysql_fetch_assoc($result)) {
     $rows['object_name'][] = $r;
   }

 print json_encode($rows);

1
+1 Dies scheint die einzige Antwort zu sein, die JSON im gleichen Format wie die Beispiele unter json.org/example bereitstellt .
Ban-Geoengineering

Ja, dieses Beispiel gibt einen Schlüssel pro Zeile an.
Mar

26

http://www.php.net/mysql_query sagt " mysql_query()gibt eine Ressource zurück".

http://www.php.net/json_encode sagt, dass es jeden Wert "außer einer Ressource" codieren kann.

Sie müssen die Datenbankergebnisse durchlaufen und in einem Array und dann json_encodeim Array sammeln .


2
mysql_query gibt keine Ergebnismenge zurück. Dafür ist mysql_fetch * da.
Andy

Ähm ... ja ... das ist es, was in der Iteration zwischen mysql_query und json_encode passiert. Guter Anruf, Watson.
Hugh Bothwell

17

Danke, das hat mir sehr geholfen. Mein Code:

$sqldata = mysql_query("SELECT * FROM `$table`");

$rows = array();
while($r = mysql_fetch_assoc($sqldata)) {
  $rows[] = $r;
}

echo json_encode($rows);

Dieser wird uns ein Array geben, das enthält; 1) eine leere eckige Klammer 2) gefolgt von der geschweiften Klammer mit unseren zurückgegebenen Ergebniszeilen. Was unterscheidet diese von der anderen?
Gumuruh

11

Danke .. meine Antwort lautet:

if ($result->num_rows > 0) {
            # code...
            $arr = [];
            $inc = 0;
            while ($row = $result->fetch_assoc()) {
                # code...
                $jsonArrayObject = (array('lat' => $row["lat"], 'lon' => $row["lon"], 'addr' => $row["address"]));
                $arr[$inc] = $jsonArrayObject;
                $inc++;
            }
            $json_array = json_encode($arr);
            echo $json_array;
        }
        else{
            echo "0 results";
        }

9

Das Obige wird meiner Erfahrung nach nicht funktionieren, bevor Sie das Stammelement im Array mit etwas benennen. Ich konnte vorher im letzten JSON auf nichts zugreifen.

$sth = mysql_query("SELECT ...");
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
    $rows['root_name'] = $r;
}
print json_encode($rows);

Das sollte den Trick machen!

Par


8

Der folgende Code funktioniert hier einwandfrei!

<?php

  $con=mysqli_connect("localhost",$username,$password,databaseName);

  // Check connection
  if (mysqli_connect_errno())
  {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

  $query = "the query here";

  $result = mysqli_query($con,$query);

  $rows = array();
  while($r = mysqli_fetch_array($result)) {
    $rows[] = $r;
  }
  echo json_encode($rows);

  mysqli_close($con);
?>

5

Meine einfache Lösung, um zu verhindern, dass numerische Werte mit Sprachmarkierungen versehen werden ...

while($r = mysql_fetch_assoc($rs)){
    while($elm=each($r))
    {
        if(is_numeric($r[$elm["key"]])){
                    $r[$elm["key"]]=intval($r[$elm["key"]]);
        }
    }
    $rows[] = $r;
}   

5

Entschuldigung, das ist extrem lange nach der Frage, aber:

$sql = 'SELECT CONCAT("[", GROUP_CONCAT(CONCAT("{username:'",username,"'"), CONCAT(",email:'",email),"'}")), "]") 
AS json 
FROM users;'
$msl = mysql_query($sql)
print($msl["json"]);

Nur im Grunde:

"SELECT" Select the rows    
"CONCAT" Returns the string that results from concatenating (joining) all the arguments
"GROUP_CONCAT" Returns a string with concatenated non-NULL value from a group

Beachten Sie, dass dies GROUP_CONCAT()durch begrenzt ist group_concat_max_len.
Eggyal

4

Wir könnten die Antwort von Paolo Bergantino so vereinfachen

$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));

4
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','dishant');

$con = mysqli_connect(HOST,USER,PASS,DB);


  if (mysqli_connect_errno())
  {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

 $sql = "select * from demo ";

 $sth = mysqli_query($con,$sql);

$rows = array();

while($r = mysqli_fetch_array($sth,MYSQL_ASSOC)) {

 $row_array['id'] = $r;

    **array_push($rows,$row_array);**
}
echo json_encode($rows);

mysqli_close($con);
?>

aarray_push ($ rows, $ row_array); Hilfe beim Erstellen eines Arrays, andernfalls wird der letzte Wert in der while-Schleife angegeben

Dies funktioniert wie die Append- Methode von StringBuilder in Java


3

Eine weitere Option mit der FOR-Schleife:

 $sth = mysql_query("SELECT ...");
 for($rows = array(); $row = mysql_fetch_assoc($sth); $rows[] = $row);
 print json_encode($rows);

Der einzige Nachteil ist, dass die Schleife für langsamer ist als zB während oder besonders für jede


3

Zum Beispiel $ result = mysql_query ("SELECT * FROM Benutzerprofile wobei NAME = 'TESTUSER'");

1.) wenn $ result nur eine Zeile ist.

$response = mysql_fetch_array($result);
echo json_encode($response);

2.) wenn $ result mehr als eine Zeile ist. Sie müssen die Zeilen iterieren und in einem Array speichern und einen JSON mit Array zurückgeben.

$rows = array();
if (mysql_num_rows($result) > 0) {
    while($r = mysql_fetch_assoc($result)) {
       $id = $r["USERID"];   //a column name (ex.ID) used to get a value of the single row at at time
       $rows[$id] = $r; //save the fetched row and add it to the array.
    }
}    
echo json_encode($rows);

3

Ich habe die gleiche Anforderung. Ich möchte nur ein Ergebnisobjekt im JSON-Format drucken, daher verwende ich den folgenden Code. Ich hoffe du findest etwas darin.

// Code of Conversion
$query = "SELECT * FROM products;";
$result = mysqli_query($conn , $query);

if ($result) {
echo "</br>"."Results Found";

// Conversion of result object into JSON format
$rows = array();
while($temp = mysqli_fetch_assoc($result)) {
    $rows[] = $temp;
}
echo "</br>" . json_encode($rows);

} else {
    echo "No Results Found";
}

3

Überprüfen Sie den folgenden Code für die Verwendung von mysql_fetch und json_encode. Sie müssen die Zeilen durchlaufen, aber wenn Sie mysqli verwenden, ändert sich die Situation

$kt_query="SELECT * FROM tbl_xxx";
$kt_result = mysql_query($kt_query) or die('Query failed: ' . mysql_error());
$rows= array();
while($sonuc=mysql_fetch_assoc($kt_result))
{
    $rows[]=$sonuc;
}
print json_encode($rows);

3

Ich habe so gelöst

$stmt->bind_result($cde,$v_off,$em_nm,$q_id,$v_m);
    $list=array();
    $i=0;
    while ($cresult=$stmt->fetch()){    


        $list[$i][0]=$cde;
        $list[$i][1]=$v_off;
        $list[$i][2]=$em_nm;
        $list[$i][3]=$q_id;
        $list[$i][4]=$v_m;
        $i=$i+1;
    }
    echo json_encode($list);        

Dies wird als Ergebnismenge und unter Verwendung von json parse in einem Javascript-Teil wie folgt an ajax zurückgegeben:

obj = JSON.parse(dataX);

2
$array = array();
$subArray=array();
$sql_results = mysql_query('SELECT * FROM `location`');

while($row = mysql_fetch_array($sql_results))
{
    $subArray[location_id]=$row['location'];  //location_id is key and $row['location'] is value which come fron database.
    $subArray[x]=$row['x'];
    $subArray[y]=$row['y'];


 $array[] =  $subArray ;
}
echo'{"ProductsData":'.json_encode($array).'}';

2

Code:

$rows = array();

while($r = mysqli_fetch_array($result,MYSQL_ASSOC)) {

 $row_array['result'] = $r;

  array_push($rows,$row_array); // here we push every iteration to an array otherwise you will get only last iteration value
}

echo json_encode($rows);


-3

$sql = "SELECT JSON_ARRAYAGG(JSON_OBJECT('id', tbl.id)) FROM table tbl WHERE... "; 

//And get first row :) 

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.