前回記事PHPとMySQLを使いGETメソッドで受け取ったデータを取得&表示の続きです。新規投稿ページできたぁと思っても、その記事を再編集できなければ、利用者は極めてビクビクしながら、新規投稿しなけれびなりません。人間はミスする生き物ですから、再編集機能も設ける必要があります。今回はそれを作っていきます。6月5日記事
こんな感じにしましょうか?もっと見る的のローディング機能を作るか、次ページ、前ページというようにページング機能を作るか迷いました。どっちをやってもいいのですが、やはりページング機能から実装していきます。ローディング機能に関してはまた後日行っていきたいと思います。
イメージは以下。
まずは、[最新のページ一覧]、[過去のページ一覧]的なリンクを作っていきます。
削除以外の状態のページ、「公開」と「下書き」のページを取得していく必要があります。
5件分取得し(あとでも取得件数を変えられるようにしておく)。
個人的には、もっと見るもっと読むボタン(ローディング)より、次へや前へのボタン(ページング)の方が好きです。ページング機能から行っていきます。
まず、GETメソッドで受け取った変数をフィルターします。
コードを書いていきます。
<?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(); } $pagesize = 5;//1ページあたりの表示件数 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 テーブル名 WHERE status = '1' OR 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 テーブル名 WHERE status = '1' OR status = '2'"; $stmt = $dbh->query($sql); $total = $stmt->fetchColumn(); //print $sql; $totalpage = ceil($total/$pagesize); ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <link href="reset.css" rel="stylesheet" type="text/css"> <link href="style.css" rel="stylesheet" type="text/css"> <title>タイトルcontents Manager</title> </head> <body> <div id="page"> <div id="head"> <header> <h1>CONTENTS MANAGER</h1> </header> </div> <div id="container"> <div id="menu"> <nav> <li id="current"><a href="setting.php">新規作成</a></li> <li><a href="editlist.php">編集</a></li> <li><a href="http://www.hoge.net">サイトトップへ</a></li> <li><a href="javascript:;" onclick="window.close();">ウインドウを閉じる</a></li> </nav> </div> <div id="contents"> <!-- ここから --> <section id="edit_list"> <h1>投稿一覧</h1> <dl> <dt id="dthead">ID</dt> <dd id="ddhead"> <ul> <li class="date">公開(予定)日付</li><li class="title">タイトル</li><li class="status">状態</li><li class="edit">編集</li><li class="delete">削除</li> </ul> </dd> <?php foreach($news as $new): ?> <dt><?php echo htmlspecialchars($new['id'],ENT_QUOTES,"UTF-8"); ?></dt> <dd> <ul> <li class="date"><?php echo htmlspecialchars($new['info_date'],ENT_QUOTES,"UTF-8"); ?></li> <li class="title"><?php echo htmlspecialchars(mb_convert_encoding($new['title'],"UTF-8","EUC-JP"),ENT_QUOTES,"UTF-8"); ?></li> <li class="status"><?php switch($new['status']){ case 2: echo "公開"; break; case 1: echo "下書き"; break; default: echo "削除"; break; }?></li> <li class="edit"><form action="edit.php" method="post"><input type="hidden" name="id" value="<?php echo htmlspecialchars($new['id'],ENT_QUOTES,"UTF-8"); ?>"><input type="submit" name="submit" value="編集"></form></li><li class="delete"><form action="delete.php" method="post"><input type="hidden" name="id" value="<?php echo htmlspecialchars($new['id'],ENT_QUOTES,"UTF-8"); ?>"><input type="submit" name="submit" value="削除"></form></li> </ul> </dd> <?php endforeach; ?> <!--ループ--> </dl> <?php if($page >= 2){ echo '<a href="editlist.php?page='.($page-1).'">[最新ページへ]</a>'; }else{ echo '[最新ページ]'; } if($page < $totalpage){ echo '<a href="editlist.php?page='.($page+1).'">[過去のページへ]</a>'; } ?> </section> <!-- ここまで--> </div> </div> <footer> <p>フッター</p> </footer> </div> <br> <br> </body> </html>
CSS部
section#form dl{ margin-top: 30px; } section#form dl dt{ width: 180px; float:left; clear:both; padding: 10px; border-top: 2px solid #EEE; } section#form dl dd{ width: 400px; float:left; padding: 10px; border-top: 2px solid #EEE; } section#edit_list dl{ margin-top: 30px; min-height: 300px; /* background: #FFC;*/ } section#edit_list dl dt{ width: 30px; float:left; clear:both; padding: 5px; border-bottom: 2px dotted #EEE; } section#edit_list dl dd{ float:left; border-bottom: 2px dotted #EEE; } section#edit_list dl dt#dthead,section#edit_list dl dd#ddhead{ border-top: 2px solid #EEE; border-bottom: 2px solid #EEE; } section#edit_list dl dd ul{ width: 640px; } section#edit_list dl dd li{ display:inline-block; height:16.5px; float:left; padding: 5px; } section#edit_list dl dd li.date{ width: 120px; } section#edit_list dl dd li.title{ width: 320px; } section#edit_list dl dd li.status{ width: 50px; } section#edit_list dl dd li.edit{ width: 50px; } section#edit_list dl dd li.delete{ width: 50px; }
ユーザが見るページと似たように見えますが、公開日が新しい順にソートするのではなく、ID順にソートしていくクエリを投げれば行けると思います。
以上