JSON codifica resultados do MySQL


304

Como uso a json_encode()função com os resultados da consulta MySQL? Preciso percorrer as linhas ou posso apenas aplicá-lo a todo o objeto de resultados?


1
Eu sei que esta é uma pergunta muito antiga. Mas ninguém mostra a alternativa mais simples para corrigir o problema de números inteiros aparecerem como strings. @mouckatron oferece o sinalizador JSON_NUMERIC_CHECK json_encode()na resposta abaixo. Simples e funciona como um encanto! stackoverflow.com/questions/1390983/…
AlexGM

1
Há uma pergunta e resposta correspondentes sobre o problema do tipo de string em: stackoverflow.com/questions/28261613/…
Marcel Ennix

Respostas:


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

A função json_encodeprecisa do PHP> = 5.2 e do pacote php-json - como mencionado aqui

NOTA : mysqlestá obsoleto no PHP 5.5.0, use a mysqliextensão http://php.net/manual/en/migration55.deprecated.php .


69
Eu recomendaria que você mencionasse que, durante a consulta de seleção a ser usada ASpara renomear as colunas para algo público, como SELECT blog_title as title, por exemplo , isso é mais limpo e o público não sabe quais são as colunas exatas do banco de dados.
31411 Robert Pitt

14
Esse código codifica erroneamente todos os valores numéricos como seqüências de caracteres. Por exemplo, um campo numérico do mySQL chamado score teria um valor JSON de "12" em vez de 12 (observe as aspas).
Theo

24
@RobertPitt, segurança baseada em ocultar nomes de suas colunas é segurança por obscuridade !
TMS

4
@Tomas true, mas saber os nomes exatos das colunas facilita consideravelmente os ataques de injeção de SQL
Tim Seguine

16
@ Tim: Se você está chegando ao ponto em que os nomes das suas colunas são conhecidos, é a única barreira à injeção de SQL que você já perdeu, não?
Paolo Bergantino

44

Tente isso, isso criará seu objeto corretamente

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

 print json_encode($rows);

1
+1 Essa parece ser a única resposta que fornece JSON no mesmo formato que os exemplos em json.org/example .
ban-geoengineering

Sim, este exemplo fornece uma chave por linha.
Mar

26

http://www.php.net/mysql_query diz " mysql_query()retorna um recurso".

http://www.php.net/json_encode diz que pode codificar qualquer valor "exceto um recurso".

Você precisa percorrer e coletar os resultados do banco de dados em uma matriz e depois json_encodena matriz.


2
mysql_query não retorna um conjunto de resultados. é para isso que serve o mysql_fetch *.
219 Andy

Hum ... sim ... é isso que ocorre na iteração, entre mysql_query e json_encode. Boa ligação, Watson.
Hugh Bothwell

17

Graças a isso me ajudou muito. Meu 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á uma matriz contendo; 1) um colchete quadrado vazio 2) seguido pelo colchete contendo nossas linhas de resultados retornadas, o que é diferente do outro?
precisa saber é

11

Obrigado .. minha resposta:

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

A descrição acima não funcionará, na minha experiência, antes que você nomeie o elemento-raiz no array como algo, eu não consegui acessar nada no json final antes disso.

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

Isso deve fazer o truque!

Par


8

O código abaixo funciona bem aqui!

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

Minha correção simples para impedi-lo de colocar marcas de fala em torno 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

Desculpe, isso é extremamente longo após a pergunta, mas:

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

Apenas basicamente:

"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 com o que GROUP_CONCAT()é limitado por group_concat_max_len.
eggyal

4

poderíamos simplificar a resposta de Paolo Bergantino assim

$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 ($ linhas, $ row_array); ajudar a construir matriz, caso contrário, dê o último valor no loop while

este trabalho como método de acréscimo de StringBuilder em java


3

Mais uma opção usando o loop FOR:

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

A única desvantagem é que o loop for é mais lento do que, por exemplo, while ou especialmente foreach


3

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

1.) se $ result for apenas uma linha.

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

2.) se $ result for mais de uma linha. Você precisa iterar as linhas, salvá-lo em uma matriz e retornar um json com a matriz.

$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

Eu tenho o mesmo requisito. Eu só quero imprimir um objeto de resultado no formato JSON, para usar o código abaixo. Espero que você encontre algo nele.

// 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 o código abaixo para usar mysql_fetch e json_encode. Você precisará percorrer as linhas, mas se você usar o mysqli, a situação mudará

$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

Eu resolvi assim

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

Isso será retornado ao ajax como conjunto de resultados e usando json parse na parte javascript como esta:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.