使用PHP和MySQL实现Bootstrap分页

9

我对Bootstrap还比较新,现在正在尝试在页面的一个部分上实现分页以正确显示数据。请问有人可以帮忙吗?

这是代码的快照,如何实现分页以仅显示10条记录?谢谢。

<section class="success" id="all-confessions">
    <div class="container">
        <div class="row">
            <div class="col-lg-12 text-center">
                <h2>All Confessions</h2>
                <hr class="star-light">
            </div>
        </div>
        <div class="row">
            <div class="row text-left">
                <?php
                $allconfession = mysql_query("SELECT * FROM collection ORDER BY date DESC");

                while($result2 = mysql_fetch_array($allconfession)) {
                    $id = $result2['id'];
                    ?>
                    <div class="col-md-3 col-md-offset-1">
                        <h5>#<?php echo $id; ?></h5>
                    </div>
                    <div class="col-md-10 col-md-offset-1">
                        <p class="para-confess">
                            <?php
                            echo $result2['type'] ." from ". $result2['college'] ." of ". $result2['department'] ." confessed ". $result2['confession']; 
                            ?>
                        </p>
                        <div class="text-left">
                            <?php
                            if(isset($_COOKIE['uname'])) {
                                ?>
                                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
                                    <input type="text" name="cid" style="display: none;" value="<?php echo $id; ?>">
                                    <button type="submit" class="btn btn-success fa fa-thumbs-up" name="like"> Cool</button>
                                    <button type="submit" class="btn btn-warning fa fa-thumbs-down" name="dislike"> WTF</button>
                                </form>
                                <?php
                            }
                            ?>
                        </div>
                        <div class="text-right">
                            <i class="fa fa-thumbs-o-up"> 
                                <?php 
                                $likes = mysql_query("SELECT COUNT(*) FROM activity WHERE cid = $id AND ld = 1");
                                $alikes = mysql_fetch_row($likes);
                                echo $alikes[0]; 
                                ?> 
                            </i> &nbsp;
                            <i class="fa fa-thumbs-o-down"> 
                                <?php 
                                $dislikes = mysql_query("SELECT COUNT(*) FROM activity WHERE cid = $id AND ld = 0");
                                $adislikes = mysql_fetch_row($dislikes);
                                echo $adislikes[0]; 
                                ?> 
                            </i>
                        </div>
                        <hr/>
                    </div>
                    <?php
                }
                ?>
            </div>
        </div>
    </div>
</section>

为什么不尝试使用datatable库呢? - chiragchavda.ks
6个回答

6

首先,请了解 PDO http://php.net/manual/en/book.pdo.php。在我的解决方案中,我假设您正在使用 PDO。

第一件要做的事情是确定数据库中实际有多少行。

$nbOfResults = $pdo->query('select count(*) from collection')->fetchColumn();

然后设置每页实体的限制。

$entitiesPerPage = 10; 

现在让我们确定应该有多少页。首先,我将结果数量除以每页实体数。假设有202个结果。将其除以10(每页实体数)将得到20页(强制转换为int)。但是仍然剩下2个实体。这就是为什么我必须检查模数并在需要时添加一页的原因。
$nbOfPages = intval($nbOfResults / $entitiesPerPage);

if( ($entitiesPerPage % $nbOfResults) !== 0 ) {
    $nbOfPages += 1
}

现在我们准备创建一个分页功能。但首先,我们需要有一个变量来保存当前页面。
$currentPage = $_GET['page']; 

或者以更优雅的方式表达。
$currentPage = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT);

然而,如果没有任何页面,让我们假设我们在第一页。
if(!$currentPage) { $currentPage = 1 }

现在是时候创建一个包含分页信息的数组了。

$pagination = [];

if ($currentPage !== 1) {
    $pagination[] = [
        'page' => 'Previous',
        'link' => '?page=' . ($currentPage - 1),
        'active' => false,
    ];
}

for($i = 1; $i <= $nbOfPages; $i++) {
   $pagination[] = [
      'page' => $i,
      'link' => '?page=' . $i,
      'active' => ( $i === $currentPage ),
   ];
}

if ($currentPage !== $nbOfPages) {
    $pagination[] = [
        'page' => 'Next',
        'link' => '?page=' . ($currentPage + 1),
        'active' => false,
    ];
}

最后,获取当前页面结果的查询。

$query = 'SELECT * FROM collection ORDER BY date DESC LIMIT ? OFFSET ?';
$sth = $dbh->prepare($query);
$sth->execute(array($entitiesPerPage, ( $currentPage - 1 ) * $entitiesPerPage)));

