如何对特定查询进行分页?

时间:2012-12-31 15:17:03

标签: mysql pagination

即使是简单的"我也很难理解。互联网上的分页教程。

我正在为我的公司创建一个Intranet站点,并且完成它的唯一步骤是对所有查询进行分页,因为它们都包含数千个结果,尤其是搜索结果。

我的问题是,我能够以下面的方式对查询进行分页:

SELECT * FROM hdticket WHERE id = 22;

2 个答案:

答案 0 :(得分:2)

您需要在MySQL查询中添加LIMIT子句。这很简单:

SELECT * FROM hdticket WHERE id = :ticknum LIMIT 0, 10

这将从头开始获取十条记录(想象你的记录是零索引的)。第一个数字是何时开始从中获取,第二个数字是此后要获取的数量。所以从0开始,它将获取接下来的10条记录。这将是第1页。

要获取后续记录页面,您只需要增加第一个数字。因此,要获得第二页,您需要从10开始计数,然后获取接下来的10条记录。此查询将如下所示:

SELECT * FROM hdticket WHERE id = :ticknum LIMIT 10, 10

然后是第3页:

SELECT * FROM hdticket WHERE id = :ticknum LIMIT 20, 10

等等。希望你能看到出现的模式。

当您使用$_GET参数时,您可以只定制您的网址以记录您的记录。因此, http://intranet/index.php?page = 2 的网址会显示:

<?php

$page = intval($_GET['page']);
$limit = 10;
$offset = (($page - 1) * $limit);

$sql = "SELECT * FROM hdticket WHERE id = :ticknum LIMIT $offset, $limit";

希望这有帮助。

另外,还有几个旁白。不要使用mysql_函数,因为它们已被弃用。您可以在官方手册页中看到:http://php.net/manual/en/function.mysql-query.php

此外,您的代码容易受到SQL注入攻击,因为您正在使用URL中的内容并直接在SQL查询中使用它。这很好,如果你在那里添加数字用于分页,但是如果某人恶意将SQL放入URL中,他们可以做各种各样的事情,比如截断你的表或你的整个数据库,它会发生,因为你“只是通过而不检查它。”

要解决这个问题,如果您使用mysql_函数的替代方法(例如PDO),则可以在SQL语句中准备变量。您的代码看起来像这样:

<?php

$sql = "SELECT * FROM hdticket WHERE id = :ticknum LIMIT :offset, :limit";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':ticknum', $ticknum, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();

这可以确保传递给SQL字符串的数据符合您的预期,并自动转义以防止SQL注入。

答案 1 :(得分:-2)

你可以使用top / limit来做到这一点..

如果你只想要前10名:

  select top 10,* from table;

或 如果你想去页面那么:

  select * from table limit 10 , 20;