PHP中的分页方法
这是我初次投稿。
关于PHP的分页功能,之前实施过但是知识有所遗漏,所以希望通过输出的方式来复习。如果能对某方面有所帮助,我会感到幸运。
要点
– 每页显示5个项目
– 在页面的前后显示“前一页”和“后一页”。如果有多个页面,则它们将被设为链接,点击每个按钮将跳转到前后的页面
– 显示最多5个页码。基本上只显示当前显示的页面前后的2个页码
– 根据显示的页面数,“显示第X至第X个商品中的第X个”
此次,我们将使用原生的PHP进行实现,而不使用Laravel或其他框架。
大致的形象就是这样的。
数据库相关
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中尝试实现分页功能。