[英]PHP encode a partial set of MySQL data into 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编码mysql数据20:
{"count": 20, "start": 0, "total": 500, "result": [{ ...}]}
缺少的是如何使用开始和计数参数来获取部分数据集,以获取数据切片。
您需要在查询中使用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
}
怎么样:
$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进行编码。
使用下面的代码。
$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);
?>
我可以想到两种解决此问题的方法。
第一种是仅使用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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.