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?


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 .


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

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.


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

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

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


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

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

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

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

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


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


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

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

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

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

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

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


-3

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

//And get first row :) 

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.