今回は更新一覧ページのリンクを押したら、更新一覧ページが表示され、さらに過去の記事等を見ることができるページング機能を作っていきたいと思います。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>