【问题标题】:Pagination on custom database-driven blogs?自定义数据库驱动博客上的分页?
【发布时间】:2011-11-11 12:49:03
【问题描述】:

我最近一直在修补 PHP,想编写自己的博客代码。我知道如何从数据库中进行选择,我将在其中指定一个用于条目的表。

我只想知道如何根据page GET 变量只选择表格的某些部分。

很抱歉没有任何代码,但这是一个相当宽泛的问题,我觉得当前的代码并不是真正需要回答这个问题。

编辑:我正在使用 MySQL。

【问题讨论】:

  • @Purmou 告诉我们您使用的是哪个数据库:MySQL、postgreSQL、SQLite,... - 存在细微的语法差异。我假设 MySQL 很流行。
  • @stivlo:是的,我正在使用 MySQL。

标签: php mysql sql pagination blogs


【解决方案1】:

对于 MySQL,您可以使用 LIMIT 子句。假设您的页码以 1 开头:

$pageSize = 10;
$page = abs(intval($_GET["page"]));
if ($page < 1) {
    $page = 1;
}
$startResult = ($page - 1) * $pageSize;
$sql = "SELECT * FROM `tableName` LIMIT $startResult, $pageSize";

从外部(敌对)环境获取参数时要做的一件非常重要的事情是清理您的输入。如果您不是恶意用户或网络机器人,可以在您的 GET 页面变量中插入任何字符串并更改您的查询。这称为 SQL 注入。 google一下,你会发现很多解释。

既然我们知道我们的页面变量必须是一个正整数,我首先用intval(获取变量的整数值)然后用abs(绝对值)处理它,因为我们想要只有正值。另一种方法是使用准备好的语句(查找 PDO)。

【讨论】:

  • 谢谢!但是你介意解释一下abs()intval() 吗?我是 PHP 新手,所以我想了解我在学习什么。
  • @Purmou: abs 返回其输入的绝对值。 intval 将其参数转换为整数。
  • 如果$_GET['page']0 怎么办?您最终会从 -10 开始获得结果。
  • @stivlo:谢谢你的代码,我明天试试。所以你建议我把我所有的 GET 包裹在 intval() 中(只要我要检索数字)?
  • 绝对是,mysql_real_escape() 需要在查询中使用的字符串。
【解决方案2】:
    I will be like below. You have to do changes according to your code style

