JSON mã hóa kết quả MySQL


304

Làm cách nào để sử dụng json_encode()hàm với kết quả truy vấn MySQL? Tôi có cần lặp lại qua các hàng hay tôi chỉ có thể áp dụng nó cho toàn bộ đối tượng kết quả?


1
Tôi biết rằng đây là một câu hỏi rất cũ. Nhưng không ai chỉ ra cách thay thế đơn giản nhất để khắc phục vấn đề về số nguyên hiển thị dưới dạng chuỗi. @mouckatron cung cấp cờ JSON_NUMERIC_CHECK json_encode()trong câu trả lời dưới đây. Đơn giản và nó hoạt động như một nét duyên dáng! stackoverflow.com/questions/1390983/
Mạnh

1
Có một câu hỏi phù hợp + câu trả lời liên quan đến vấn đề kiểu chuỗi tại: stackoverflow.com/questions/28261613/
mẹo

Câu trả lời:


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

Hàm json_encodecần PHP> = 5.2 và gói php-json - như được đề cập ở đây

LƯU Ý : mysqlkhông được chấp nhận kể từ PHP 5.5.0, hãy sử dụng mysqlitiện ích mở rộng thay vì http://php.net/manual/en/migration55.deprecated.php .


69
Tôi muốn khuyên bạn nên đề cập rằng trong quá trình truy vấn chọn sử dụng ASđể đổi tên các cột thành một cái gì đó cho công chúng, chẳng hạn như SELECT blog_title as titlecái này sạch hơn và công chúng không biết các cột chính xác là gì từ cơ sở dữ liệu.
RobertPitt

14
Mã này mã hóa sai tất cả các giá trị số dưới dạng chuỗi. Ví dụ: trường số myQuery được gọi là điểm sẽ có giá trị JSON là "12" thay vì 12 (chú ý các trích dẫn).
Theo

24
@RobertPitt, bảo mật dựa trên việc che giấu tên của các cột của bạn là bảo mật bằng cách che khuất !
TMS

4
@Tomas đúng, nhưng việc biết tên cột chính xác giúp cho các cuộc tấn công SQL SQL dễ dàng hơn đáng kể
Tim Seguine

16
@Tim: Nếu bạn đang đi đến điểm mà tên cột của bạn được biết đến là rào cản duy nhất đối với việc tiêm SQL mà bạn đã mất, phải không?
Paolo Bergantino

44

Hãy thử điều này, điều này sẽ tạo ra đối tượng của bạn đúng cách

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

 print json_encode($rows);

1
+1 Đây dường như là câu trả lời duy nhất cung cấp JSON có cùng định dạng với các ví dụ tại json.org/example .
ban-geengineering

Vâng, ví dụ này đưa ra một khóa trên mỗi hàng.
Mar

26

http://www.php.net/mysql_query nói " mysql_query()trả về một tài nguyên".

http://www.php.net/json_encode nói rằng nó có thể mã hóa bất kỳ giá trị nào "ngoại trừ tài nguyên".

Bạn cần lặp lại và thu thập các kết quả cơ sở dữ liệu trong một mảng, sau đó json_encodelà mảng.


2
mysql_query không trả về tập kết quả. đó là những gì mysql_fetch * dành cho.
Andy

Ừm ... ừ ... đó là những gì diễn ra trong vòng lặp, giữa mysql_query và json_encode. Cuộc gọi tốt, Watson.
Hugh Bothwell

17

Cảm ơn điều này đã giúp tôi rất nhiều. Mã của tôi:

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

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

echo json_encode($rows);

cái này, sẽ cho chúng ta một mảng chứa; 1) dấu ngoặc vuông trống 2) theo sau là dấu ngoặc nhọn chứa các hàng kết quả trả về của chúng ta, cái này có gì khác với cái kia không?
gumuruh

11

Cảm ơn .. câu trả lời của tôi đi:

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

Theo kinh nghiệm của tôi, ở trên sẽ không hoạt động, trước khi bạn đặt tên phần tử gốc trong mảng thành thứ gì đó, tôi không thể truy cập bất cứ thứ gì trong json cuối cùng trước đó.

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

Điều đó sẽ làm các trick!

Pär


8

Mã dưới đây hoạt động tốt ở đây!

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

Cách khắc phục đơn giản của tôi để ngăn chặn việc đặt dấu hiệu lời nói xung quanh các giá trị số ...

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

Xin lỗi, điều này rất dài sau câu hỏi, nhưng:

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

Về cơ bản:

"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

Coi chừng đó GROUP_CONCAT()là giới hạn group_concat_max_len.
eggyal

4

chúng ta có thể đơn giản hóa câu trả lời của Paolo Bergantino như thế này

$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 ($ hàng, $ row_array); giúp xây dựng mảng nếu không nó cho giá trị cuối cùng trong vòng lặp while

công việc này giống như phương thức nối thêm của StringBuilder trong java


3

Thêm một tùy chọn sử dụng vòng lặp FOR:

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

Nhược điểm duy nhất là vòng lặp for chậm hơn, ví dụ như trong khi hoặc đặc biệt là foreach


3

Ví dụ: $ result = mysql_query ("CHỌN * TỪ userprofiles trong đó NAME = 'TESTUSER'");

1.) nếu kết quả $ chỉ là một hàng.

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

2.) nếu kết quả $ là nhiều hơn một hàng. Bạn cần lặp lại các hàng và lưu nó vào một mảng và trả về một json có mảng trong đó.

$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

Tôi có cùng yêu cầu. Tôi chỉ muốn in một đối tượng kết quả sang định dạng JSON nên tôi sử dụng mã bên dưới. Tôi hy vọng bạn tìm thấy một cái gì đó trong đó.

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

Kiểm tra mã dưới đây để sử dụng mysql_fetch và json_encode. Bạn sẽ cần phải lặp qua các hàng nhưng nếu bạn sử dụng mysqli thì tình hình sẽ thay đổi

$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

Tôi đã giải quyết như thế này

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

Điều này sẽ được trả về ajax dưới dạng tập kết quả và bằng cách sử dụng phân tích json trong phần javascript như thế này:

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

Mã số:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.