こんにちは、MIO webデザインです。
前回・前々回に引き続き、今日も『WordPressのようなコメント管理システムを作ってみよう』と思います!
- 対象者
- PHPの基礎がわかる人
- phpMyAdminの使い方がわかる人
第1回目では、データベース情報を定義するdb_info.php・入力されたコメントをデータベースに保存するsave_comment.phpを。
第2回目では、コメントの操作を行うdashboard.php(未完成)・dashboard.phpにアクセスするためのlogin.php・dashboard.phpからログアウトするためのlogout.phpを作成しました。
今回は、前回未完成のまま終わったdashboard.phpに機能を追加して、投稿されたコメントの参照機能・編集機能・削除機能を作っていきます!
これから作っていくもの
はい。改めまして、簡易コメント管理システム『ふらこめ(necofly comment system)』制作シリーズ第3回です!
WordPressのコメント管理機能をイメージしてくれるとありがたいです。
『ふらこめ』で実装する機能は以下の通り。
- ふらこめで実装する機能
- コメントの受付
- 管理画面でのコメント管理
- コメントの承認・削除・編集・返信機能
- 管理画面へのログイン機能
- 新規管理アカウント取得機能
ざっとこんな感じです!
コメント欄からコメントを受け付けられるのはもちろんのこと、コメントの管理画面も欲しいところですね。
ただ見る人全員が好き勝手管理できたら大変なので、ログイン機能も設置。ついでに新規管理アカウント取得(サインアップ)機能も作ってしまいましょう。

最終的には下記のようなファイル構造になります。
hura_come
├── admin
│ ├── dashboard.php
│ ├── delete.php
│ ├── display.php
│ ├── login.php
│ ├── logout.php
│ ├── reply.php
│ ├── signup.php
│ └── update.php
├── css
│ └── style.css
├── db_info
│ └── db_info.php
├── images
│ └── logo.jpg
└── save_comment.php
では早速作っていきましょう!
今回作るもの – 『コメント管理画面』
第3回目となる今回は、いよいよコメントの管理画面を作っていきます。前回作ったdashboard.php上で参照・編集・削除・承認・返信ができるように組み立てましょう。

いよいよ投稿されたコメントを管理する、管理画面を作っていきます!
今回実装するのは以下の通り。
- 今回実装する機能
- 投稿されたコメントを管理画面上に一覧として表示する『参照機能』
- コメントを編集する『編集機能』
- コメントを削除する『削除機能』
この3つです。
参照機能はdashboard.php上で行うため、新たに用意するファイルは2つ。『update.php』と『delete.php』です。
下記を参考に2つのファイルを配置しましょう。
hura_come
├── admin
│ ├── dashboard.php
│ ├── delete.php
│ ├── login.php
│ ├── logout.php
│ └── update.php
├── css
│ └── style.css
├── db_info
│ └── db_info.php
└── save_comment.php
では早速参照機能から実装していきましょう!
dashboard.phpを編集
全体のコード
前回作成したdashboard.phpを編集して、参照機能を実装します。

