最新の投稿を取得するページ。/wwwroot/bbs.phpのインラインフレーム内で使います。
<?php require_once('login.php'); require_once('function.php'); $bbs_target = target_set(); $myself = './load.php?target='.$bbs_target; if(isset($_GET['load_max']) and $_GET['load_max'] > 0) { #表示する記事数 $load_max = (int) $_GET['load_max']; } ?> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="refresh" content="<?php echo($reload_time); ?>; url=<?php echo($myself.'&load_max='.$load_max); ?>" /> <link rel="stylesheet" type="text/css" href="./load.css" media="screen,print" /> <link rel="stylesheet" type="text/css" href="./basic.css" media="screen,print" /> </head><body> <p><!--ヘッダー--> <div class="refresh_time"><?php echo($reload_time);?> 秒後に自動更新します。</div> <div class="last_reload">最終更新: <?php echo(date("Y.m/d(D) H:i:s")); ?></div> </p> <?php #ステートメントを用いてSQLを発行(うまくいかないので変数を埋め込む) $sql = 'SELECT l.id, a.username, l.subject, l.body, l.date, l.monospace '. 'FROM '.$bbs_target.' AS l, auth AS a '. 'WHERE a.id = l.user '. 'ORDER BY l.id DESC LIMIT :load_max'; $stmt = $db->prepare($sql); $stmt->bindParam(':load_max', $load_max, PDO::PARAM_INT); $flag = $stmt->execute(); if (!$flag) { $info = $stmt->errorInfo(); echo($info[2]); echo("\n読み込みに失敗しました。\n"); exit; } #データ読み込み、整形出力 echo("\n<!--記事-->\n"); while ($row = $stmt->fetch()) { echo("<div class=\"kiji\">\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 ' monospace'; } echo('">'.$row['body']."</p>\n</div>\n\n"); } ?> <hr /><div class="end">投稿は以上です。</div> </body></html>
5行目まではほかのページと同じような記述なので省略します。
7~9行目
表示する記事数をGETで指定されている場合はそれを取り込み、利用します。
12~17行目
他のスクリプトよりも見づらいのは、定期的に再読み込みするためできるだけファイルサイズを小さくしたいからです。改行も1文字分のデータですから(笑)。
指定された時間で自動的に再読み込みするため、時間と転送先のURLをPHPの変数から展開します。
metaタグの自動転送の書式は
content=”<転送までの時間(秒)>; url=<転送先URL>”
です。URLに自分自身のアドレスを指定することで自動更新になります。
18~21行目
自動更新をしていることと、最後に更新した時の時間を出力します。
24~36行目
SQLインジェクションを防ぐため、可能な限りステートメントを使ってSQLを作成します。テーブル名の指定には使えないようなので、そこだけは変数の値を直接代入します。
データベースから取得するものは処理速度向上・負荷軽減のため最小限にします。
ここではユーザー名、記事通し連番、件名、本文、投稿日時、固定幅フォントを使うかどうかを取得します。
記事を保存するテーブルにはユーザーIDが格納されているので、ユーザー名が保存されているauthテーブルを結合します。出力は最新のものを記事通し連番の降順に指定された件数だけにします。
一時的に変数$sqlに格納してあったSQL文のテンプレートを確定し、必要な所に必要なデータを埋め込みます。
最後にSQLを実行してエラーが発生したか確認します。
39~42行目
データベースから取得した記事データをHTMLに整形して出力します。このとき、デバッグ用にHTMLソースが読みやすいようにしてあります。
未処理のデータベース取得データがなくなると$row = $stmt->fetch()はFALSEを返すのでwhile文が終了します。
あとでスタイルシートを適用しやすいように、記事は1件ずつ<div>要素でまとめます。
記事1行目には、記事通し連番、件名、投稿者名、投稿日時を。その後本文を出力します。固定幅フォントを指定された記事は、本文をまとめる<p>要素のクラスにmonospaceを指定し、後でスタイルシートで固定幅フォントにします。
50~51行目
水平線と投稿の末尾を示すメッセージを出力して終わりです。
Posted in PHPで動く掲示板プログラム |