简体   繁体   中英

How to change Pagination from 'per page' to only first and last pages?

i have a code for my table pagination. but now i have a problem. the pagination is showing EVERY page. but i got over 900 pages.

ALSO: i need to use PDO

i want the pagination to work like this:

Image

i dont know how to make this in my already excisting code:

        $per_page_html = '';
        $page = 1;
        $start=0;
        if(!empty($_POST["page"])) {
            $page = $_POST["page"];
            $start=($page-1) * ROW_PER_PAGE;
        }
        $limit=" limit " . $start . "," . ROW_PER_PAGE;
        $pagination_statement = $oConn->prepare($sql);
        $pagination_statement->execute();

        $row_count = $pagination_statement->rowCount();
        if(!empty($row_count)){
            $per_page_html .= "<div style='text-align:center;margin:20px 0px;'>";
            $page_count=ceil($row_count/ROW_PER_PAGE);
            if($page_count>1) {
                for($i=1;$i<=$page_count;$i++){
                    if($i==$page){
                        $per_page_html .= '<input type="submit" name="page" value="' . $i . '" class="btn-page current" />';
                    } else {
                        $per_page_html .= '<input type="submit" name="page" value="' . $i . '" class="btn-page" />';
                    }
                }
            }
            $per_page_html .= "</div>";
        }

        $query = $sql.$limit;
        $pdo_statement = $oConn->prepare($query);
        $pdo_statement->execute();
        $result = $pdo_statement->fetchAll();

I dont see your table and your query in your question so I will give 2 complete examples tested on my demo site, you need to change it to your own variables.

Solution 1.

Here is the example pagination for items belong to a category, for simple pagination :

$perpage = "3";
//This limit of the page to show on each page
$n_stmt = $pdo->prepare("SELECT * FROM categories");
$n_stmt->execute(); 
$total_posts = $n_stmt->rowCount();
$total_pages = ceil($total_posts/$perpage);
$page = !empty($_GET['page']) && $_GET['page'] ? (int) $_GET['page'] : 1;
if($page < 1) $page = 1;
if($page > $total_pages) $page = $total_pages;
$limit = ($page - 1) * $perpage;
$pag_limit = 10;
$stmt = $pdo->prepare("SELECT * FROM categories ORDER BY created DESC LIMIT :limit, :perpage");
$stmt->bindValue(":limit",$limit, PDO::PARAM_INT);
$stmt->bindValue(":perpage",$perpage, PDO::PARAM_INT);
$stmt->execute();
while($news = $stmt->fetch(PDO::FETCH_ASSOC)){
 // Do what ever you want here

} 

And pagination:

<div class="pagination">
<?php   if($page >1){?>
    <a href="category/page/1">First</a>
    <a href="category/page/<?php echo $page - 1;?>">Preview</a>

    <?php } for($i = $page - $pag_limit; $i < $page + $pag_limit + 1; $i++){ 
        if($i > 0 and $i <= $total_pages){
            if($i == $page){?>
                <a href="category/page/<?php echo $i;?>" class="active"><?php echo $i;?></a>
            <?php }else{?>
            <a href="category/page/<?php echo $i;?>"><?php echo $i;?></a>
            <?php   
            }
        }
    ?>

    <?php } ?>

    <?php if($page != $total_pages){?>
    <a href="category/page/<?php echo $page + 1;?>">next</a>
    <a href="category/page/<?php echo $total_pages;?>">Last</a>
    <?php } ?>
</div>

Solution 2.

Here is pagination for search result with your codes , as I said this code works on my demo site you need to change your own variables and its in pdo:

define("ROW_PER_PAGE",10);
//this goes on top of your page

require_once("db.php");  
    $search_keyword = '';
    if(!empty($_POST['search']['keyword'])) {
        $search_keyword = htmlspecialchars(strip_tags($_POST["search"]["keyword"]), ENT_QUOTES);
    }
    $sql = 'SELECT * FROM posts WHERE title LIKE :keyword OR descriptions LIKE :keyword OR subject LIKE :keyword ORDER BY id DESC ';

    /* Pagination Code starts */
    $per_page_html = '';
    $page = 1;
    $start=0;
    if(!empty($_POST["page"])) {
        $page = $_POST["page"];
        $start=($page-1) * ROW_PER_PAGE;
    }
    $limit=" limit " . $start . "," . ROW_PER_PAGE;
    $pagination_statement = $pdo->prepare($sql);
    $pagination_statement->bindValue(':keyword', '%' . $search_keyword . '%', PDO::PARAM_STR);
    $pagination_statement->execute();

    $row_count = $pagination_statement->rowCount();
    if(!empty($row_count)){
        $per_page_html .= "<div class=\"pagination\">";
        $page_count=ceil($row_count/ROW_PER_PAGE);
        if($page_count>1) {
            for($i=1;$i<=$page_count;$i++){
                if($i==$page){
                    $per_page_html .= "<input type=\"submit\" name=\"page\" value=" . $i . " class=\"btn-page current\" />";
                } else {
                    $per_page_html .= "<input type=\"submit\" name=\"page\" value=" . $i . " class=\"btn-page\"/>";
                }
            }
        }
        $per_page_html .= "</div>";
    }

    $query = $sql.$limit;
    $pdo_statement = $pdo->prepare($query);
    $pdo_statement->bindValue(":keyword", "%" . $search_keyword . "%", PDO::PARAM_STR);
    $pdo_statement->execute();
    $result = $pdo_statement->fetchAll();

Your html part with pagination at the bottom and your result in form same as you can see

<form name="frmSearch" action="search/" method="post">
<div class="searchf">
<input type="text" name="search[keyword]" class="field" value="<?php echo $search_keyword; ?>" id="keyword" maxlength="25">
<input type="submit" name="submit" class="searchf-btn" value="Ara">
</div>
    <?php
    if(!empty($result)) { 
        foreach($result as $row) {
    ?>
    <div class="news_box">
    <a href="<?php echo htmlspecialchars($row["news_url"]);?>/" title="<?php echo htmlspecialchars($row["title"]);?>">
        <div class="title"><h2><?php echo htmlspecialchars($row["title"]);?></h2></div>
        <div class="image">
        <img src="images/posts/<?php echo htmlspecialchars($row["img"]);?>" alt="<?php echo htmlspecialchars($row["title"]);?>"/></div>
        <div class="spot"><?php echo htmlspecialchars($row["subject"]);?></div>
    </a>
    </div>
    <?php
        }
    }
    ?>
<div class="cl">&nbsp;</div>
//Here is pagination
<?php echo $per_page_html; ?>
</form>

I am using seo urls in demo, you need to set htaccess for links, or change pagination links like so : your_page.php?page=$i .

Both tested on my demo site and working, I used some filtering functions you can remove them.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM