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?

Trick Jarrett
la source
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 .

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

Hugh Bothwell
la source
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);
Tokes
la source
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";
        }
aashima
la source
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

Par
la source
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);
?>
ferreirabraga
la source
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;
}   
James
la source
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
gear4
la source
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));
jrran90
la source
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

DishantPatel
la source
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

NGix
la source
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);
Jyoti Prakash
la source
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";
}
Darshan Dhoriya
la source
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);
user3172285
la source
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);
Bineesh
la source
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
la source
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
la source
0
$rows = json_decode($mysql_result,true);

aussi simple que cela :-)

AMG Sistemas y Desarrollo
la source
-3

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

//And get first row :) 

Andrey Mashukov
la source