【PHP】分页

PHPでページネーションを実装しました。
配列でデータを管理して、クリックされたボタンによって表示を条件分岐する処理になっています。

pagenation02-min.gif

整个形象

image.png那么,我们将实际进行实施。

将数据分配到每个区块中先ほど説明した、配列$blockをつくります。
まずは、ページネーションでデータを表示させる一覧画面から確認していきます。

<?php
$block=pagination_block($posts);

global $i;
if(empty($_POST['block'])){
  $_SESSION[$i]=0;
}
if(isset($_POST['block'])){
switch($_POST['block']){
  case '«':
    $_SESSION[$i]--;
  break;
  case '»':
    $_SESSION[$i]++;
  break;
  default:
  $_SESSION[$i] = $_POST['block']-1;
  break;
}
}

if(isset($block[0])):
  foreach($block[$_SESSION[$i]] as $post):
?>
<div class="post">
 <p><?= $post['text'] ?></p>
  <img src="/post/image/<?= $post['image'] ?>">
</div>
<?php endforeach ?>
<?php endif?>

foreach関数で$blockのデータを順に表示しています。
$_POST[‘block’]で$_SESSION[$i]の値を更新しているのですが、こちらは後ほど説明します。
$postsには、下記のような投稿データが7つ入っています。

Array
(
    [0] => Array
        (
            [id] => 7
            [text] => 投稿01
            [image] => 
            [user_id] => 38
            [created_at] => 2021-04-17 10:20:46
:
:
    [6] => Array
        (
            [id] => 1
            [text] => 投稿07
            [image] => 
            [user_id] => 38
            [created_at] => 2021-04-17 10:20:22
        )
)

それでは、最初に定義されているpagination_block関数から見ていきます。

function pagination_block($data){
  global $block;
  $data_count=count($data);
  $block_count=ceil($data_count/3);
  $k=0;
  for($i=0;$i<$block_count;$i++){
    for($j=0;$j<3;$j++){
        if($data_count==$k){
            break;
        }
        $block[$i][$j]=$data[$k];
        $k++;
    }
  }
  return $block;
}

$data_countで投稿数を取得し、$block_countでは$blockの要素数を取得しています。
for文でデータを1つずつ$blockに渡していき、値を渡す回数$kが$data_countと同じ値になったときにbreakするような処理になっています。
ちなみに$jはページネーション機能で表示するデータ数を決めており、今回は3投稿ずつ表示するようにしています。

これで、$blockに3投稿ずつデータを渡すことができました。
それではページネーションを実現するためのボタンを作成していきます。

制作分页按钮

<?php 
if(isset($block[1])):
    $block_count=count($block);
?>

    <form method="post" action="#">
    <nav aria-label="Page navigation">
      <ul class="pagination justify-content-center pagination-lg">
        <li class="page-item">
            <?php if($_SESSION[$i]==0):?>
                <input class="page-link first" name="block" type="submit" value="&laquo;" disabled>
            <?php else:?>
                <input class="page-link" name="block" type="submit" value="&laquo;">
            <?php endif;?>
        </li>

        <?php for($l=1;$l<$block_count+1;$l++){
        print'<li class="page-item"><input class="page-link" name="block" type="submit" value="'.$l.'"></li>';
        }?>
        <li class="page-item">
        <li class="page-item">
            <?php if($_SESSION[$i]==$block_count-1):?>
                <input class="page-link last" name="block" type="submit" value="&raquo;" disabled>
            <?php else:?>
                <input class="page-link" name="block" type="submit" value="&raquo;">
            <?php endif;?>
        </li>
        </li>
      </ul>
    </nav>
    </form>
    <?php endif; ?>

布局使用了Bootstrap4。

if(isset($block[1])):

<?php endif; ?>

如果 $block[0] 的数据为空,则不显示按钮。

<?php for($l=1;$l<$block_count+1;$l++){
 print'<li class="page-item"><input class="page-link" name="block" type="submit" value="'.$l.'"></li>';
}?>

こちらで$blockの要素数だけボタンを表示するようにし、value=”‘.$l.'”でボタンに表示する値を指定しています。

<?php if($_SESSION[$i]==0):?>
 <input class="page-link first" name="block" type="submit" value="&laquo;" disabled>
<?php else:?><?php if($_SESSION[$i]==$block_count-1):?>
 <input class="page-link last" name="block" type="submit" value="&raquo;" disabled>
<?php else:?>

当 $block 的参数为0时,将“下一页”按钮设定为无效;当参数为 $block 的元素数量减1时,将“上一页”按钮设定为无效。

当$_POST[‘block’]被点击时,将实施使$_SESSION[$i]的值发生变化的处理。

回到之前的post_list.php页面。

if(isset($_POST['block'])){
 switch($_POST['block']){
   case '«':
     $_SESSION[$i]--;
   break;
   case '»':
     $_SESSION[$i]++;
   break;
   default:
     $_SESSION[$i] = $_POST['block']-1;
  break;
 }
}

点击的按钮将会更新$_SESSION[$i]的值,更新方式如下表所示。

$_POST['block']$_SESSION[$i]<<(次ページ)インクリメント>>(前ページ)デクリメントページ指定ボタンボタンの値 – 1
通过点击按钮,现在$_POST[‘block’]的参数得到更新,并且显示的数据也被改变。

bannerAds