<?php
session_start();
session_regenerate_id(true);
//エラー処理
if(!isset($_SESSION['id'])){
header('Location:login.php');
exit();
} else {
echo '<div class="top_bar"><p>こんにちは! ' . $_SESSION['email'] .'さん <a href="logout.php" class="logout_button">ログアウト</a></p></div>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ダッシュボード</title>
<meta name="viewport" content="width=1000">
<meta name="robots" content="noindex,nofollow">
<link rel="stylesheet" type="text/css" href="../css/style.css">
</head>
<body>
<section class="wrap">
<h1>コメント一覧</h1>
<table class="db_table">
<thead>
<tr><th>名前</th><th>コメント</th><th>メールアドレス</th><th>操作</th></tr>
</thead>
<tbody>
<?php
require '../db_info/db_info.php';
//データベース接続
$dbh = new PDO(
'mysql:host=' . $host . '; dbname=' . $db_name . '; charset=utf8',
$user,
$pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
)
);
//sql
$sql = 'SELECT * FROM com_table WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
//すべてのコメントを表示
while(true){
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row == false){
break;
}
echo '<tr><td>' . $row['name'] . '</td><td>' . $row['comment'] . '</td><td>' . $row['email'] . '</td><td><a href="update.php?id=' . $row['id'] .'">編集</a>/<a href="delete.php?id=' . $row['id'] .'">削除</a>/<a href="display.php?id=' . $row['id'] .'">承認</a>/<a href="reply.php?id=' . $row['id'] .'">返信</a></td></tr>';
}
//データベース接続解除
$dbh = null;
?>
</tbody>
</table>
</section>
</body>
</html>
h1タグの下に、新たにコードを追加したのがわかりますね。
<table class="db_table">
<thead>
<tr><th>名前</th><th>コメント</th><th>メールアドレス</th><th>操作</th></tr>
</thead>
<tbody>
<?php
require '../db_info/db_info.php';
//データベース接続
$dbh = new PDO(
'mysql:host=' . $host . '; dbname=' . $db_name . '; charset=utf8',
$user,
$pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
)
);
//sql
$sql = 'SELECT * FROM com_table WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
//すべてのコメントを表示
while(true){
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row == false){
break;
}
echo '<tr><td>' . $row['name'] . '</td><td>' . $row['comment'] . '</td><td>' . $row['email'] . '</td><td><a href="update.php?id=' . $row['id'] .'">編集</a>/<a href="delete.php?id=' . $row['id'] .'">削除</a>/<a href="display.php?id=' . $row['id'] .'">承認</a>/<a href="reply.php?id=' . $row['id'] .'">返信</a></td></tr>';
}
//データベース接続解除
$dbh = null;
?>
</tbody>
</table>
コメントを一覧表示する時は『名前』『コメント』『メールアドレス』『操作』という項目が欲しかったので、出力する際にtableタグを使用させていただきました。
このように、コメントの一覧を表形式で表示させます。

では新しく追加したコードを詳しく見ていきましょう。
tableタグで表を作成
<table class="db_table">
<thead>
<tr><th>名前</th><th>コメント</th><th>メールアドレス</th><th>操作</th></tr>
</thead>
<tbody>
//中略
</tbody>
</table>
コメント一覧を表形式で表示させたいので、まずはtableタグを記述します。
コメントの出力は、tbodyタグ内で行います。
データベースへ接続
require '../db_info/db_info.php';
//データベース接続
$dbh = new PDO(
'mysql:host=' . $host . '; dbname=' . $db_name . '; charset=utf8',
$user,
$pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
)
);
tbodyの中身を見ていきましょう。
データベースへ接続するための定型文です。
前回・前々回と説明したため、解説は省略させていただきます。

com_tableから全てのデータの取得
$sql = 'SELECT * FROM com_table WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
SQL文を実行します。
ここではcom_tableテーブルから、全てのデータを取得しています。

取得したコメントデータの出力
while(true){
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row == false){
break;
}
echo '<tr><td>' . $row['name'] . '</td><td>' . $row['comment'] . '</td><td>' . $row['email'] . '</td><td><a href="update.php?id=' . $row['id'] .'">編集</a>/<a href="delete.php?id=' . $row['id'] .'">削除</a>/<a href="display.php?id=' . $row['id'] .'">承認</a>/<a href="reply.php?id=' . $row['id'] .'">返信</a></td></tr>';
}
com_tableから全てのデータを取得できたら、いよいよ出力処理です。
プログラムを簡単にするために、ここでは繰り返し処理のwhile文を使用しています。
- while文とは?
- while文は繰り返し同じ処理を行う時に使用する
- 通常は繰り返し条件を指定するが、ここではtrueを引数に渡して、意図的に無限ループを行わせている

