PHP中的分页方法

这是我初次投稿。
关于PHP的分页功能,之前实施过但是知识有所遗漏,所以希望通过输出的方式来复习。如果能对某方面有所帮助,我会感到幸运。

要点
– 每页显示5个项目
– 在页面的前后显示“前一页”和“后一页”。如果有多个页面,则它们将被设为链接,点击每个按钮将跳转到前后的页面
– 显示最多5个页码。基本上只显示当前显示的页面前后的2个页码
– 根据显示的页面数,“显示第X至第X个商品中的第X个”

此次,我们将使用原生的PHP进行实现,而不使用Laravel或其他框架。

大致的形象就是这样的。

スクリーンショット 2020-07-27 22.36.07.png

数据库相关

function get_db_connect(){
  $dsn = 'mysql:dbname='. DB_NAME .';host='. DB_HOST .';charset='.DB_CHARSET;

  try {
    $dbh = new PDO($dsn, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  } catch (PDOException $e) {
    exit('接続できませんでした。');
  }
  return $dbh;
}


function fetch_all_query($db, $sql, $params = array()){
  try{
    $statement = $db->prepare($sql);
    $statement->execute($params);
    return $statement->fetchAll();
  }catch(PDOException $e){
    エラーメッセージの表示;
  }
  return false;
}

用select命令提取模型所需的元素

$db = 获取数据库连接();


function get_items_list($db, $limit = 5, $offset = 0){
  $sql = '
    SELECT
       --selectする要素を記載
    limit ?
    offset ?';

  return fetch_all_query($db, $sql, array($limit, $offset));
}

在这种情况下,事先将可显示的数量限定为$limit=5。

另外,我也想知道总数量,所以使用计数(count)来实现。


function get_items_count($db) {
  $sql = '
    SELECT
        count(*)
    FROM
        テーブル名'

    $result = fetch_all_query($db, $sql);

    return $result[0]['count(*)'];
}

②实现view画面


<?php 

foreach($items as $value) {

--ここにget_items_list関数から表示させたいアイテムを表示

} 

echo $items_count. '件中'.$page_ini. "〜" .$page_fin. "件目の商品";

// リンクをつけるかの判定
if($now > 1){ 
    print '<a href=\'../html/〜.php?page_id='.($now - 1).'\')>前へ</a>'. ' ';
} else {
    print '前へ'. ' ';
}

for($i = 1; $i <= $max_page; $i++){
    if($i >= $now - $range && $i <= $now + $range) {
        if ($i == $now) {
            print '<a class="current_page" href=\'〜.php?page_id='.$now.'\')>'. $now. '</a>'. ' ';
        } else {
            print '<a href=\'../html/〜.php?page_id='.$i. '\')>'. $i. '</a>'. ' ';
        }
    }
}
// リンクをつけるかの判定
if($now < $max_page){ 
    print '<a href=\'../html/〜.php?page_id='.($now + 1).'\')>次へ</a>'. ' ';
} else {
    print '次へ';
}
?>

首先,从第○到第○件商品中开始。

关于$items_count,我们可以使用在model中编写的get_items_count函数来显示它。

关于page_ini和page_fin(即要显示的商品页面的起始和结束部分),根据通过get方法获取的页面id来定义offset的值,从而改变显示的页面。

关于“前”和“次”,点击后获取到的页面id会加1,并传递给get方法。

用 for 循环来显示页面的数量。

关于$range,当页面id为1或最后一页时,设为4;当id为2或倒数第二页时,设为3;其他情况下设为2。


//ページネーションの表示数
if((int)$now === 1 || (int)$now === (int)$max_page) {
    $range = 4;
} else if((int)$now === 2 || (int)$now === ((int)$max_page -1)) {
    $range = 3;
} else  {
    $range = 2;
}

③控制器的说明

在视图中定义指定的变量。


if(get_get('page_id')) {
  $now = $_GET['page_id'];
} else {
  $now = 1;
}

$offset = ($now - 1) * 5;

$items = get_items_list($db, $limit = 5, $offset);

$items_count = get_items_count();

$max_page = ceil($items_count / 5);

$page_ini = ($offset + 1);

if(count($items) === 5) {
  $page_fin = ($offset + 5);
} else {
  $page_fin = $items_count;
}

if((int)$now === 1 || (int)$now === (int)$max_page) {
    $range = 4;
} else if((int)$now === 2 || (int)$now === ((int)$max_page -1)) {
    $range = 3;
} else  {
    $range = 2;
}

首先,定义接收到的页面id(get_get是用户自定义函数)。


//viewからのidをgetしたとき
if(get_get('page_id')) {
  $now = $_GET['page_id'];
} else {
  //設定されてない場合は1ページ目にする
  $now = 1;
}

在定义变量之后,使用该变量($now)来定义偏移量。


//ここでoffsetの定義
$offset = ($now - 1) * 5;

在这里定义了在模型中实现的select语句。


$items = get_items_list($db, $limit = 5, $offset);
$items_count = get_items_count();

使用 ceil 函数,若为小数点,则进行向上取整操作。


$max_page = ceil($items_count / 5);

根据前面所述,页面_ini和页面_fin(即要显示的商品页面的开始和结束部分),取决于偏移值,显示的页面会有所改变。


//最初
$page_ini = ($offset + 1);

//最後(1ページに表示されるアイテム数が5つの場合とそうでない場合で条件分岐)
if(count($items) === 5) {
  $page_fin = ($offset + 5);
} else {
  $page_fin = $items_count;
}

我想在Laravel中尝试实现分页功能。

广告
将在 10 秒后关闭
bannerAds