PHPプログラミング

ワークショップ

ひと言掲示板を作る(21)

投稿メッセージの削除ページを作る

「ひと言掲示板」に投稿されたメッセージを削除するページを実装します。

この記事のポイント

  • データの削除にはDELETE文を使う
  • フォームの要素にdisabled属性をつけると入力(編集)しないようにできる

目次

投稿されたメッセージを削除する

前回まで、ひと言掲示板に書き込まれた投稿を編集するためのページを作成してきました。
今回は投稿を削除するページを作っていきます。

管理ページで編集をクリック

削除ページでは削除するメッセージの内容を確認します。
ここで「削除」ボタンを押すとデータベースから投稿メッセージのデータが削除されます。

削除するメッセージを確認

削除が完了すると管理ページに戻り、先ほど削除したメッセージは非表示になります。

削除したメッセージは非表示になる

「ひと言掲示板を作る」の概要については「ひと言掲示板を作る」をご覧ください。
デモはこちら

前回までに作成したコードはこちら:Github

編集ページを複製して削除ページを作る

削除ページはPOSTパラメータの有無で「削除する投稿を確認」と「投稿の削除」を切り替えます。
このあたりは編集ページと同じ構造です。

削除ページの構造

そこで、編集ページである「edit.php」を複製して削除ページ「delete.php」を作成していきましょう。

複製したら早速「delete.php」を開き、elseif文のコードを1行目を除いて一旦削除してください。

コード例

<?php

// データベースの接続情報
define( 'DB_HOST', 'localhost');
define( 'DB_USER', 'root');
define( 'DB_PASS', 'password');
define( 'DB_NAME', 'board');

// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

// 変数の初期化
$message_id = null;
$mysqli = null;
$sql = null;
$res = null;
$error_message = array();
$message_data = array();

session_start();


if( empty($_SESSION['admin_login']) || $_SESSION['admin_login'] !== true ) {

    // ログインページへリダイレクト
	header("Location: ./admin.php");
}


if( !empty($_GET['message_id']) && empty($_POST['message_id']) ) {

	$message_id = (int)htmlspecialchars($_GET['message_id'], ENT_QUOTES);

	// データベースに接続
	$mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME);
	
	// 接続エラーの確認
	if( $mysqli->connect_errno ) {
		$error_message[] = 'データベースの接続に失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error;
	} else {
	
		// データの読み込み
		$sql = "SELECT * FROM message WHERE id = $message_id";
		$res = $mysqli->query($sql);
		
		if( $res ) {
			$message_data = $res->fetch_assoc();
		} else {
		
			// データが読み込めなかったら一覧に戻る
			header("Location: ./admin.php");
		}
		
		$mysqli->close();
	}

} elseif( !empty($_POST['message_id']) ) {

	$message_id = (int)htmlspecialchars( $_POST['message_id'], ENT_QUOTES);

	// ここのコードを一旦削除
}

?>

-- 省略 --

編集ページと同様に、POSTパラメータで投稿IDが渡された時に投稿削除を実行します。

削除した箇所に後ほど投稿を削除する処理を追記しますが、まずは先に削除を確認するためのHTMLを修正していきます。
次の赤字の箇所をそれぞれ修正&追記してください。

コード例

<?php

-- 省略 --

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>ひと言掲示板 管理ページ(投稿の削除)</title>
<style>

-- 省略 --

</style>
</head>
<body>
<h1>ひと言掲示板 管理ページ(投稿の削除)</h1>
<?php if( !empty($error_message) ): ?>
    <ul class="error_message">
		<?php foreach( $error_message as $value ): ?>
            <li>・<?php echo $value; ?></li>
		<?php endforeach; ?>
    </ul>
<?php endif; ?>
<p class="text-confirm">以下の投稿を削除します。<br>よろしければ「削除」ボタンを押してください。</p>
<form method="post">
    <div>
        <label for="view_name">表示名</label>
        <input id="view_name" type="text" name="view_name" value="<?php if( !empty($message_data['view_name']) ){ echo $message_data['view_name']; } ?>" disabled>
    </div>
    <div>
        <label for="message">ひと言メッセージ</label>
        <textarea id="message" name="message" disabled><?php if( !empty($message_data['message']) ){ echo $message_data['message']; } ?></textarea>
    </div>
    <a class="btn_cancel" href="admin.php">キャンセル</a>
    <input type="submit" name="btn_submit" value="削除">
    <input type="hidden" name="message_id" value="<?php echo $message_data['id']; ?>">
</form>
</body>
</html>

大きな修正点としては「以下の投稿を削除します。」というメッセージを追加したことと、フォームの表示名とメッセージにdisabled属性を追加した点です。
disabled属性はフォームを入力できないようにするための属性で、今回のように内容を確認することが目的になる場合に使用します。

追記した確認メッセージにためにCSSも追記しましょう。

コード例


-- 省略 --

.btn_cancel {
	display: inline-block;
	margin-right: 10px;
	padding: 10px 20px;
	color: #555;
	font-size: 86%;
	border-radius: 5px;
	border: 1px solid #999;
}
.btn_cancel:hover {
	color: #999;
	border-color: #999;
	text-decoration: none;
}

.text-confirm {
	margin-bottom: 20px;
	font-size: 86%;
	line-height: 1.6em;
}


/*-----------------------------------
掲示板エリア
-----------------------------------*/

-- 省略 --

ここで、一旦削除ページを表示してみましょう。
管理ページから好きな投稿を選んで「削除」をクリックしてください。

削除の確認ページが表示される

このように削除を確認するページが表示されたら、ここまでは成功です。

投稿を削除する処理を記述する

続いて、実際に投稿を削除する処理を実装していきましょう。

コード例


-- 省略 --

} elseif( !empty($_POST['message_id']) ) {

	$message_id = (int)htmlspecialchars( $_POST['message_id'], ENT_QUOTES);

	// データベースに接続
	$mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME);
	
	// 接続エラーの確認
	if( $mysqli->connect_errno ) {
		$error_message[] = 'データベースの接続に失敗しました。 エラー番号 ' . $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
	} else {
		$sql = "DELETE FROM message WHERE id = $message_id";
		$res = $mysqli->query($sql);
	}
	
	$mysqli->close();
	
	// 更新に成功したら一覧に戻る
	if( $res ) {
		header("Location: ./admin.php");
	}
}

-- 省略 --

データベースに接続する部分については今までと共通のため、解説は省略します。
正常に接続した後に、else文の中で削除するためのSQLを作成します。

DELETE文は削除したいデータを特定するために「テーブル名」とWHERE句を指定します。

$sql = "DELETE FROM message WHERE id = $message_id";
$res = $mysqli->query($sql);

データを更新するUPDATE文と比較すると、カラムの指定などが不要なためシンプルですね。
続いて、作成したSQLをqueryメソッドに渡して実行します。

実行結果は$resに代入し、値を確認してtrueであれば管理ページにリダイレクトして削除が完了します。

これで削除ページは完成です。
実際に削除が行えるか、管理ページからもう一度試してみてください。

次回は管理ページからログアウトする機能を実装していきます。

今回作成したコード:Github

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。