PHPプログラミング

最終更新日:
公開日:

ワークショップ

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

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

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

この記事のポイント

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

目次

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

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

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

削除ページでは確認のため、削除しようとしているメッセージの内容を表示します。
ここで「削除」ボタンを押すとデータベースから投稿メッセージのデータを削除します。

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

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

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

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

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

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

削除ページはPOSTパラメータの有無で「投稿の表示」と「投稿の削除」を切り替えます。
切り替える仕組みは編集ページと同じものを使っていきます。

削除ページの構造

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

複製したら早速「delete.php」を開き、elseif文の内側にあるコードを削除してください。

delete.php

<?php

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

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

// 変数の初期化
$view_name = null;
$message = array();
$message_data = null;
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;

session_start();

// 管理者としてログインしているか確認
if( empty($_SESSION['admin_login']) || $_SESSION['admin_login'] !== true ) {

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

// データベースに接続
try {

  $option = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_MULTI_STATEMENTS => false
  );
  $pdo = new PDO('mysql:charset=UTF8;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);

} catch(PDOException $e) {

  // 接続エラーのときエラー内容を取得する
  $error_message[] = $e->getMessage();
}

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

  // SQL作成
  $stmt = $pdo->prepare("SELECT * FROM message WHERE id = :id");

  // 値をセット
  $stmt->bindValue( ':id', $_GET['message_id'], PDO::PARAM_INT);

  // SQLクエリの実行
  $stmt->execute();

  // 表示するデータを取得
  $message_data = $stmt->fetch();

  // 投稿データが取得できないときは管理ページに戻る
  if( empty($message_data) ) {
    header("Location: ./admin.php");
    exit;
  }

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

////////////////////////////////
// elseif文の中のコードを全て削除
////////////////////////////////

}

// データベースの接続を閉じる
$stmt = null;
$pdo = null;

?>
<!DOCTYPE html>
<html lang="ja">

---- 省略 ----

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

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

delete.php

<?php

---- 省略 ----

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

---- 省略 ----

<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']; } elseif( !empty($view_name) ){ echo htmlspecialchars( $view_name, ENT_QUOTES, 'UTF-8'); } ?>" disabled>
  </div>
  <div>
    <label for="message">ひと言メッセージ</label>
    <textarea id="message" name="message" disabled><?php if( !empty($message_data['message']) ){ echo $message_data['message']; } elseif( !empty($message) ){ echo htmlspecialchars( $message, ENT_QUOTES, 'UTF-8'); } ?></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 if( !empty($message_data['id']) ){ echo $message_data['id']; } elseif( !empty($_POST['message_id']) ){ echo htmlspecialchars( $_POST['message_id'], ENT_QUOTES, 'UTF-8'); } ?>">
</form>
</body>
</html>

修正点は以下の3点です。

  • 見出しを「編集」から「削除」に変更
  • 「以下の投稿を削除します。」という文言をp要素で追加
  • フォームの表示名とメッセージにdisabled属性を追加

disabled属性はフォームを入力できないようにするための属性で、今回のように内容を確認することだけが目的になる場合に使用します。

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

delete.php

---- 省略 ----

.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;
}


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

---- 省略 ----

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

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

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

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

続いて、投稿の削除を実装していきましょう。

delete.php

<?php

---- 省略 ----

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

  // トランザクション開始
  $pdo->beginTransaction();

  try {

    // SQL作成
    $stmt = $pdo->prepare("DELETE FROM message WHERE id = :id");

    // 値をセット
    $stmt->bindValue( ':id', $_POST['message_id'], PDO::PARAM_INT);

    // SQLクエリの実行
    $stmt->execute();

    // コミット
    $res = $pdo->commit();

  } catch(Exception $e) {

    // エラーが発生した時はロールバック
    $pdo->rollBack();
  }

  // 削除に成功したら一覧に戻る
  if( $res ) {
    header("Location: ./admin.php");
    exit;
  }
}

// データベースの接続を閉じる
$stmt = null;
$pdo = null;

---- 省略 ----

PDOのプリペアドステートメントとトランザクションを使って処理する流れは編集のときと共通する部分が多いですが、データの削除ではSQLのDELETE文を使います。
DELETE文では削除したいデータを特定するために「テーブル名」とWHERE句を指定します。

delete.php

$stmt = $pdo->prepare("DELETE FROM message WHERE id = :id");

データを更新するUPDATE文と比較すると、カラムの指定などが不要なためシンプルになります。
commitメソッドで実行した返り値を$resに入れ、すぐ後にあるif文で返り値を確認してtrueであれば管理ページにリダイレクトして削除が完了します。

これで削除ページは完成です。
実際に削除が行えるか、ブラウザで管理ページadmin.phpを開いて削除する投稿を選択するところから試してみてください。

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

今回作成したコード:Github

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

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

コメントありがとうございます!
運営の参考にさせていただきます。