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.