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?

Trick Jarrett
fonte
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 .

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

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

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

DishantPatel
fonte
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

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

tão simples como isso :-)

AMG Sistemas e Desenvolvimento
fonte
-3

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

//And get first row :) 

Andrey Mashukov
fonte