PHP将部分MySQL数据编码为JSON

时间:2016-03-18 10:43:24

标签: php mysql json

我知道如何使用PHP将SQL查询中的所有数据编码为JSON,但不知道如何编码部分集。

在Android(客户端)中,我发送一个HTTP请求,如下所示:

public interface DataAPI {

       @GET("/top500")
        public void getResult(@Query("start") int start, @Query("count") int count,
                              Callback<Top500> response);
    }

正如您所看到的,我正在使用Android代码中的start和count。 我的表中有大约500条记录,我已经使用下面的PHP脚本成功地将所有数据编码为JSON:

<?php

$con = mysqli_connect(HOST,USER,PASS,DB);

$sql = "select * from Persons";

$res = mysqli_query($con,$sql);

$result = array();

while($row = mysqli_fetch_array($res)){
array_push($result,
array(
'id'=>$row[0],
'name'=>$row[1]    
));
}

echo json_encode(array("result"=>$result));

mysqli_close($con);

?>

JSON结果:

{"result": [{ ... }]}

但我需要像这样编码20 x 20的mysql数据:

{"count": 20, "start": 0, "total": 500, "result": [{ ...}]}

缺少的是如何使用 start count 参数获取部分集以获取数据切片。

4 个答案:

答案 0 :(得分:2)

您需要在查询中使用LIMITOFFSET。在PHP中应用一些讨厌的逻辑是一个糟糕的解决方案。这是MySQL应该执行的操作,因为如果您不需要所有行,则不想获取所有行。

如果你运行这样的查询:

SELECT * 
FROM Persons
ORDER BY Id
LIMIT 10 OFFSET 20

您将从20行和10行开始获得匹配行的子集。然后,您可以遍历完整的结果集。

最好通过字段明确排序以确保不同页面之间的一致性。

你是最终代码(使用PDO而不是mysqli):

$pdo = new PDO('mysql:dbname=db;host=127.0.0.1', $user, $password);

$count = $_GET['count'];
$start = $_GET['start'];
$stmt = $pdo->prepare('SELECT * FROM Persons ORDER BY Id LIMIT ? OFFSET ?');
$stmt->execute(array($count, $start));
$rows = $stmt->fetchAll();
foreach ($rows as $row) {
    // your logic that was inside the while
}

答案 1 :(得分:1)

如下:

$start = 7;
$size = 3;
$count = 0;

while($row = mysqli_fetch_array($res)){
   if($count>=$start && $count <$start+$size) {
        array_push($result,array('id'=>$row[0],'name'=>$row[1]));
   }
   $count++;
}

代码应该是自我解释的,但如果您有任何问题,请随时发表评论。

注意:这更像是一个PHP伪代码,因为我没有环境,并且在一段时间内没有用PHP编码。

答案 2 :(得分:1)

使用以下代码。     

$con = mysqli_connect(HOST,USER,PASS,DB);

$count = "select count(*) as total from Person"; //query to get row count of your table
$count_res = mysqli_query($con,$count);
$count_row = mysqli_fetch_array($count_res);
$total = $count_row['total']; // get total no of records

$start = YOUR_START_VALUE; // from which offset you want to get record
$end = YOUR_VALUE // how many record want to fetch
$sql = "select * from Persons limit $start, $end";

$res = mysqli_query($con,$sql);

$result = array();

while($row = mysqli_fetch_array($res)){
array_push($result,
array(
'id'=>$row[0],
'name'=>$row[1]    
));
}

echo json_encode(array("count"=> $end, "start"=> $start, "total"=> $total,"result"=>$result));

mysqli_close($con);

?>

答案 3 :(得分:0)

我可以想出解决这个问题的两种方法。

第一种是使用MySQL:

SELECT SQL_CALC_FOUND_ROWS * FROM Persons LIMIT 0,20;

SELECT FOUND_ROWS();

使用第一个查询,您可以检索所需的一批行。使用秒,您将获得结果集中的总行数。

第二个选项是使用array_slice

$total = count($result);
$batch = array_slice($result, 0, 20);

echo json_encode(array("total" => $total, "start" => 0, "count" => count($batch), "result"=>$batch));