CMSを自作してオリジナル動的ホームページをフルスクラッチ開発⑦CMSのコメント返信、登録画面の作成
2021-07-22

今回は、コメント認証後の「コメント返信ページ」を作成します。
星マークが作成済みのページになります。今回は雲マークのページを作成します。
上の表のとおり、今回でCMSの作成は完了します。
コメント入力画面は公開用ページに設置しているので、そこから返信する事も可能ですが、いちいち認証の手順を踏まなければならないので、管理者からすれば面倒です。
したがって、「認証が不要」のコメント入力ページをCMSに設置することにします。
これで管理者のみが、認証をスルーしてコメントを返信する事が可能になります。
今回作成するコメント返信ページの流れとしては、
①認証したコメント一覧を表示させる。(コメント毎に返信済みであるか表示させる)
②未返信のコメントを選択後、返信コメントを入力
③本式テーブルに保存
となります。
認証コメントリスト画面
comment_list.php
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION["login"]) === false) {
print "ログインしていません。<br><br>";
print "<a href='set_login.php'>ログイン画面へ</a>";
exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>cms</title>
<link rel="stylesheet" href="../style.css">
</head>
<body>
<main>
<?php
try {
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$password = "";
$dbh = new PDO($dsn, $user, $password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM honcm WHERE1 ORDER BY code DESC";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["name"]) === true) {
print "まだコメントはありません。<br><br>";
print "<form>";
print "<input type='button' onclick='history.back()' value='戻る'>";
print "</form>";
exit();
}
print "コメント一覧<br><br>";
print $rec["title"]." に対するコメント<br>";
print $rec["time"];
print "<br>";
print $rec["name"];
print "<br>";
print $rec["honbun"];
print "<br>";
if(empty($rec["re"]) === true) {
print "<strong>未返信です</strong><br>";
print "<a href='comment_hensin.php?id=".$rec['id']."&code=".$rec['code']."&title=".$rec['title']."&honbun=".$rec['honbun']."'>";
print "返信する</a>";
} else {
print "<strong>返信済です</strong><br>";
}
print "<br><br>";
while(true) {
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["name"]) === true) {
break;
}
print $rec["title"]." に対するコメント<br>";
print $rec["time"];
print "<br>";
print $rec["name"];
print "<br>";
print $rec["honbun"];
print "<br>";
if(empty($rec["re"]) === true) {
print "<strong>未返信です</strong><br>";
print "<a href='comment_hensin.php?id=".$rec['id']."&code=".$rec['code']."&title=".$rec['title']."&honbun=".$rec['honbun']."'>";
print "返信する</a>";
} else {
print "<strong>返信済です</strong><br>";
}
print "<br><br>";
}
$dbh = null;
}
catch(Exception $e) {
print "サーバーに異常が発生しました。<br>";
print "<a href='set_top.php'>cmsトップへ</a>";
}
?>
<form>
<input type="button" onclick="history.back()" value="戻る">
</form>
</main>
</body>
</html>
settingディレクトリにcomment_list.phpを作成します。
このページは、認証したコメント一覧を表示させて(コメント毎に返信済みであるかも表示させる)、返信するコメントを選択できるようにしています。
コメント認証後に保存される「honcmテーブル」を参照し、データがなければ「コメントがありません」と表示させます。
データがあれば、一覧表示させています。
honcmテーブルのreカラムは、返信済かどうかの識別として使用しているので、今回の場合、空であれば「未返信」としています。
次ページへの値の送り方は、リンクを貼ってそこにパラメータとして乗っけています。
今回の場合ですと、選択した記事の識別として、記事のidであるrec[id]と、コメントの番号であるrec[code]を次ページへ送る仕組みにしています。
次ページでは、この値を元に、コメントに対しての返信が可能となります。
本来であれば、ここでこのページのテストをしたい所ですが、コメント入力は公開ページにあるのでまだ作成していません。コメント投稿~の手順を踏んでテストしたいので、今回はプログラムだけ作成しておいて、後ほど公開ページの作成に入った段階で、コメント返信のチェックを行いたいと思います。
それでは、次のページも、先に作成しておきます。
コメント返信入力画面
comment_hensin.php
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION["login"]) === false) {
print "ログインしていません。<br><br>";
print "<a href='set_login.php'>ログイン画面へ</a>";
exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>cms</title>
<link rel="stylesheet" href="../style.css">
</head>
<body>
<main>
<?php
$id = $_GET["id"];
$code = $_GET["code"];
$title = $_GET["title"];
$honbun = $_GET["honbun"];
print "下記コメントに対して返信します<br><br>";
print "記事タイトル:".strip_tags($title)."についてのコメント<br><br>";
print $honbun;
print "<br><br>";
print "<h3>コメントを返信</h3>";
print "<div class='comment'>";
print "<form action='comment_hensin_done.php' method='post'>";
print "<input type='text' name='name' value='管理人'><br>";
print "コメント<br>";
print "<textarea name='hensin'></textarea><br>";
print "<input type='hidden' name='id' value='".$id."'>";
print "<input type='hidden' name='code' value='".$code."'>";
print "<input type='submit' value='送信'>";
print "<input type='button' onclick='history.back()' value='戻る'>";
print "</form>";
print "</div>";
print "<br><br>";
?>
</main>
</body>
</html>
settingディレクトリにcomment_hensin.phpを作成します。
このページは、選択したコメントに対して、返信コメントを入力するページにます。
コメントの情報をGETで受け取り、formタグで返信コメントを入力します。
次ページへの値は、submitでpost送信しています。
返信コメント登録画面
comment_hensin_done.php
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION["login"]) === false) {
print "ログインしていません。<br><br>";
print "<a href='set_login.php'>ログイン画面へ</a>";
exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>cms</title>
<link rel="stylesheet" href="../style.css">
</head>
<body>
<?php
try {
require_once("../common/common.php");
$post = sanitize($_POST);
$name = $post["name"];
$hensin = $post["hensin"];
$id = $post["id"];
$code = $post["code"];
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$password = "";
$dbh = new PDO($dsn, $user, $password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "UPDATE honcm SET re=? WHERE id=? && code=?";
$stmt = $dbh -> prepare($sql);
$data[] = "OK";
$data[] = $id;
$data[] = $code;
$stmt -> execute($data);
$data = array();
$sql = "INSERT INTO honcm(name, honbun, id, re, time) VALUES(?,?,?,?,NOW())";
$stmt = $dbh -> prepare($sql);
$data[] = $name;
$data[] = $hensin;
$data[] = $id;
$data[] = "--";
$stmt -> execute($data);
$dbh = null;
}
catch(Exception $e) {
print "サーバーに異常が発生しました。<br>";
print "<a href='set_top.php'>cmsトップへ</a>";
}
?>
コメントを返信しました<br><br>
<a href="set_top.php">トップへ戻る</a>
</body>
</html>
settingディレクトリにcomment_hensin_done.phpを作成します。
このページは、返信コメントをデータベースに登録、また、返信するコメントに対して「返信済」のフラグを立てています。
postで返信先のコメント情報を受け取っているので、honcmテーブルの該当するコメントに、「返信済」のフラグを立てています。reカラムにOKの値を格納しているので、これで返信済みとなります。
続いて管理者の返信コメントを、honcmテーブルに追加しています。
これで、公開ページのコメントが投稿された記事に対して、管理者からの返信が反映されるようになっています。
7回に渡りましたが、今回でCMSの作成は完了となります。
次回以降、公開用ページの作成に入っていきます。
Wordpressでいうところの、「テーマ」にあたる部分ですね。
CMSでデータベースに登録した各内容を、公開用のページに反映させていくので、ここからが楽しくなると思います。