こんにちは、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上で参照・編集・削除・承認・返信ができるように組み立てていこう。
めだ吉
5つも機能があるんですね。大変そうです。
ねこふらい
うん。一気に作るには少し多いから、今回は承認・編集・削除だけ作ろう。
メダ太郎
頑張るぜ!

いよいよ投稿されたコメントを管理する、管理画面を作っていきます!

今回実装するのは以下の通り。

今回実装する機能
  • 投稿されたコメントを管理画面上に一覧として表示する『参照機能』
  • コメントを編集する『編集機能』
  • コメントを削除する『削除機能』

この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>こんにちは!&emsp;' . $_SESSION['email'] .'さん&emsp;<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の中身を見ていきましょう。

データベースへ接続するための定型文です。

前回・前々回と説明したため、解説は省略させていただきます。


ねこふらい
復習したい方は第1回目の記事を参考にしてくださいね。
com_tableから全てのデータの取得
$sql = 'SELECT * FROM com_table WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();

SQL文を実行します。

ここではcom_tableテーブルから、全てのデータを取得しています。


メダ太郎
SELECT文はデータを取得するための文だったな。
めだ吉
文末に「WHERE 1」をつけることで、全てのデータを取得しているんですね。
取得したコメントデータの出力
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文で繰り返し処理を強制的に中断させます。


ねこふらい
com_tableから抜き出すデータがなくなるまで、出力処理を行います。
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パラメータとして、リンク先のファイルの末尾に付与します。


めだ吉
どうしてURLパラメータにidをつけるんですか?
ねこふらい
URLパラメータとしてidを送ることで、どのデータを修正したいのか、削除したいのか区別するためだよ。詳しくは続くupdate.phpで説明するよ。
$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>こんにちは!&emsp;' . $_SESSION['email'] .'さん&emsp;<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>こんにちは!&emsp;' . $_SESSION['email'] .'さん&emsp;<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部分を見てみましょう。
<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属性を与えます。


ねこふらい
次にformの上にあるPHPを見てみよう。
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文はデータを修正するときに利用する構文です。

処理が正常に完了したらサクセスメッセージを定義します。


以上でupdate.phpは完成です。

実際に編集してみよう

update.phpができたら、実際に編集して見ましょう。

ちゃんと動作しましたか?

では最後にdelete.phpを作成しましょう!

delete.phpの作成

全体のコード
ねこふらい
delete.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>こんにちは!&emsp;' . $_SESSION['email'] .'さん&emsp;<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属性を与えます。


めだ吉
今回のフォームにはボタンしかないんですか?
ねこふらい
そう。delete.phpは削除ボタンが押されたらコメントを削除するという、とてもシンプルなプログラムなんだ。
不正アクセスを防ぐ・idデータを取得

ではPHP部分を見ていきましょう。

session_start();

session_regenerate_id(true);

//エラー処理
if(!isset($_SESSION['id'])){
    header('Location:login.php');
    exit();
} else {
    echo '<div class="top_bar"><p>こんにちは!&emsp;' . $_SESSION['email'] .'さん&emsp;<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文で削除します。


ねこふらい
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
ねこふらい
お疲れ様でした! 次回は残る『承認』『返信』機能を実装します。2018年11月28日に公開予定ですので、今しばらくお待ちください。


HOME > ふらこめ > WordPressのようなコメント管理システムを作ってみよう – 第3回