掲示板を作成しているのですが困ってます - PHPプロ!Q&A掲示板
掲示板を作成しており、盛り込みたい機能が3点あるのですが、参考書、サンプルスクリプトをいろいろと見て勉強しているのですがどうしても出来ずに困ってます。
1.投稿された内容に対しコメント(返信)機能を付けたいです。
PHPプロ!Q&A掲示板のように、投稿内容をクリックすると詳細に飛びコメントできるようにし、レスも表 記されるような形がベストです。
2.投稿した内容を削除キーを使って削除できるようにしたいです。
投稿した本人であればいつでも削除できるようにいしたいと思ってます。
記事番号等を選ぶのではなく、コメント横に削除ボタンがあれば良いと思ってます。
3.PHPプロ!Q&A掲示板のトップ画面のように、投稿内容にコメントが追記された場合はコメント数のような 形で表記したいです。
現在出来ているコードは、掲示板トップ画面、認証画面(ログイン・ログアウト)、新規投稿画面です。
全てPHPだけで組みたいと思ってます。
下にコードを表記いたします。
どなたかわかる方がいらっしゃいましたら、ご教授いただけないでしょうか。
よろしくお願いいたします。
①掲示板トップ
- // 掲示板の初期設定
- global $logfile;
- $logfile = "bbslog.txt"; //掲示板のログを記録するファイル
- // 削除や書き込みごと処理ごとに関数を実行する
- showLog();
- // ログの表示
- function showLog()
- {
- global $logfile;
- // HTMLヘッダの表示
- echo "<html><body><h1>コミュニティ掲示板へようこそ</h1><hr>";
- echo "<form action='http://localhost/bbstk.php'><input type='submit' name='toukou' value='新規投稿' /></form>";
- // ログがあれば読み込んで表示
- if (file_exists($logfile)) {
- // ファイルの内容(一行ずつ)を配列変数に読み込む
- $logs = file($logfile);
- $id = array_shift($logs); // データの一行目はID
- // ページ送りの処理
- $per_page = 5; // 1ページに発言をいくつ表示するか
- $page = intval($_GET["page"]);
- if ($page <= 0) { $page = 1; }
- $offset = ($page - 1) * $per_page;
- $count = count($logs);
- $logs = array_slice($logs, $offset, $per_page);
- echo "<p>";
- if ($page > 1) {
- $prev = $page - 1;
- echo "[<a href='?page=$prev'>←前へ</a>]";
- }
- if ($count > ($page * $per_page)) {
- $next = $page + 1;
- echo "[<a href='?page=$next'>次へ→</a>]";
- }
- echo "</p>";
- // ログの表示
- foreach ($logs as $line) {
- list($id,$name,$title,$main,$date) = split("\t", $line);
- echo ("
- <table cellpadding=\"8\" cellspacing=\"1\" border=\"1\" width=\"600\" align=\"center\">
- <tbody>
- <tr>
- <td valign=\"middle\" align=\"left\">
- ");
- echo "<p>$id:<b>$name</b> $date<br/><hr>\n";
- echo "<p>$title</p><hr>\n";
- echo "<blockquote>$main</blockquote></p>\n";
- echo ("
- </td>
- </tr>
- </tbody>
- </table>
- ");
- }
- }
- // フッタの表示
- echo "</body></html>";
- }
- require_once 'rogin.php';
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>新規投稿画面</title>
- </head>
- <body>
- <div>新規投稿画面</div>
- <p>
- echo htmlspecialchars($_SESSION['username'], ENT_QUOTES);
- さんいらっしゃい!
- </p>
- <p>ログインした方のみが投稿できます!</p>
- <p><a href="http://localhost/rogout.php">ログアウトする</a></p>
- // 掲示板の初期設定
- global $logfile;
- $logfile = "bbslog.txt"; //掲示板のログを記録するファイル
- // メインプログラム
- // 削除や書き込みごと処理ごとに関数を実行する
- $mode = $_POST["mode"];
- if ($mode == "write") { writeLog(); }
- if ($mode == "delete") { deleteLog(); }
- // 発言の書き込み
- function writeLog()
- {
- global $logfile;
- // 不正書き込みのチェック
- if (empty($_POST["name"])||empty($_POST["title"])||empty($_POST["main"])) { return; }
- // 既存のデータを読み込む
- if (file_exists($logfile)) {
- $logs = file($logfile);
- $id = intval(array_shift($logs)); // 一行目はID
- } else { // 初めての時
- $id = 0;
- $logs = array(); // 空の配列
- }
- // 今回の書き込みを配列にセット
- $id++;
- $name = $_POST["name"];
- $title = $_POST["title"];
- $main = $_POST["main"];
- $date = date("Y/m/d H:i");
- // HTML化する
- $name = htmlspecialchars($name);
- $title = htmlspecialchars($title);
- $main = htmlspecialchars($main);
- // 本文にある改行を<br/>に置換しておく
- $main = str_replace("\t", " ", $main);
- $main = str_replace("\n", "<br/>", $main);
- $main = str_replace("\r", "", $main);
- $main = preg_replace('#(http?://[a-zA-Z0-9\;\:\&\_\.\?\/\#\%\&\=\-\+\~\@]+)#',
- '<a href="$1">$1</a>', $main);
- $newdata = $id."\t".$name."\t".$title."\t".$main."\t".$date."\n";
- array_unshift($logs, $newdata);
- // ファイルへ保存
- array_unshift($logs, $id."\n");
- file_put_contents($logfile, $logs);
- }
- // 発言の削除
- function deleteLog()
- {
- global $logfile;
- // 不正書き込みのチェック
- if (empty($_POST["id"])) { return; }
- // ファイルがなければ何もしない
- if (!file_exists($logfile)) { return; }
- // ファイルの読み込み
- $logs = file($logfile);
- $last_id = array_shift($logs); // 一行目を退避
- $newlogs = array();
- foreach ($logs as $line) {
- list($id,$name,$title,$main,$date) = split("\t", $line);
- if ($id != $_POST["id"]) { array_push($newlogs, $line); }
- }
- // ファイルへ保存
- array_unshift($newlogs, $last_id);
- file_put_contents($logfile, $newlogs);
- }
- <form method="POST"><!-- 書き込みフォーム -->
- お名前:<input type='text' name='name' value="
- echo htmlspecialchars($_SESSION['username'], ENT_QUOTES);
- " size="40" /><br/>
- <div>カテゴリ</div>
- <input type="radio" name="general" value="general" />一般
- <input type="radio" name="design" value="design" />デザイン
- <input type="radio" name="prog" value="prog" />プログラミング
- <input type="radio" name="plan" value="plan" />企画・マネジメント
- <div>題名</div><input type='text' name='title' size='50' /><br/>
- <textarea name='main' rows='10' cols='50'></textarea><br/>
- <input type='hidden' name='mode' value='write'/>
- <input type='submit' value='投稿する'/>
- </form>
- <form action="http://localhost/bbstop.php">
- <input type="submit" name="reset" value="戻る" />
- </form>
- <form method="POST"><!-- 削除フォーム-->
- 削除するID:<input type='text' name='id' size='3'/>
- <input type='hidden' name='mode' value='delete'/>
- <input type='submit' value='削除'/>
- </form>
- </body>
- <html>
- session_start();
- # ユーザー名とパスワードを設定します。複数名分の設定ができます。
- $userid[] = 'admin'; // ユーザーID
- $password[] = 'pass1'; // パスワード
- $username[] = 'テスト'; // お名前
- $userid[] = 'test';
- $password[] = 'pass2';
- $username[] = 'テスト2';
- # エラーメッセージの変数を初期化します。
- $error = '';
- # 認証済みかどうかのセッション変数を初期化します。
- if (!isset($_SESSION['auth'])) {
- $_SESSION['auth'] = FALSE;
- }
- if (isset($_POST['userid']) && isset($_POST['password'])) {
- foreach ($userid as $key => $value) {
- if ($_POST['userid'] === $userid[$key] &&
- $_POST['password'] === $password[$key]) {
- // セッション固定化攻撃対策☆レシピ248☆
- $oldSid = session_id();
- session_regenerate_id(TRUE);
- if (version_compare(PHP_VERSION, '5.1.0', '<')) {
- $path = session_save_path() != '' ? session_save_path() : '/tmp';
- $oldSessionFile = $path . '/sess_' . $oldSid;
- if (file_exists($oldSessionFile)) {
- unlink($oldSessionFile);
- }
- }
- $_SESSION['auth'] = TRUE;
- $_SESSION['username'] = $username[$key];
- break;
- }
- }
- if ($_SESSION['auth'] === FALSE) {
- $error =
- '<font color="red">ユーザーIDかパスワードに誤りがあります。</font><br />';
- }
- }
- if ($_SESSION['auth'] !== TRUE) {
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <title>簡単なログインフォームを作成したい</title>
- </head>
- <body>
- <div id="login">
- <h1>認証フォーム</h1>
- echo $error;
- <form action="" method="post">
- <dl>
- <dt><label for="userid">ユーザーID:</label></dt>
- <dd><input type="text" name="userid" id="userid" value="" /></dd>
- </dl>
- <dl>
- <dt><label for="password">パスワード:</label></dt>
- <dd><input type="password" name="password" id="password" value="" /></dd>
- </dl>
- <input type="submit" name="submit" value="ログイン" />
- </form>
- </div>
- </body>
- </html>
- //スクリプトを終了し、認証が必要なページが表示されないようにします。
- exit();
- }
- /* ?>終了タグ省略) */
- session_start();
- //セッション変数をすべて削除します。
- $_SESSION = array();
- //セッションを破棄します。
- session_destroy();
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <title>ログアウト</title>
- </head>
- <body>
- <div id="mailbox">
- <p>ログアウトしました。</p>
- <p><a href="bbstop.php">戻る</a></p>
- </div>
- </body>
- </html>
この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。





ページのトップへ


今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!