JSON menyandikan hasil MySQL

304

Bagaimana cara menggunakan json_encode()fungsi dengan hasil query MySQL? Apakah saya perlu beralih melalui baris atau dapatkah saya menerapkannya pada seluruh objek hasil?

Trick Jarrett
sumber
1
Saya tahu bahwa ini adalah pertanyaan yang sangat lama. Tapi tidak ada yang menunjukkan alternatif paling sederhana untuk memperbaiki masalah bilangan bulat muncul sebagai string. @mouckatron menawarkan bendera JSON_NUMERIC_CHECK json_encode()dalam jawaban di bawah. Sederhana dan berfungsi seperti pesona! stackoverflow.com/questions/1390983/…
AlexGM
1
Ada pertanyaan + jawaban yang cocok tentang masalah tipe-string di: stackoverflow.com/questions/28261613/…
Marcel Ennix

Jawaban:

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

Fungsi ini json_encodemembutuhkan PHP> = 5.2 dan paket php-json - seperti yang disebutkan di sini

CATATAN : mysqlsudah ditinggalkan pada PHP 5.5.0, gunakan mysqliekstensi sebagai gantinya http://php.net/manual/en/migration55.deprecated.php .

Paolo Bergantino
sumber
69
Saya akan menyarankan Anda untuk menyebutkan bahwa selama kueri pemilihan yang digunakan ASuntuk mengubah nama kolom menjadi sesuatu untuk publik seperti SELECT blog_title as title, ini lebih bersih dan publik tidak tahu apa kolom sebenarnya dari database.
RobertPitt
14
Kode ini secara keliru mengkode semua nilai numerik sebagai string. Misalnya, bidang numerik mySQL yang disebut skor akan memiliki nilai JSON "12" dan bukan 12 (perhatikan tanda kutip).
Theo
24
@RobertPitt, keamanan berdasarkan menyembunyikan nama kolom Anda adalah keamanan oleh ketidakjelasan !
TMS
4
@ Thomas benar, tetapi mengetahui nama kolom yang tepat membuat serangan injeksi SQL jauh lebih mudah
Tim Seguine
16
@ Tim: Jika Anda sampai pada titik di mana nama kolom Anda dikenal adalah satu-satunya penghalang untuk injeksi SQL yang sudah Anda hilangkan, bukan?
Paolo Bergantino
44

Coba ini, ini akan membuat objek Anda dengan benar

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

 print json_encode($rows);
ddavtian
sumber
1
+1 Ini sepertinya satu-satunya jawaban yang menyediakan JSON dalam format yang sama dengan contoh di json.org/example .
larangan geoengineering
Ya, contoh ini memberikan kunci per baris.
Mar
26

http://www.php.net/mysql_query mengatakan " mysql_query()mengembalikan sumber daya".

http://www.php.net/json_encode mengatakan dapat mengkodekan nilai apa pun "kecuali sumber daya".

Anda perlu mengulangi dan mengumpulkan hasil database dalam sebuah array, kemudian json_encodearray.

Hugh Bothwell
sumber
2
mysql_query tidak mengembalikan kumpulan hasil. itulah gunanya mysql_fetch *.
Andy
Um ... yeah ... itulah yang terjadi di iterasi, antara mysql_query dan json_encode. Panggilan bagus, Watson.
Hugh Bothwell
17

Terima kasih, ini banyak membantu saya. Kode saya:

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

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

echo json_encode($rows);
Tokes
sumber
yang ini, akan memberi kita array yang berisi; 1) braket kotak kosong 2) diikuti oleh braket keriting yang berisi baris hasil kami apa perbedaan ini dari yang lain?
gumuruh
11

Terima kasih .. jawabanku:

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

Di atas tidak akan bekerja, dalam pengalaman saya, sebelum Anda nama elemen root dalam array untuk sesuatu, saya belum dapat mengakses apa pun di json terakhir sebelum itu.

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

Itu harus melakukan trik!

Par

Par
sumber
8

Kode di bawah ini berfungsi dengan baik di sini!

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

Perbaikan sederhana saya untuk menghentikannya menempatkan tanda pidato di sekitar nilai numerik ...

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

Maaf, ini sangat lama setelah pertanyaan, tetapi:

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

Pada dasarnya hanya:

"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
sumber
Waspadalah yang GROUP_CONCAT()dibatasi oleh group_concat_max_len.
eggyal
4

kita bisa menyederhanakan jawaban Paolo Bergantino seperti ini

$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));
jrran90
sumber
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 ($ rows, $ row_array); membantu membangun array jika tidak memberikan nilai terakhir di loop sementara

ini berfungsi seperti menambahkan metode StringBuilder di java

DishantPatel
sumber
3

Satu lagi opsi menggunakan loop UNTUK:

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

Satu-satunya kelemahan adalah bahwa loop for lebih lambat dari eg misalnya atau terutama foreach

NGix
sumber
3

Misalnya $ result = mysql_query ("SELECT * FROM userprofiles mana NAME = 'TESTUSER'");

1.) jika $ hasil hanya satu baris.

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

2.) jika $ result lebih dari satu baris. Anda perlu mengulangi baris dan menyimpannya ke array dan mengembalikan json dengan array di dalamnya.

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

Saya memiliki persyaratan yang sama. Saya hanya ingin mencetak objek hasil ke dalam format JSON jadi saya menggunakan kode di bawah ini. Saya harap Anda menemukan sesuatu di dalamnya.

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

Periksa kode di bawah ini untuk menggunakan mysql_fetch dan json_encode. Anda perlu mengulangi baris-baris tersebut tetapi jika Anda menggunakan mysqli situasinya akan berubah

$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);
pengguna3172285
sumber
3

Saya memecahkan seperti ini

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

Ini akan dikembalikan ke ajax sebagai set hasil dan dengan menggunakan json parse di bagian javascript seperti ini:

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

Kode:

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

sesimpel itu :-)

AMG Sistemas y Desarrollo
sumber
-3

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

//And get first row :) 

Andrey Mashukov
sumber