今回は更新一覧ページのリンクを押したら、更新一覧ページが表示され、さらに過去の記事等を見ることができるページング機能を作っていきたいと思います。7月20日記事
※このページで作られるリンクから個別内容をページに表示させるプログラムは、PHPでPDOを使ってMySQLから1件だけフィールドを取得したい場合を参照してください。
イメージ



目次





設計思想

テーブルにはid,title,info_date,・・・,statusというカラムがあり、その中で、公開日(info_date)が今日以下のものかつ、statusが公開中のもの(今回の場合は2と例にとる)を取得し、5件ずつ表示させていくプログラムを作っていきます。
また、セキュリティ対策のため、ページ番号を文字列や数字以外のものを入れられた場合、1ページを表示させるようにしていきたいと思います。
コメントアウトし、ダンプの残骸を残しておきました。適宜コメントアウトをはずし実行し、状況を確認してみてください。

コード

PHP

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>エンドユーザのページング</title>
</head>
<body>
<?php
require('config.php');

$dsn = 'mysql:dbname='.DB_NAME.';host='.DB_HOST.';port='.DB_PORT.'';
$user = DB_USER;
$password = DB_PASSWORD;

try{
	$dbh = new PDO($dsn, $user, $password);	
}catch (PDOException $e){
	print('Connection failed:'.$e->getMessage());
	die();
}
//1ページあたりの表示件数
$pagesize = 5;
if(isset($_GET["page"])) $page = filter_var($_GET["page"],FILTER_SANITIZE_NUMBER_INT,FILTER_NULL_ON_FAILURE);
if(empty($_GET["page"])) $page = 1;
if($page == NULL) $page = 1; 

//トータル件数取得
$offset = $pagesize*($page -1);
$sql = "SELECT * FROM information WHERE info_date <= '".date('Y-m-d')."
' AND status = '2' ORDER BY id DESC LIMIT ".$offset.",".$pagesize;
//print $sql;

$news = array();

foreach ($dbh->query($sql) as $row){
	array_push($news, $row);
}

//件数取得
$sql = "SELECT COUNT(*) FROM information WHERE info_date <= '".date('Y-m-d')."' AND status = '2'";
$stmt = $dbh->query($sql);
$total = $stmt->fetchColumn();


$totalpage = ceil($total/$pagesize);
//var_dump($news);
//exit;
//print '<br>totalpage:'.$totalpage;

?>
	<h1>更新情報一覧</h1>
    <ul>
    <?php foreach($news as $new): ?>
    	<li><a href="detail.php?id=
		<?php 
		echo htmlspecialchars($new['id'],ENT_QUOTES,"UTF-8"); 
		?>
        "><?php echo htmlspecialchars($new['title'],ENT_QUOTES,"UTF-8"); ?></a></li> 
    <?php endforeach; ?>
    </ul> 

<?php
if($page >= 2){
	echo '<a href="index.php?page='.($page-1).'">[最新ページへ]</a>';
}else{
	echo '[最新ページ]';
}
if($page < $totalpage){
	echo '<a href="index.php?page='.($page+1).'">[過去のページへ]</a>';

}
?>
</body>
</html>

まとめ

  1. 初期は1ページにする。
  2. 数字以外が入れられないようにフィルタリングする。
  3. 公開中のものかつ、本日の日付のものを公開対象とするクエリを投げる
  4. ページ数の最大数取得は総ページ÷1ページあたりの項目数を小数点第一位で切り上げた整数値を取得するクエリもなげる。
  5. 過去ページや最新ページのリンクは自分自身のファイルに対してリンクを飛ばす

    というようにやっていけばよいと思います

    以上
最終更新:2015年07月20日 10:01
添付ファイル