PHP 将部分 MySQL 数据编码为 JSON

标签 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": [{ ... }]}

但我需要像这样对 mysql 数据进行 20 x 20 编码:

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

缺少的是如何使用 startcount 参数来获取部分集,以便获取数据切片。

最佳答案

您需要在查询中使用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
}

关于PHP 将部分 MySQL 数据编码为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36082287/

相关文章:

php - mysqli bind_param 不起作用 php

php - Yii 和 Knockout 一起?

python - GAE 数据存储日期不是 JSON 可序列化的

java - 如何通过改造解析 JSON 数组

json - 在 Data::Dumper 中是否有等效于 Perls 的 Dumper() 方法的 Go 语言?

php - 无法覆盖 Symfony ConstraintViolationList 的 JMS 序列化程序的默认处理程序

php - Symfony2 覆盖 User.orm.xml

java - 一次执行多个 native 查询

php - 如何搜索多个字段(SQL、PHP)?

php - 以Apache的access.log为基础的网络分析系统Piwik