1

我有一个 MySQL 表,里面有很多我想让用户访问的记录。我不想将整个表转储到页面,所以我需要一次将它分成 25 条记录,所以我需要一个页面索引。您可能已经在其他页面上看到过这些,它们在页面底部看起来像这样:

< 1 2 3 4 5 6 7 8 9 >

例如,当用户单击“4”链接时,页面会刷新并且偏移量会继续移动(第 4 页 x 25 条记录)。这是我已经拥有的:

function CreatePageIndex($ItemsPerPage, $TotalNumberOfItems, $CurrentOffset, $URL, $URLArguments = array())
{
    foreach($URLArguments as $Key => $Value)
    {
        if($FirstIndexDone == false)
        {
            $URL .= sprintf("?%s=%s", $Key, $Value);
            $FirstIndexDone = true;
        }
        else
        {
            $URL .= sprintf("&%s=%s", $Key, $Value);
        }
    }

    Print("<div id=\"ResultsNavigation\">");
        Print("Page: ");
        Print("<span class=\"Links\">");
            $NumberOfPages = ceil($TotalNumberOfItems / $ItemsPerPage);
            for($x = 0; $x < $NumberOfPages; $x++)
            {
                if($x == $CurrentOffset / $ItemsPerPage)
                {
                    Print("<span class=\"Selected\">".($x + 1)." </span>");
                }
                else
                {
                    if(empty($URLArguments))
                    {
                        Print("<a href=\"".$URL."?Offset=".$x * $ItemsPerPage."\">".($x + 1)."</a> ");
                    }
                    else
                    {
                        Print("<a href=\"".$URL."&Offset=".$x * $ItemsPerPage."\">".($x + 1)."</a> ");
                    }
                }
            }
            Print("</span>");
            Print(" (".$TotalNumberOfItems." results)");
    Print("</div>");
}

显然,这段代码不会创建动态索引,它只是将整个索引转储到每个可用页面的页面底部。我需要的是一个动态的解决方案,它只显示前 5 页和后 5 页(如果存在)以及 >> 或向前移动 5 页左右的内​​容。

任何人都看到了一种优雅且可重复使用的实现方式,因为我觉得我正在重新发明轮子?任何帮助表示赞赏。

4

4 回答 4

2

Zend Framework正在成为一个有用的集合,并包含一个Zend_Paginator类,这可能值得一看。有点学习曲线,如果您想花时间使用框架中的其他类,这可能是值得的。

不过,自己动手并不难。使用 COUNT(*) 查询获取总记录数,然后使用 LIMIT 子句获取一页结果。

例如,如果您希望每页 20 个项目,则第 1 页的 LIMIT 0,20 而第 2 页的 LIMIT 20,20,例如

$count=getTotalItemCount();
$pagesize=20;

$totalpages=ceil($count/$pagesize);

$currentpage=isset($_GET['pg'])?intval($_GET['pg']):1;
$currentpage=min(max($currentpage, 1),$totalpages);

$offset=($currentpage-1)*$pagesize;

$limit="LIMIT $offset,$pagesize";
于 2009-02-05T12:16:35.440 回答
1

它被称为分页:

几个例子:

  1. 一个不错的没有 SQL 的
  2. 很长的教程
  3. 另一个教程
  4. 还有一个
  5. 当然..谷歌
于 2009-02-05T12:26:44.500 回答
0

这个 jQuery 插件怎么样?所以所有的工作都是在客户端完成的。

http://plugins.jquery.com/project/pagination

演示:http ://d-scribe.de/webtools/jquery-pagination/demo/demo_options.htm

于 2009-02-05T12:05:53.043 回答
0

这是我挖出的一个旧类,我曾经在 PHP 中使用过。现在我用 Javascript 处理大部分内容。该对象接受一个数组(用于将堆栈拆分为页面)并返回当前视图。这在巨大的桌子上可能会变得乏味,所以请记住这一点。我通常用它来翻阅少于 1000 个项目的小型数据集。它还可以选择为您生成跳转菜单。

class pagination {

function pageTotal($resultCount, $splitCount) {
    if (is_numeric($resultCount) && is_numeric($splitCount)) {
        if ($resultCount > $splitCount) {
            $pageAverage = (integer)$resultCount / $splitCount;
            $pageTotal = ceil($pageAverage);
            return $pageTotal;
        } else {
            return 1;
        }
    } else {
        return false;
    }
}

function pageTotalFromStack($resultArray, $splitCount) {
    if (is_numeric($splitCount) && is_array($resultStack)) {
        if (count($resultStack) > $splitCount) {
            $resultCount = count($resultStack);
            $pageAverage = (integer)$resultCount / $splitCount;
            $pageTotal = ceil($pageAverage);
            return $pageTotal;
        } else {
            return 1;
        }
    } else {
        return false;
    }
}

function makePaginationURL($preURL, $pageTotal, $selected=0, $linkAttr=0, $selectedAttr=0) {
    if (!empty($preURL) && $pageTotal >= 1) {
        $pageSeed = 1;
        $passFlag = 0;
        $regLink = '<a href="{url}&p={page}"';
            if (is_array($linkAttr)) $regLink .=  $this->setAttributes($linkAttr); //set attributes
        $regLink .= '>{page}</a>';

        $selLink = '<a href="{url}&p={page}"';
            if (is_array($selectedAttr)) $selLink .=  $this->setAttributes($selectedAttr); //set attributes
        $selLink .= '>{page}</a>';

        while($pageSeed <= $pageTotal) {
            if ($pageSeed == $selected) {
                $newPageLink = str_replace('{url}', $preURL, $selLink);
                $newPageLink = str_replace('{page}', $pageSeed, $newPageLink);
            } else {
                $newPageLink = str_replace('{url}', $preURL, $regLink);
                $newPageLink = str_replace('{page}', $pageSeed, $newPageLink);
            }
            if ($passFlag == 0) {
                $passFlag = 1;
                $linkStack = $newPageLink;
            } else {
                $linkStack .= ', ' . $newPageLink;
            }
            $pageSeed++;
        }
        return $linkStack;
    } else {
        return false;
    }
}

function splitPageArrayStack($stackArray, $chunkSize) {
    if (is_array($stackArray) && is_numeric($chunkSize)) {
        return $multiArray = array_chunk($stackArray, $chunkSize);
    } else {
        return false;
    }
}

}

于 2009-02-05T13:47:05.413 回答