JSON encode les résultats MySQL


304

Comment utiliser la json_encode()fonction avec les résultats de requête MySQL? Dois-je parcourir les lignes ou puis-je simplement l'appliquer à l'objet de résultats entier?


1
Je sais que c'est une très vieille question. Mais personne ne montre l'alternative la plus simple pour résoudre le problème des entiers apparaissant sous forme de chaînes. @mouckatron propose le drapeau JSON_NUMERIC_CHECK json_encode()dans la réponse ci-dessous. Simple et ça marche comme un charme! stackoverflow.com/questions/1390983/…
AlexGM

1
Il y a une question et une réponse correspondantes concernant le problème de type de chaîne à: stackoverflow.com/questions/28261613/…
Marcel Ennix

Réponses:


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

La fonction a json_encodebesoin de PHP> = 5.2 et du paquet php-json - comme mentionné ici

REMARQUE : mysqlest obsolète à partir de PHP 5.5.0, utilisez mysqliplutôt l'extension http://php.net/manual/en/migration55.deprecated.php .


69
Je vous conseillerais de mentionner que lors de la requête de sélection à utiliser ASpour renommer les colonnes en quelque chose pour le public, par exemple SELECT blog_title as title, c'est plus propre et le public ne sait pas quelles sont les colonnes exactes de la base de données.
RobertPitt

14
Ce code code par erreur toutes les valeurs numériques sous forme de chaînes. Par exemple, un champ numérique mySQL appelé score aurait une valeur JSON de "12" au lieu de 12 (notez les guillemets).
Theo

24
@RobertPitt, la sécurité basée sur la dissimulation des noms de vos colonnes est une sécurité par obscurité !
TMS

4
@Tomas true, mais la connaissance du nom exact des colonnes facilite considérablement les attaques par injection SQL
Tim Seguine

16
@Tim: Si vous arrivez au point où les noms de vos colonnes connus sont le seul obstacle à l'injection SQL que vous avez déjà perdu, non?
Paolo Bergantino

44

Essayez ceci, cela créera votre objet correctement

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

 print json_encode($rows);

1
+1 Cela semble être la seule réponse qui fournit JSON dans le même format que les exemples sur json.org/example .
ban-geoengineering

Oui, cet exemple donne une clé par ligne.
Mar

26

http://www.php.net/mysql_query dit " mysql_query()renvoie une ressource".

http://www.php.net/json_encode dit qu'il peut encoder n'importe quelle valeur "sauf une ressource".

Vous devez parcourir et collecter les résultats de la base de données dans un tableau, puis json_encodele tableau.


2
mysql_query ne retourne pas de jeu de résultats. c'est à cela que sert mysql_fetch *.
Andy

Hum ... ouais ... c'est ce qui se passe dans l'itération, entre mysql_query et json_encode. Bon appel, Watson.
Hugh Bothwell

17

Merci, cela m'a beaucoup aidé. Mon code:

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

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

echo json_encode($rows);

celui-ci, nous donnera un tableau contenant; 1) une parenthèse carrée vide 2) suivie par la parenthèse bouclée contenant nos lignes de résultat retournées quelle est cette différence par rapport à l'autre?
gumuruh

11

Merci .. ma réponse va:

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

D'après mon expérience, ce qui précède ne fonctionnera pas avant de nommer l'élément racine du tableau à quelque chose, je n'ai pas pu accéder à quoi que ce soit dans le json final avant cela.

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

Cela devrait faire l'affaire!

Par


8

Le code ci-dessous fonctionne bien ici!

<?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

Ma solution simple pour l'empêcher de mettre des marques vocales autour des valeurs numériques ...

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

Désolé, c'est extrêmement long après la question, mais:

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

Fondamentalement:

"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

Attention, c'est GROUP_CONCAT()limité par group_concat_max_len.
eggyal

4

nous pourrions simplifier la réponse de Paolo Bergantino comme ceci

$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 ($ lignes, $ ligne_array); aider à construire un tableau sinon il donne la dernière valeur dans la boucle while

ce travail comme la méthode d' ajout de StringBuilder en java


3

Encore une option en utilisant la boucle FOR:

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

Le seul inconvénient est que la boucle for est plus lente que par exemple pendant ou surtout foreach


3

Par exemple $ result = mysql_query ("SELECT * FROM userprofiles where NAME = 'TESTUSER'");

1.) si $ result n'est qu'une seule ligne.

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

2.) si $ result est plus d'une ligne. Vous devez itérer les lignes et l'enregistrer dans un tableau et renvoyer un json contenant un tableau.

$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

J'ai la même exigence. Je veux juste imprimer un objet résultat au format JSON, donc j'utilise le code ci-dessous. J'espère que vous y trouverez quelque chose.

// 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

Vérifiez le code ci-dessous pour utiliser mysql_fetch et json_encode. Vous devrez parcourir les lignes mais si vous utilisez mysqli, la situation changera

$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

J'ai résolu comme ça

$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);        

Cela sera retourné à ajax en tant que jeu de résultats et en utilisant json parse dans la partie javascript comme ceci:

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 :) 

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.