JSON codifica resultados de MySQL

304

¿Cómo uso la json_encode()función con los resultados de la consulta MySQL? ¿Necesito iterar a través de las filas o puedo simplemente aplicarlo a todo el objeto de resultados?

Truco Jarrett
fuente
1
Sé que esta es una pregunta muy antigua. Pero nadie muestra la alternativa más simple para solucionar el problema de los enteros que aparecen como cadenas. @mouckatron ofrece el indicador JSON_NUMERIC_CHECK de json_encode()en la respuesta a continuación. ¡Simple y funciona como un encanto! stackoverflow.com/questions/1390983/…
AlexGM
1
Hay una pregunta + respuesta correspondiente sobre el problema del tipo de cadena en: stackoverflow.com/questions/28261613/…
Marcel Ennix

Respuestas:

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

La función json_encodenecesita PHP> = 5.2 y el paquete php-json , como se menciona aquí

NOTA : mysqlestá en desuso a partir de PHP 5.5.0, use la mysqliextensión en su lugar http://php.net/manual/en/migration55.deprecated.php .

Paolo Bergantino
fuente
69
Le aconsejaría que mencione que durante la consulta de selección ASpara cambiar el nombre de las columnas a algo público, por ejemplo SELECT blog_title as title, esto es más limpio y el público no sabe cuáles son las columnas exactas de la base de datos.
RobertPitt
14
Este código codifica erróneamente todos los valores numéricos como cadenas. Por ejemplo, un campo numérico mySQL llamado puntaje tendría un valor JSON de "12" en lugar de 12 (observe las comillas).
Theo
24
@RobertPitt, ¡la seguridad basada en ocultar nombres de sus columnas es seguridad por oscuridad !
TMS
44
@Tomas es cierto, pero conocer los nombres exactos de las columnas hace que los ataques de inyección SQL sean mucho más fáciles
Tim Seguine
16
@Tim: Si está llegando al punto en que los nombres de sus columnas conocidos son la única barrera para la inyección SQL que ya perdió, ¿no?
Paolo Bergantino
44

Prueba esto, esto creará tu objeto correctamente

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

 print json_encode($rows);
ddavtian
fuente
1
+1 Esta parece ser la única respuesta que proporciona JSON en el mismo formato que los ejemplos en json.org/example .
prohibición de geoingeniería
Sí, este ejemplo proporciona una clave por fila.
Mar
26

http://www.php.net/mysql_query dice " mysql_query()devuelve un recurso".

http://www.php.net/json_encode dice que puede codificar cualquier valor "excepto un recurso".

Debe iterar y recopilar los resultados de la base de datos en una matriz, luego json_encodela matriz.

Hugh Bothwell
fuente
2
mysql_query no devuelve un conjunto de resultados. para eso es mysql_fetch *.
Andy
Um ... sí ... eso es lo que pasa en la iteración, entre mysql_query y json_encode. Buena llamada, Watson.
Hugh Bothwell
17

Gracias, esto me ayudó mucho. Mi código:

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

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

echo json_encode($rows);
Tokens
fuente
este nos dará una matriz que contiene; 1) un corchete vacío 2) seguido del corchete que contiene nuestras filas de resultados devueltos ¿cuál es esta diferencia del otro?
Gumuruh
11

Gracias ... mi respuesta es:

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
fuente
9

Lo anterior no funcionará, en mi experiencia, antes de que nombre el elemento raíz en la matriz como algo, no he podido acceder a nada en el json final antes de eso.

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

¡Eso debería hacer el truco!

Par

Par
fuente
8

¡El siguiente código funciona bien aquí!

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

Mi solución simple para detenerlo colocando marcas de voz alrededor de valores numéricos ...

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
fuente
5

Lo sentimos, esto es extremadamente largo después de la pregunta, pero:

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

Solo básicamente:

"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
engranaje4
fuente
Cuidado que GROUP_CONCAT()está limitado por group_concat_max_len.
eggyal
4

podríamos simplificar la respuesta de Paolo Bergantino como esta

$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));
jrran90
fuente
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 ($ filas, $ row_array); ayuda a construir una matriz, de lo contrario da el último valor en el ciclo while

este trabajo como método anexar de StringBuilder en java

DishantPatel
fuente
3

Una opción más usando el bucle FOR:

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

La única desventaja es que el ciclo es más lento que, por ejemplo, mientras que o especialmente

NGix
fuente
3

Por ejemplo $ result = mysql_query ("SELECT * FROM userprofiles donde NAME = 'TESTUSER'");

1.) si $ result es solo una fila.

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

2.) si $ result es más de una fila. Debe iterar las filas y guardarlo en una matriz y devolver un json con la matriz en él.

$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
fuente
3

Tengo el mismo requisito Solo quiero imprimir un objeto de resultado en formato JSON, así que uso el código a continuación. Espero que encuentres algo en él.

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

Verifique el siguiente código para usar mysql_fetch y json_encode. Tendrá que recorrer las filas, pero si usa mysqli, la situación cambiará.

$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);
usuario3172285
fuente
3

Resolví así

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

Esto se devolverá a ajax como conjunto de resultados y mediante el uso de json parse en la parte de JavaScript de esta manera:

obj = JSON.parse(dataX);
Bineesh
fuente
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
fuente
2

Código:

$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
fuente
0
$rows = json_decode($mysql_result,true);

Tan sencillo como eso :-)

AMG Sistemas y Desarrollo
fuente
-3

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

//And get first row :) 

Andrey Mashukov
fuente