<?php
        /*
            Place code to connect to your DB here.
        */
        include('config.php');  // include your code to connect to DB.

        $tbl_name="";       //your table name
        // How many adjacent pages should be shown on each side?
        $adjacents = 3;

        /* 
           First get total number of rows in data table. 
           If you have a WHERE clause in your query, make sure you mirror it here.
        */
        $query = "SELECT COUNT(*) as num FROM $tbl_name";
        $total_pages = mysql_fetch_array(mysql_query($query));
        $total_pages = $total_pages[num];

        /* Setup vars for query. */
        $targetpage = "filename.php";   //your file name  (the name of this file)
        $limit = 2;                                 //how many items to show per page
        $page = $_GET['page'];
        if($page) 
            $start = ($page - 1) * $limit;          //first item to display on this page
        else
            $start = 0;                             //if no page var is given, set start to 0

        /* Get data. */
        $sql = "SELECT column_name FROM $tbl_name LIMIT $start, $limit";
        $result = mysql_query($sql);

        /* Setup page vars for display. */
        if ($page == 0) $page = 1;                  //if no page var is given, default to 1.
        $prev = $page - 1;                          //previous page is page - 1
        $next = $page + 1;                          //next page is page + 1
        $lastpage = ceil($total_pages/$limit);      //lastpage is = total pages / items per page, rounded up.
        $lpm1 = $lastpage - 1;                      //last page minus 1

        /* 
            Now we apply our rules and draw the pagination object. 
            We're actually saving the code to a variable in case we want to draw it more than once.
        */
        $pagination = "";
        if($lastpage > 1)
        {   
            $pagination .= "<div class=\"pagination\">";
            //previous button
            if ($page > 1) 
                $pagination.= "<a href=\"$targetpage?page=$prev\">« previous</a>";
            else
                $pagination.= "<span class=\"disabled\">« previous</span>"; 

            //pages 
            if ($lastpage < 7 + ($adjacents * 2))   //not enough pages to bother breaking it up
            {   
                for ($counter = 1; $counter <= $lastpage; $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<span class=\"current\">$counter</span>";
                    else
                        $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";                 
                }
            }
            elseif($lastpage > 5 + ($adjacents * 2))    //enough pages to hide some
            {
                //close to beginning; only hide later pages
                if($page < 1 + ($adjacents * 2))        
                {
                    for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
                    {
                        if ($counter == $page)
                            $pagination.= "<span class=\"current\">$counter</span>";
                        else
                            $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";                 
                    }
                    $pagination.= "...";
                    $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>";
                    $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";       
                }
                //in middle; hide some front and some back
                elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
                {
                    $pagination.= "<a href=\"$targetpage?page=1\">1</a>";
                    $pagination.= "<a href=\"$targetpage?page=2\">2</a>";
                    $pagination.= "...";
                    for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
                    {
                        if ($counter == $page)
                            $pagination.= "<span class=\"current\">$counter</span>";
                        else
                            $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";                 
                    }
                    $pagination.= "...";
                    $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>";
                    $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";       
                }
                //close to end; only hide early pages
                else
                {
                    $pagination.= "<a href=\"$targetpage?page=1\">1</a>";
                    $pagination.= "<a href=\"$targetpage?page=2\">2</a>";
                    $pagination.= "...";
                    for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
                    {
                        if ($counter == $page)
                            $pagination.= "<span class=\"current\">$counter</span>";
                        else
                            $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";                 
                    }
                }
            }

            //next button
            if ($page < $counter - 1) 
                $pagination.= "<a href=\"$targetpage?page=$next\">next »</a>";
            else
                $pagination.= "<span class=\"disabled\">next »</span>";
            $pagination.= "</div>\n";       
        }
    ?>

        <?php
            while($row = mysql_fetch_array($result))
            {

            // Your while loop here

            }
        ?>

    <?=$pagination?>


Please make changes according to your code style

【讨论】:

  • 有没有办法缩短这个?
  • 查看我发布的另一个答案
【解决方案3】:

请根据需要进行更改。您可以轻松设置页面导航的样式。

<?php 
if(!empty($_GET["start"])){
    $start = $_GET['start'];// To take care global variable if OFF
}else{
    $start  = 0;
}
if(!($start > 0)) { // This variable is set to zero for the first page
    $start = 0;
}

$eu = ($start - 0);
$limit           = 5; // No of records to be shown per page.
$whathis      = $eu + $limit;
$back          = $eu - $limit;
$next          = $eu + $limit;

// to check the total number of records
$query         = mysql_query(" SELECT * FROM <tablename> ") or die (mysql_error());
$total_rows     = mysql_num_rows($query);

//select the record with limitation
$query         = mysql_query(" SELECT * FROM <tablename> limit $eu, $limit ") or die (mysql_error());

//code for previous
if($back >=0) {
echo "<a href='yourpage.php?start=$back'><font face='Verdana' size='2'>PREV</font></a>&nbsp;&nbsp;";
}

//code for the number of page with links
$i     = 0;
$x    = 1;
for($i=0;$i < $total_rows;$i=$i+$limit){
if($i != $eu){
    echo "<a href='yourpage.php?start=$i'><font face='Verdana' size='2'>$x</font></a> ";
}else { 
    echo "<font face='Verdana' size='4' color=red>$x</font>";
} // Current page is not displayed as link and given font color red

$x    = $x+1;
}
//code for next
if($whathis < $total_rows) {
echo "<a href='yourpage.php?start=$next'><font face='Verdana' size='2'>NEXT</font></a>";
}    
?>

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多