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?

Trick Jarrett
quelle
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 .

Paolo Bergantino
quelle
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);
ddavtian
quelle
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 .

Hugh Bothwell
quelle
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);
Tokes
quelle
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";
        }
Aashima
quelle
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

Par
quelle
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);
?>
Ferreirabraga
quelle
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;
}   
James
quelle
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
gear4
quelle
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));
jrran90
quelle
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

DishantPatel
quelle
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

NGix
quelle
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);
Jyoti Prakash
quelle
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";
}
Darshan Dhoriya
quelle
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);
user3172285
quelle
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);
Bineesh
quelle
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).'}';
Bijender Singh Shekhawat
quelle
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);
inrsaurabh
quelle
0
$rows = json_decode($mysql_result,true);

so einfach ist das :-)

AMG Sistemas y Desarrollo
quelle
-3

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

//And get first row :) 

Andrey Mashukov
quelle