$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row == false){
break;
}
ここで無限ループから抜け出す条件を指定しています。
com_tableにある全てのデータを抜き出し尽くしたら、break文で繰り返し処理を強制的に中断させます。

echo '<tr><td>' . $row['name'] . '</td><td>' . $row['comment'] . '</td><td>' . $row['email'] . '</td><td><a href="update.php?id=' . $row['id'] .'">編集</a>/<a href="delete.php?id=' . $row['id'] .'">削除</a>/<a href="display.php?id=' . $row['id'] .'">承認</a>/<a href="reply.php?id=' . $row['id'] .'">返信</a></td></tr>';
コードで見るとわかりづらいですが、実際には下記の画像のように出力させています。

$row[‘name’]が投稿者の名前・$row[‘comment’]が実際に投稿されたコメント・$row[‘email’]が投稿者のメールアドレスです。
続いて『編集/削除/承認/返信』とコメント管理のボタン(アンカーリンク)を用意しています。これらの操作は別のファイル上で行います。
- 各種操作の実行ファイル
- 編集はupdate.php
- 削除はdelete.php
- 承認はdisplay.php
- 返信はreply.php
ここで、hrefの指定先に注目してください。
<a href=“update.php?id=' . $row['id'] .'">編集</a>
このように記述しています。
$row[‘id’]は、そのコメントデータのid番号です。この値をURLパラメータとして、リンク先のファイルの末尾に付与します。

$dbh = null;
最後にデータベースへの接続を解除したら、dashboard.phpは完成です!
実際にブラウザで確認して、下図のようになっているか確認しましょう。

update.phpの作成
全体のコード
次に、コメントを編集するupdate.phpを作っていきましょう。