现在,您需要做的就是循环遍历 $pagination 变量并打印适当的 Bootstrap HTML。

5
您离正确答案还有一定距离。
至少需要执行以下操作:
1. 您需要创建一个变量来确定每页显示的项目数。 2. 您需要将该变量乘以页面编号,以获取在查询中偏移的记录数量。 3. 您需要使用上述计算得到的数字偏移查询结果,并将查询限制为要显示的项目数。 4. 您需要计算总项目数并将其除以每页的项目数,以获取要在分页中显示的总页数。
这里是我经常与Bootstrap一起使用的简单分页代码。

http://www.a2zwebhelp.com/php-mysql-pagination

只需省略样式并将Bootstrap类应用于元素即可。但是,您不能仅添加静态HTML并指望它能够正常工作,而没有任何后端逻辑。Bootstrap仅提供了一种样式化分页的方法,但您必须构建它。


1
一个重要的附注需要加到这个答案里:不要使用mysql_原型,因为它们已经过时了。 OP正在直接解析查询中的值,这使得恶意用户可以轻易地注入任何值并删除整个表。 - briosheje
@briosheje是正确的。您应该使用更新的mysqli或PDO方法进行查询。除此之外,该脚本对于理解如何构建分页非常有用。 - CChoma
我建议@cchoma在答案中放一些示例/可工作的代码。 - Roxx

4

我曾面临同样的情况,按照一篇文章进行了调整。以下是您代码所需的内容。

已测试兼容 Bootstrap v3.3.5。


首先:您应该更改 mysql_query() 函数。此扩展已在 PHP 5.5.0 中弃用,并在 PHP 7.0.0 中删除。应使用 MySQLi 或 PDO_MySQL 扩展。在此处阅读更多信息。

话虽如此,让我们转向我们的 PHP 代码。

PHP(处理 MySQL 查询并生成分页 HTML)
注意:您可以通过 $targetpage 变量更改目标页面。

//PAGINATION//
$sql = mysqli_query("select * from collection"); 
$total = mysql_num_rows($sql);

$adjacents = 3;
$targetpage = "$_SERVER['PHP_SELF']"; //your file name
$limit = 10; //how many items to show per page
if(isset($_GET['page']))
{
    $page = $_GET['page'];
}else{
    $page = 0;
}

if($page){ 
    $start = ($page - 1) * $limit; //first item to display on this page
}else{
    $start = 0;
}
/* 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 current page - 1
    $next = $page + 1; //next page is current page + 1
    $lastpage = ceil($total/$limit); //lastpage.
    $lpm1 = $lastpage - 1; //last page minus 1

$sql2 = "SELECT * FROM collection";
$sql2 .= " order by date limit $start ,$limit ";
$sql_query = mysqli_query($sql2);

/* CREATE THE PAGINATION */

$pagination = "";
if($lastpage > 1)
{ 
    $pagination .= "<ul class='pagination'>";
    if ($page > $counter+1) {
        $pagination.= "<li><a href=\"$targetpage?page=$prev\"><</a></li>"; 
    }

    if ($lastpage < 7 + ($adjacents * 2)) 
    { 
        for ($counter = 1; $counter <= $lastpage; $counter++)
        {
            if ($counter == $page)
                $pagination.= "<li><a href='#' class='active'>$counter</a></li>";
            else
                $pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
        }
    }
    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.= "<li><a href='#' class='active'>$counter</a></li>";
                else
                    $pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
            }
            $pagination.= "<li>...</li>";
            $pagination.= "<li><a href=\"$targetpage?page=$lpm1\">$lpm1</a></li>";
            $pagination.= "<li><a href=\"$targetpage?page=$lastpage\">$lastpage</a></li>"; 
        }
        //in middle; hide some front and some back
        elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
        {
            $pagination.= "<li><a href=\"$targetpage?page=1\">1</a></li>";
            $pagination.= "<li><a href=\"$targetpage?page=2\">2</a></li>";
            $pagination.= "<li>...</li>";
            for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<li><a href='#' class='active'>$counter</a></li>";
                else
                    $pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
            }
            $pagination.= "<li>...</li>";
            $pagination.= "<li><a href=\"$targetpage?page=$lpm1\">$lpm1</a></li>";
            $pagination.= "<li><a href=\"$targetpage?page=$lastpage\">$lastpage</a></li>"; 
        }
        //close to end; only hide early pages
        else
        {
            $pagination.= "<li><a href=\"$targetpage?page=1\">1</a></li>";
            $pagination.= "<li><a href=\"$targetpage?page=2\">2</a></li>";
            $pagination.= "<li>...</li>";
            for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; 
            $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<li><a href='#' class='active'>$counter</a></li>";
                else
                    $pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
            }
        }
    }

    //next button
    if ($page < $counter - 1) 
        $pagination.= "<li><a href=\"$targetpage?page=$next\">></a></li>";
    else
        $pagination.= "";
    $pagination.= "</ul>\n"; 
}

