1

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

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

我的问题是我能否按如下方式对查询进行分页:

SELECT * FROM hdticket WHERE id = 22;
4

2 回答 2

2

您需要在LIMITMySQL 查询中添加一个子句。这很简单:

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参数时,您可以只定制您的 URL 来分页您的记录。所以http://intranet/index.php?page=2的 URL会给出:

<?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 注入。

于 2012-12-31T15:22:34.210 回答
-2

你可以使用 top / limit 这样做..

如果你只想要前 10 名,那么:

  select top 10,* from table;

或者如果你想去页面那么:

  select * from table limit 10 , 20;
于 2012-12-31T15:20:47.723 回答