読み込み専用。過去ログを出力します。Pear::Pagerを使います。
<?php require_once('login.php'); require_once('function.php'); $bbs_target = target_set(); $myself = './readonly.php?target='.$bbs_target; $bbs_janame = enname2janame($bbs_target); if($bbs_target == 'history') { $title = 'koi-chan\'s BBS Program 更新履歴'; } else { $title = '掲示板 -'.$bbs_janame.'- 過去ログ倉庫'; } ?> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="./auth.css" media="screen,print" /> <link rel="stylesheet" type="text/css" href="./load.css" media="screen,print" /> <link rel="stylesheet" type="text/css" href="./readonly.css" media="screen,print" /> <link rel="stylesheet" type="text/css" href="./basic.css" media="screen,print" /> <title>掲示板 -<?php echo("$title");?>- 過去ログ倉庫</title> </head><body> <?php echo $Auth_data['script']; echo '<h2>'; echo $title?></h2> <?php #ページャを使って表示する require_once('Pager/Pager.php'); $result = $db->query("SELECT COUNT(id) FROM $bbs_target"); $totalItems = $result->fetch(); $pager_opt['totalItems'] = $totalItems[0]; if (isset($_GET['perPage']) and is_numeric($_GET['perPage'])) { $pager_opt['perPage'] = $_GET['perPage']; } $pager = & Pager::factory($pager_opt); $links = $pager->getLinks(); $itemRange = $pager->getOffsetByPageId(); #ステートメントを用いてSQLを発行(うまくいかないので変数を埋め込む) $sql = 'SELECT l.id, a.username, l.subject, l.body, l.date, l.ip_addr, l.browser, l.monospace '. 'FROM '.$bbs_target.' AS l, auth AS a '. 'WHERE a.id = l.user AND (l.id BETWEEN '.$itemRange[0].' AND '.$itemRange[1].') '. 'ORDER BY l.id'; switch ($_GET['sort']) { case 'down': #降順の場合 $sort = <<< END <input type="radio" name="sort" value="up" />昇順 <input type="radio" name="sort" value="down" checked="checked" />降順 END; $sql .= ' DESC'; break; default: #それ以外(昇順も含む)の場合 $sort = <<< END <input type="radio" name="sort" value="up" checked="checked" />昇順 <input type="radio" name="sort" value="down" />降順 END; $sql .= ' ASC'; break; } $stmt = $db->prepare($sql); $stmt->bindParam(':itemRange0', $itemRange[0], PDO::PARAM_INT); $stmt->bindParam(':itemRange1', $itemTange[1], PDO::PARAM_INT); $flag = $stmt->execute(); if (!$flag) { $info = $stmt->errorInfo(); echo($info[2]); echo("\n読み込みに失敗しました。\n"); exit; } #データ読み込み、整形出力 #ページャヘッダ echo <<<END <div class="pager"> ${links['all']} <form method="GET" action="" accept-charset="utf8"> <input type="hidden" name="target" value="${bbs_target}" /> ただいま${pager_opt['totalItems']}件中${itemRange[0]}~${itemRange[1]}番目の記事を表示しています。 <input type="text" size="5" name="perPage" value="${pager_opt['perPage']}" />件ごとに ${sort} <input type="submit" value="再表示" /> </form></div> END; #ここまで echo("\n<!--記事--><div class=\"kiji-contents\">\n"); while ($row = $stmt->fetch()) { echo("<div class=\"kiji\" id=\"{$row['id']}\">\n"); echo($row['id'].' : <span class="sub">'.$row['subject'].'</span> : <span class="user">'.$row['username'].'</span> : '.$row['date']."\n"); echo('<p class="data"'); if($row['monospace'] == 1) { echo(' style="font-family: monospace"'); } echo('>'.$row['body']."</p>\n${row['browser']} [${row['ip_addr']}]</div>\n\n"); } echo "</div>\n"; #ページャヘッダ echo <<<END <div class="pager"> ${links['all']} <form method="GET" action="" accept-charset="utf8"> <input type="hidden" name="target" value="${bbs_target}" /> ただいま${pager_opt['totalItems']}件中${itemRange[0]}~${itemRange[1]}番目の記事を表示しています。 <input type="text" size="5" name="perPage" value="${pager_opt['perPage']}" />件ごとに ${sort} <input type="submit" value="再表示" /> </form></div> END; #ここまで ?> <hr /> <div class="end">投稿は以上です。<a href="./bbs.php?target=<?php echo $bbs_target; ?>">通常の掲示板に戻る</a></div> </body></html>
1~26行目
他のスクリプトとほとんど同じなので省略させていただきます。
30行目
Pear::Pagerを使うためにスクリプトに取り込みます。
31~36行目
Pear::Pagerを使うために必要な変数値を用意します。
まずデータベースから過去ログの総数を取得しています。COUNTはMySQLの関数の一つで、指定した列のデータ件数を出力します。今回はプライマリデータ(漏れが出てはいけない、記事連番)を保存している列を指定します。
次にGETで送られてきたフォームデータで1位ページ当たり何件ずつ表示するかを指定されていた場合その値を反映させます。
38~40行目
Pear::Pagerを使うために必要な処理です。
まず、/include/config.phpで設定した連想配列$pager_optを設定格納変数として指定、Pear::Pagerを起動。
次に前後のページ(過去ログの続きや前)へ飛ぶリンクを変数$linksに代入。
最後に出力するデータにつけられた最初と最後のIDを配列変数$itemRangeに代入します。
例えば、1ページに表示する過去ログが10件に設定されているとき$itemRangeに格納されている値は次のようになります。
1ページ目: $itemRange[0] => 1 , $itemRange[1] => 10
2ページ目: $itemRange[0] => 11, $itemRange[1] => 20
これらの値を使ってデータベースから取得する記事を決めます。
43~63行目
SQL文を作成します。過去ログ表示ページには投稿元のIPアドレスとブラウザ情報も表示させます。
そのほかにload.phpと違う点は取得するログを決める部分です。idの値が$itemRangeに格納された値の間にします。これにステートメントを使っています。
最後に並び替え(ソート)をどうするかをGETで送られてきたフォームデータで判断してSQL文に反映し、指定するためのフォームの一部を変数$sortに格納します。
65~74行目
作成したSQL文を確定し、ステートメントの穴の部分を置換、その後SQL文を実行します。
77~88行目、101~111行目
表示するページへのリンク、1ページに表示する記事件数と並べ替え方法を伝えるフォームを出力します。
過去ログ本体の前後に計2回同じものを出力します。
91~99行目
データベースから取得した過去ログをひとつづつ出力していきます。
ほとんどload.phpと同じため解説を割愛します。
117~119行目
最後に普通の掲示板に戻るリンクを出力して終了です。
Posted in PHPで動く掲示板プログラム |