现在我们已经设置好了分页,只需在需要的地方调用它即可:

HTML
 <div class="row">
     <div class="col-md-12 text-center">
          <?php echo $pagination ?>
     </div>
 </div>


您的<a>元素将接收href=targetPage?page=pageNumber


来源: http://www.a2zwebhelp.com/php-mysql-pagination

希望这能帮到您!


你应该在回答中直接提供足够的信息来回答问题。如果你链接的页面消失了,那么你的回答就毫无用处。 - blm

4
 $page_no=$_POST['page_no'];//page number  
 $limit=$_POST['limit'];//number of data

 $limit1 = $page_no*$limit; //calculate the limit
 $start = $limit1-$limit; //calculate the start point 
 $sql = "select * from example  limit $start,$limit";// query 

使用该代码会有帮助


2
我最近在使用Bootstrap时做了类似的事情,我使用响应式数据表格来实现这一点。这是链接:这里 以下是我遇到的问题:
  1. 使用Google的最新API
  2. 网站提供HTML、CSS和JS文件
  3. 他们提供分页和响应性,所有你需要的都有
  4. 最重要的数据表格接受数组格式的数据,因此当您从PHP中输出数据时,请使用JSON对象并将所有数据绑定到数组中,然后填充所需的行

0

对于新用户...

$ppcompletexxkc = "yes";

$restt = $db->prepare('SELECT COUNT(*) FROM shop WHERE complete = :complete');
$restt->execute(array(':complete' => $ppcompletexxkc 
                               ));
$total = $restt->fetchColumn();



$adjacents = 3;
$targetpage = "category.php"; //your file name
$limit = 1; //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;
}

/* 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 current page - 1
$next = $page + 1; //next page is current page + 1
$lastpage = ceil($total/$limit); //lastpage.
$lpm1 = $lastpage - 1; //last page minus 1


$lksmttba = $db->prepare('SELECT * FROM shop WHERE complete = :complete ORDER BY id ASC LIMIT :start ,:limit ');
        $lksmttba->execute(array(':complete' => $ppcompletexxkc,
                              ':start' => $start,
                              ':limit' => $limit 
                               ));



/* CREATE THE PAGINATION */

$pagination = "";
if($lastpage > 1)
{ 
$pagination .= "<div class='pagination1'> <ul>";
if ($page > $counter+1) {
$pagination.= "<li><a href=\"$targetpage?page=$prev\">prev</a></li>"; 
}

if ($lastpage < 7 + ($adjacents * 2)) 
{ 
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination.= "<li><a href='#' class='active'>$counter</a></li>";
else
$pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
}
}
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.= "<li><a href='#' class='active'>$counter</a></li>";
else
$pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
}
$pagination.= "<li>...</li>";
$pagination.= "<li><a href=\"$targetpage?page=$lpm1\">$lpm1</a></li>";
$pagination.= "<li><a href=\"$targetpage?page=$lastpage\">$lastpage</a></li>"; 
}
//in middle; hide some front and some back
elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
{
$pagination.= "<li><a href=\"$targetpage?page=1\">1</a></li>";
$pagination.= "<li><a href=\"$targetpage?page=2\">2</a></li>";
$pagination.= "<li>...</li>";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
{
if ($counter == $page)
$pagination.= "<li><a href='#' class='active'>$counter</a></li>";
else
$pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
}
$pagination.= "<li>...</li>";
$pagination.= "<li><a href=\"$targetpage?page=$lpm1\">$lpm1</a></li>";
$pagination.= "<li><a href=\"$targetpage?page=$lastpage\">$lastpage</a></li>"; 
}
//close to end; only hide early pages
else
{
$pagination.= "<li><a href=\"$targetpage?page=1\">1</a></li>";
$pagination.= "<li><a href=\"$targetpage?page=2\">2</a></li>";
$pagination.= "<li>...</li>";
for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; 
$counter++)
{
if ($counter == $page)
$pagination.= "<li><a href='#' class='active'>$counter</a></li>";
else
$pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>"; 
}
}
}

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


echo $pagination;

    while($readpostv=$lksmttba->fetch(PDO::FETCH_ASSOC)){ 

          echo' '.$readpostv['img1'].'';
        }
echo $pagination;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接