如何在PHP MVC中实现分页?

时间:2019-12-18 22:43:07

标签: php html css pagination

我一直坚持在我的PHP MVC应用程序中实现分页。 这就是我展示产品的方法,现在我完全陷入了困境,因为我不知道如何在我的代码中实现分页。 我希望有人向我展示我的代码示例,以便将来我可以学习;

我的控制器-> Products.php

<?php

/**
 * 
 */
class Products extends Controller
{

    public function __construct()
    {
        if(!isLoggedIn()){
            redirect('users/login');
        }

        $this->productModel = $this->model('Product');
    }

    public function index(){
        $products = $this->productModel->getProducts();

        $data=[
            'products' => $products
        ];

        $this->view('products/index', $data);
    }
}

我的模型-> Product.php

<?php

/**
 * 
 */
class Product
{       
    public function __construct()
    {
        $this->db = new Database();
        # code...
    }

    public function getProducts(){
        $this->db->query('SELECT *,
                        products.id as productId,
                        users.id as userId,
                        products.productCreated as productCreated,
                        users.created_at as userCreated
                        FROM products
                        INNER JOIN users
                        ON products.user_id = users.id
                        ORDER BY products.productCreated DESC
                        ');

        $results = $this->db->resultSet();
        return $results;
    }
}

和我的视图Product-> Index.php

<?php require APPROOT . '/views/inc/header.php'; ?>
<style type="text/css">
    #abc {
       line-height: 2px;
    }

    #productName {
    font-size: 14px;
    font-weight: bold;
    line-height: 10px;
    padding-top: 6px;
    }

    #cardid {
        margin-top: 15px;
    }

    #buybtn {
        width: 100px;
        height: 30px;
        margin-top: -10px;
        padding: 2px;
    }
</style>

    <div class="container-fluid">
        <h1> PRODUCTS</h1>
    <div class="row">
        <div class="col-lg-10">

        <?php foreach ($data['products'] as $product) : ?>              

        <div class="card" style="width: 150px; text-align:center;display:inline-block;" id="cardid">
           <h4 class="card-title text-center" id="productName"><?php echo $product->productName; ?></h4>
           <img class="card-img-top" src="img/img_avatar1.png" alt="Card image" style="width:100%">
        <div class="card-block">

        <p class="card-text">Some example text some example text. John Doe is an architect and engineer</p>
        <p class="card-text" id="abc" style="color:red">125</p>
        <a href="#" class="btn btn-primary stretched-link" id="buybtn">Buy now</a>

  </div>
</div>

<?php endforeach; ?>

        </div>
        <div class="col-lg-2 jumbotron">
            Container Right
        </div>
    </div>
</div>

<?php require APPROOT . '/views/inc/footer.php'; ?>

我看到了很多有关分页的主题,但是我不知道如何在这里实现它,因此我每页只能显示10种产品...

1 个答案:

答案 0 :(得分:0)

您可以做的是向getProducts($args)添加过滤器。您可以过滤产品名称,价格范围等。但是,您也可以选择发送$args['page']$args['items_per_page']。然后,您可以计算SQL偏移量和限制。不过请检查类型,并提供默认值,并始终使用mysqli::real_escape_string之类的功能来防御XSS攻击。

这样,您可以计算SQL LIMIT和OFFSET:

$limit = $items_per_page;
$offset = $items_per_page * $page;

您可以在链接中添加参数:

<a href="{YOUR_URL}?page=2&items_per_page=11>Previous Page</a>
<a href="{YOUR_URL}?page=4&items_per_page=11>Next Page</a>

然后您可以使用$ _GET检索这些并将它们发送到您的getProducts($args)方法。