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?


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 .


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

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.


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

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";
        }

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


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

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;
}   

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

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

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


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


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

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";
}

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

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

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

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


-3

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

//And get first row :) 

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.