では、全体のコードを見てみましょう。
<?php
session_start();
session_regenerate_id(true);
//エラー処理
if(!isset($_SESSION['id'])){
header('Location:login.php');
exit();
} else {
echo '<div class="top_bar"><p>こんにちは! ' . $_SESSION['email'] .'さん <a href="logout.php" class="logout_button">ログアウト</a></p></div>';
}
require '../db_info/db_info.php';
//idを取得
$comment_id = $_GET['id'];
try{
$dbh = new PDO(
'mysql:host=' . $host . '; dbname=' . $db_name . '; charset=utf8',
$user,
$pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
)
);
}catch(PDOException $e){
echo '<div class="server_error">現在サーバーエラーが発生しています。</div>';
}
if($_SERVER['REQUEST_METHOD'] === 'POST'){
//メッセージの初期化
$error = '';
$success = '';
if(empty($_POST['comment'])){
$error = 'コメントが入力されていません。';
} elseif(strlen($_POST['comment']) > 1000){
$error = 'コメントは1000文字以内でご記入ください。';
} else {
$comment = htmlspecialchars( $_POST['comment'] ,ENT_QUOTES, 'UTF-8');
try{
//SQL操作
$sql = 'UPDATE com_table SET comment=? WHERE id = ?';
$data[] = $comment;
$data[] = $comment_id;
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
$success = 'コメントを編集しました。';
}catch(PDOException $e){
echo '<div class="server_error">現在サーバーエラーが発生しています。</div>';
}
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コメント編集ページ</title>
<meta name="viewport" content="width=1000">
<meta name="robots" content="noindex,nofollow">
<link rel="stylesheet" type="text/css" href="../css/style.css">
</head>
<body>
<section class="wrap ww">
<?php
if(isset($error)){
echo '<ul class="error"><li>' . $error . '</li></ul>';
}
if(isset($success)){
echo '<ul class="success"><li>' . $success . '</li></ul>';
}
//現在のコメントを取得
$check_sql = 'SELECT comment FROM com_table WHERE id = ?';
$check_data[] = $comment_id;
$check_stmt = $dbh->prepare($check_sql);
$check_stmt->execute($check_data);
$row = $check_stmt->fetch(PDO::FETCH_ASSOC);
$now_com = $row['comment'];
//接続解除
$dbh = null;
?>
<form action="update.php?id=<?php echo $comment_id; ?>" method="post" class="comment_form">
<label>コメント</label>
<textarea name="comment"><?php echo $now_com; ?></textarea>
<input type="submit" name="submit" value="編集">
</form>
<a href="dashboard.php" class="go_home">戻る</a>
</section>
</body>
</html>
update.phpは下記のように配置してください。
hura_come
├── admin
│ ├── dashboard.php
│ ├── login.php
│ ├── logout.php
│ └── update.php
├── css
│ └── style.css
├── db_info
│ └── db_info.php
└── save_comment.php
では細かく見ていきましょう。
不正アクセスを防ぐ
session_start();
session_regenerate_id(true);
//エラー処理
if(!isset($_SESSION['id'])){
header('Location:login.php');
exit();
} else {
echo '<div class="top_bar"><p>こんにちは! ' . $_SESSION['email'] .'さん <a href="logout.php" class="logout_button">ログアウト</a></p></div>';
}
dashboard.phpと同様、外部からの不正アクセスを防がなくてはなりません。
前回と同じように、セッションを使ってログインユーザー以外アクセスできないようにしてしまいましょう。
- このコードで行なっていること
- セッションの開始
- セッションIDの新規発行
- $_SESSION[‘id’]が値を持たない(ログインしていない)場合、login.phpに強制リダイレクト
編集したいコメントのidデータを取得
$comment_id = $_GET['id'];
$_GETを使い、編集したいデータのidを取得しています。
dashboard.phpのこちらのコードを思い出してください。
<a href=“update.php?id=' . $row['id'] .'">編集</a>
編集画面に移動する時、URLパラメータとしてデータのidを付与しました。GETでリクエストしたのです。

どのコメントを編集するか識別するためにidを使用するので、取得して変数comment_idに格納しましょう。
データベースへ接続
try{
$dbh = new PDO(
'mysql:host=' . $host . '; dbname=' . $db_name . '; charset=utf8',
$user,
$pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
)
);
}catch(PDOException $e){
echo '<div class="server_error">現在サーバーエラーが発生しています。</div>';
}
まずはデータベースに接続に接続。例外処理も忘れないようにしましょう。
HTMLの記述
ここで一旦HTMLに移ります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コメント編集ページ</title>
<meta name="viewport" content="width=1000">
<meta name="robots" content="noindex,nofollow">
<link rel="stylesheet" type="text/css" href="../css/style.css">
</head>
<body>
<section class="wrap ww">
<?php
if(isset($error)){
echo '<ul class="error"><li>' . $error . '</li></ul>';
}
if(isset($success)){
echo '<ul class="success"><li>' . $success . '</li></ul>';
}
//現在のコメントを取得
$check_sql = 'SELECT comment FROM com_table WHERE id = ?';
$check_data[] = $comment_id;
$check_stmt = $dbh->prepare($check_sql);
$check_stmt->execute($check_data);
$row = $check_stmt->fetch(PDO::FETCH_ASSOC);
$now_com = $row['comment'];
//接続解除
$dbh = null;
?>
<form action="update.php?id=<?php echo $comment_id; ?>" method="post" class="comment_form">
<label>コメント</label>
<textarea name="comment"><?php echo $now_com; ?></textarea>
<input type="submit" name="submit" value="編集">
</form>
<a href="dashboard.php" class="go_home">戻る</a>
</section>
</body>
</html>

<form action="update.php?id=<?php echo $comment_id; ?>" method="post" class="comment_form">
<label>コメント</label>
<textarea name="comment"><?php echo $now_com; ?></textarea>
<input type="submit" name="submit" value="編集">
</form>
同一ファイル内で処理を行うので、データの受け渡し先はupdate.phpです。ただし、URLパラメータとしてidを付与するのを忘れてはいけません。
コメント入力欄にはcommentと、name属性を与えます。

if(isset($error)){
echo '<ul class="error"><li>' . $error . '</li></ul>';
}
if(isset($success)){
echo '<ul class="success"><li>' . $success . '</li></ul>';
}
これはsave_comment.phpでも見た、エラーメッセージ・サクセスメッセージを表示させるプログラムです。
今回も入力欄があるので、入力値のチェックを行います。それに引っかかったらエラーメッセージ・無事に編集ができたらサクセスメッセージが表示されるようにしておきましょう。

$check_sql = 'SELECT comment FROM com_table WHERE id = ?';
$check_data[] = $comment_id;
$check_stmt = $dbh->prepare($check_sql);
$check_stmt->execute($check_data);
$row = $check_stmt->fetch(PDO::FETCH_ASSOC);
$now_com = $row['comment'];
URLパラメータとして渡したidを利用して、SELECT文でコメントを取得します。取得したら、そのコメントをnow_com変数に格納します。


だからtextareaタグ内にPHPコードがあったんですね。
<textarea name="comment"><?php echo $now_com; ?></textarea>
別にこのプログラムがなくても編集自体はできますが、ユーザーの利便性を考えると、テキストエリアに現在のコメントが表示されていた方が編集が楽でしょう。
メッセージの初期化と入力値のチェック
ではPHP部分に戻りましょう。
データベースに接続した直後の処理です。
if($_SERVER['REQUEST_METHOD'] === 'POST'){
//メッセージの初期化
$error = '';
$success = '';
if(empty($_POST['comment'])){
$error = 'コメントが入力されていません。';
} elseif(strlen($_POST['comment']) > 1000){
$error = 'コメントは1000文字以内でご記入ください。';
} else {
$comment = htmlspecialchars( $_POST['comment'] ,ENT_QUOTES, 'UTF-8');
//中略
}
}
コメントが編集され、編集ボタンが押されたら処理を実行します。
前回・前々回とやったことは同じなので、簡単に説明させていただきます。
- このコードで行なっていること
- メッセージの初期化
- 入力値のチェック
- 入力内容に誤りがなければ、コメントをエスケープ処理し、変数commentに格納
新しいコメントデータに上書き
try{
//SQL操作
$sql = 'UPDATE com_table SET comment=? WHERE id = ?';
$data[] = $comment;
$data[] = $comment_id;
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
$success = 'コメントを編集しました。';
}catch(PDOException $e){
echo '<div class="server_error">現在サーバーエラーが発生しています。</div>';
}
最後にidを利用し、UPDATE文でコメントを編集します。

処理が正常に完了したらサクセスメッセージを定義します。
以上でupdate.phpは完成です。
実際に編集してみよう
update.phpができたら、実際に編集して見ましょう。

ちゃんと動作しましたか?
では最後にdelete.phpを作成しましょう!
delete.phpの作成
全体のコード

<?php
session_start();
session_regenerate_id(true);
//エラー処理
if(!isset($_SESSION['id'])){
header('Location:login.php');
exit();
} else {
echo '<div class="top_bar"><p>こんにちは! ' . $_SESSION['email'] .'さん <a href="logout.php" class="logout_button">ログアウト</a></p></div>';
}
require '../db_info/db_info.php';
//idを取得
$comment_id = $_GET['id'];
if(isset($_POST["delete"])){
try{
//データベース接続
$dbh = new PDO(
'mysql:host=' . $host . '; dbname=' . $db_name . '; charset=utf8',
$user,
$pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
)
);
//SQL操作
$sql = 'DELETE FROM com_table WHERE id = ?';
$data[] = $comment_id;
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
//接続解除
$dbh = null;
header('Location:dashboard.php');
exit();
}catch(PDOException $e){
echo '<div class="server_error">現在サーバーエラーが発生しています。</div>';
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コメント削除ページ</title>
<meta name="viewport" content="width=1000">
<meta name="robots" content="noindex,nofollow">
<link rel="stylesheet" type="text/css" href="../css/style.css">
</head>
<body>
<section class="wrap ww">
<form action="delete.php?id=<?php echo $comment_id; ?>" method="post" class="comment_form">
<label>コメントを削除しますか?</label>
<input type="submit" name="delete" value="削除する">
</form>
<a href="dashboard.php" class="go_home">戻る</a>
</section>
</body>
</html>
delete.phpは下記のように配置してください。
hura_come
├── admin
│ ├── dashboard.php
│ ├── delete.php
│ ├── login.php
│ ├── logout.php
│ └── update.php
├── css
│ └── style.css
├── db_info
│ └── db_info.php
└── save_comment.php
では細分化して見ていきましょう。
HTML部分
まずはHTML部分です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コメント削除ページ</title>
<meta name="viewport" content="width=1000">
<meta name="robots" content="noindex,nofollow">
<link rel="stylesheet" type="text/css" href="../css/style.css">
</head>
<body>
<section class="wrap ww">
<form action="delete.php?id=<?php echo $comment_id; ?>" method="post" class="comment_form">
<label>コメントを削除しますか?</label>
<input type="submit" name="delete" value="削除する">
</form>
<a href="dashboard.php" class="go_home">戻る</a>
</section>
</body>
</html>
色々書いていますが、重要なのはform部分です。
<form action="delete.php?id=<?php echo $comment_id; ?>" method="post" class="comment_form">
<label>コメントを削除しますか?</label>
<input type="submit" name="delete" value="削除する">
</form>
同一ファイル内で処理を行うので、データの受け渡し先はdelete.phpです。ただし、URLパラメータとしてidを付与するのを忘れてはいけません。
submitボタンにはdeleteと、name属性を与えます。

不正アクセスを防ぐ・idデータを取得
ではPHP部分を見ていきましょう。
session_start();
session_regenerate_id(true);
//エラー処理
if(!isset($_SESSION['id'])){
header('Location:login.php');
exit();
} else {
echo '<div class="top_bar"><p>こんにちは! ' . $_SESSION['email'] .'さん <a href="logout.php" class="logout_button">ログアウト</a></p></div>';
}
require '../db_info/db_info.php';
//idを取得
$comment_id = $_GET['id'];
ここまではupdate.phpと全く同じなので、説明を割愛させていただきます。
コメントを削除する
if(isset($_POST["delete"])){
try{
//データベース接続
$dbh = new PDO(
'mysql:host=' . $host . '; dbname=' . $db_name . '; charset=utf8',
$user,
$pass,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
)
);
//SQL操作
$sql = 'DELETE FROM com_table WHERE id = ?';
$data[] = $comment_id;
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
//接続解除
$dbh = null;
header('Location:dashboard.php');
exit();
}catch(PDOException $e){
echo '<div class="server_error">現在サーバーエラーが発生しています。</div>';
}
}
deleteに値があったら、つまり削除ボタンが押されたら処理を実行します。
try~catch文で例外処理を定義し、データベースへと接続します。
$sql = 'DELETE FROM com_table WHERE id = ?';
$data[] = $comment_id;
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
データベースに接続できたら、idを使って削除するデータを特定し、DELETE文で削除します。

削除が完了したらデータベース接続を解除し、dashboard.phpへリダイレクトして処理を終了します。
以上でdelete.phpは完成です。
実際にコメントを削除してみよう
delete.phpができたら、実際にコメントを削除してみましょう。

まとめ
今回作成したのは、dashboard.php・update.php・delete.phpです。
ここまで制作したら、下記のようなツリー構造になっていると思います。
hura_come
├── admin
│ ├── dashboard.php
│ ├── delete.php
│ ├── login.php
│ ├── logout.php
│ └── update.php
├── css
│ └── style.css
├── db_info
│ └── db_info.php
└── save_comment.php
