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

今回はCMSのコメント認証、登録可否画面を作成します。
星マークが作成済みのページです。今回は雲マークのページを作成します。
後で作成する公開ページには、投稿記事の下部にコメント欄を設けています。↓
ここにコメントされた内容を、一旦保留して、コメント確認後に記事に反映するかしないかを実行できるシステムにします。
Wordpressでは、コメントが投稿された際、下記のような流れとなっていますよね。
コメント投稿 ⇒ 管理者にmailが届く ⇒ mailから認証の可否、返信も可
これと同じような仕組みにしてみます。
厳密な流れとしては、
コメント投稿(仮のテーブルに保管) ⇒ 管理者にmailが届く ⇒ mailに記載されたコメントを確認し、貼られているcmsへのリンクへ飛ぶ ⇒ cmsログイン ⇒ コメント認証画面で認証の可否を行う(可の場合、本式テーブルに保管) ⇒ 認証すれば記事に反映
こんな感じです。
つまり、投稿されたコメントは、本式のテーブルに保存されれば記事に反映される仕組みです。
コメント投稿画面は、公開用のページで作成しますが、仮テーブルはこの回で作成しておこうと思います。
では、初めにテーブルを作成します。
テーブルの作成
karicm(コメントの仮テーブル)
データベース名「test」に「karicm」テーブルを作成します。
カラムは6とし、詳細は下記のとおりです。
| 名前 | データ型 | その他 |
| code | int | AI |
| name | varchar 値50 | - |
| honbun | varchar 値500 | - |
| id | int | - |
| title | varchar 値100 | - |
| time | date | - |
honcm(コメントの本式テーブル)
データベース名「test」に「honcm」テーブルを作成します。
カラムは7とし、詳細は下記のとおりです。
| 名前 | データ型 | その他 |
| code | int | AI |
| name | varchar 値50 | - |
| honbun | varchar 値500 | - |
| re | varchar 値10 | - |
| id | int | - |
| title | varchar 値100 | - |
| time | date | - |
コメント認証チェック画面
comment_check.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 {
$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 karicm WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["name"]) === true) {
print "認証待ちのコメントはありません。<br><br>";
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><br>";
print "<a href='comment_done.php?id=".$rec['id']."&code=".$rec['code']."'>";
print "認証する</a>";
print "<br><br>";
print "<a href='comment_done.php?id=".$rec['id']."&code=".$rec['code']."&flag=1'>";
print "削除する</a>";
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><br>";
print "<a href='comment_done.php?id=".$rec['id']."&code=".$rec['code']."'>";
print "認証する</a>";
print "<br><br>";
print "<a href='comment_done.php?id=".$rec['id']."&code=".$rec['code']."&flag=1'>";
print "削除する</a>";
print "<br><br>";
}
$dbh = null;
}
catch(Excption $e) {
print "サーバーに異常が発生しました。<br>";
print "<a href='set_top.php'>cmsトップへ</a>";
}
?>
<form>
<input type="button" onclick="history.back()" value="戻る">
</form>
</body>
</html>
settingディレクトリ配下にcomment_check.phpを作成します。
このページでは、仮テーブルに保存されているコメント認証待ちの一覧を表示させて、認証の可否を選択出来るようにしています。
仮テーブルが空なら、コメントはありませんと表示させます。
コメントが有りの場合、一覧表示をさせて、それぞれに「認証」と「削除」のリンクを貼っています。
リンクがどちらも次ページのcomment_done.phpになっていますが、付与した「flag」のパラメータで認証と削除の仕分けが出来るようにしています。
idは記事のidを示しており、codeは仮テーブルのプライマリkeyを示しています。
つまり、この2つの情報があれば、どの記事の何番目にコメント投稿されたかが判別できます。
本来であれば、ここで認証のテストをしたい所ですが、コメント入力は公開ページにあるのでまだ作成していません。前途したように、コメント投稿~の手順を踏んでテストしたいので、今回はプログラムだけ作成しておいて、後ほど公開ページの作成に入った段階で、コメント認証のチェックを行いたいと思います。
それでは、コメント可否の実行ページも、先に作成しておきます。
コメント登録可否実行画面
comment_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 {
$code = $_GET["code"];
$id = $_GET["id"];
$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);
if(isset($_GET["flag"]) === true) {
$sql = "DELETE FROM karicm WHERE id=? && code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $id;
$data[] = $code;
$stmt -> execute($data);
$dbh = null;
print "コメントを削除しました<br><br>";
print "<a href='set_top.php'>TOPへ戻る</a>";
exit();
}
$sql = "SELECT * FROM karicm WHERE id=? && code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $id;
$data[] = $code;
$stmt -> execute($data);
$data = array();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$name = $rec["name"];
$honbun = $rec["honbun"];
$title = $rec["title"];
$time = $rec["time"];
$sql = "INSERT INTO honcm(name, honbun, id, title, time) VALUES(?,?,?,?,?)";
$stmt = $dbh -> prepare($sql);
$data[] = $name;
$data[] = $honbun;
$data[] = $id;
$data[] = $title;
$data[] = $time;
$stmt -> execute($data);
$data = array();
$sql = "DELETE FROM karicm WHERE id=? && code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $id;
$data[] = $code;
$stmt -> execute($data);
$dbh = null;
print "コメントを認証しました。<br><br>";
print "<a href='set_top.php'>TOPへ戻る</a>";
}
catch(Excption $e) {
print "サーバーに異常が発生しました。<br>";
print "<a href='set_top.php'>cmsトップへ</a>";
}
?>
</body>
</html>
settingディレクトリ配下にcomment_done.phpを作成します。
このページでは、コメントの認証を実行(本式テーブルにコメントを移行)および、コメントの非認証(仮テーブルから削除)を行っています。
パラメータ「flag」に値が入っていれば非認証となるので、前ページで選択したコメントは削除されます。
認証の場合は、まず仮テーブルからidとコードでコメント情報を取り出します。
それを本式テーブルに追加後、仮テーブルのコメントは消去しておきます。消さなければ、認証待ちとして残るためですね。
次回は、認証したコメントに対して、管理者として返信するページを作成します。