我知道如何使用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 参数获取部分集以获取数据切片。
答案 0 :(得分:2)
您需要在查询中使用LIMIT
和OFFSET
。在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));