对结果的分页(mysql + php)依赖于下拉菜单过滤器

时间:2017-06-27 13:48:40

标签: php mysql drop-down-menu filter pagination

我有这个当前的查询,我拼命想要将结果分页(总列表 - 如果使用下拉菜单没有应用过滤器大约6000行),但不知道如何。我已经尝试了几个教程,但是我不断显示我的完整列表,所以ceil()函数永远不会发挥作用。 我认为这是因为我的查询不是为了允许在下拉菜单中对查询中的总行进行简单计数而构建的。

任何人都可以帮我构建围绕此查询的分页吗?

getCategoryId

1 个答案:

答案 0 :(得分:1)

对于分页,在大多数情况下,您需要2个查询,第一个计算总行数,第二个实际返回行集,使用LIMIT,最后一个偏移量和每页行数。

基本上两个查询是相同的,第一个只是一个COUNT()。运行它,得到总数(我在我的例子中将它设置在$ num_rows变量中),然后设置一个变量以获得每页的行数(让我们说$ rows_per_page = 10;),然后再第二个查询,执行以下操作:

if (empty($_GET['page'])) {
        $page   = 1;
        $offset = $rows_per_page;
    } else {
        $num_pages = floor($num_rows / $rows_per_page);

        if ($_GET['page'] > $num_pages) {
            $page   = $num_pages;
        } else {
            $page   = $_GET['page'];
        }

        $offset = $rows_per_page * $page;
    }

您现在有第二个查询的限制:

LIMIT '.$offset.', '.$rows_per_page

更新:我使用您的代码快速写了一些内容,它应该可以进行微小的更改(未经过测试)

$rows_per_page = 10;

$sql_count = "
    SELECT 
        COUNT(*)
    FROM 
        Players, country, bracket, ratingscutoff 
    WHERE membership_expiration_date >= cutoff 
    AND Players.country = country.code 
";
$result_count = mysqli_query($link, $sql_count) or die("Unable to select: ".mysqli_error());
$num_rows = mysqli_num_rows($result_count);

if (empty($_GET['page'])) {
    $page   = 1;
    $offset = $rows_per_page;
} else {
    $num_pages = floor($num_rows / $rows_per_page);

    if ($_GET['page'] > $num_pages) {
        $page   = $num_pages;
    } else {
        $page   = $_GET['page'];
    }

    $offset = $rows_per_page * $page;
}

// Your other filters are being omitted for more clarity
$sql_select = "
    SELECT 
        official_status, official_expiration_date, membership_status,membership_expiration_date, player_number, first_name, last_name, classification, gender, birth_year, rating, rating_effective_date, country, code, country.description, bracket.id, bracket.min, bracket.max, cutoff
    FROM 
        Players, country, bracket, ratingscutoff 
    WHERE membership_expiration_date >= cutoff 
    AND Players.country = country.code 
    ORDER BY rating DESC, player_number ASC
    LIMIT ".$offset.", ".$rows_per_page."
";

$result = mysqli_query($link, $sql_select) or die("Unable to select: ".mysqli_error());