即使是互联网上的“简单”分页教程,我也很难理解。
我正在为我的公司创建一个 Intranet 站点,完成它的唯一步骤是对所有查询进行分页,因为它们都包含数千个结果,尤其是搜索结果。
我的问题是我能否按如下方式对查询进行分页:
SELECT * FROM hdticket WHERE id = 22;
即使是互联网上的“简单”分页教程,我也很难理解。
我正在为我的公司创建一个 Intranet 站点,完成它的唯一步骤是对所有查询进行分页,因为它们都包含数千个结果,尤其是搜索结果。
我的问题是我能否按如下方式对查询进行分页:
SELECT * FROM hdticket WHERE id = 22;
您需要在LIMIT
MySQL 查询中添加一个子句。这很简单:
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 注入。
你可以使用 top / limit 这样做..
如果你只想要前 10 名,那么:
select top 10,* from table;
或者如果你想去页面那么:
select * from table limit 10 , 20;