PHPコース、いよいよ最終回です。
前回作った掲示板に、間違えて投稿したメッセージを消すための「削除ボタン」をつけましょう。
ここで重要なのは、「どうやって消したい投稿だけをピンポイントで指名するか?」です。
データを消す命令「DELETE」
データを削除するには、SQLの DELETE 文を使います。
⚠️ 恐怖の落とし穴
-- ❌ これをやると全部消える!!
DELETE FROM messages
条件を指定しないと、テーブルの中身が空っぽになってしまいます。
必ず WHERE(ホウェア) を使って、「idが〇〇のやつだけ」と指定します。
-- ⭕️ idが5番のデータだけ消す
DELETE FROM messages WHERE id = 5
どのボタンが押されたか判別する「hidden」
画面には投稿がズラッと並んでいます。
どの「削除ボタン」が押されたのかをPHPに伝えるために、HTMLの type="hidden" を使います。
これは「画面には見えないけれど、データとして送信される入力欄」です。
ここに、投稿ごとの「ID」をこっそり仕込んでおくのです。
<form method="post">
<!-- こっそりIDを送る -->
<input type="hidden" name="delete_id" value="5">
<button type="submit">削除</button>
</form>
実践:削除機能付き掲示板
では、前回の bbs.php を改造して、削除機能を実装しましょう。
<?php
// DB接続(共通)
$dsn = 'mysql:dbname=bbs_app;host=localhost;charset=utf8mb4';
$user = 'root';
$password = ''; // MAMPは 'root'
try {
$pdo = new PDO($dsn, $user, $password);
// === 削除ボタンが押された時 ===
// hiddenで送られた "delete_id" があるかチェック
if (isset($_POST['delete_id'])) {
$delete_id = $_POST['delete_id'];
// 指定されたIDを削除するSQL
$sql = "DELETE FROM messages WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':id', $delete_id, PDO::PARAM_INT);
$stmt->execute();
}
// === 新規投稿が押された時 ===
if (isset($_POST['username'])) {
$username = $_POST['username'];
$comment = $_POST['comment'];
$sql = "INSERT INTO messages (username, comment, created_at) VALUES (:username, :comment, NOW())";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':username', $username, PDO::PARAM_STR);
$stmt->bindValue(':comment', $comment, PDO::PARAM_STR);
$stmt->execute();
}
// === 一覧表示(常に実行) ===
$sql = "SELECT * FROM messages ORDER BY id DESC";
$stmt = $pdo->query($sql);
$messages = $stmt->fetchAll();
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ひとこと掲示板</title>
<style>
.post { border-bottom: 1px solid #ddd; padding: 10px; display: flex; justify-content: space-between; }
.delete-btn { color: red; cursor: pointer; background: none; border: none; text-decoration: underline; }
</style>
</head>
<body>
<h1>ひとこと掲示板</h1>
<form action="" method="post">
名前:<input type="text" name="username" required>
本文:<input type="text" name="comment" required>
<button type="submit">投稿</button>
</form>
<hr>
<?php foreach ($messages as $msg): ?>
<div class="post">
<div>
<strong><?= htmlspecialchars($msg['username'], ENT_QUOTES, 'UTF-8') ?></strong>
:<?= htmlspecialchars($msg['comment'], ENT_QUOTES, 'UTF-8') ?>
<small>(<?= $msg['created_at'] ?>)</small>
</div>
<!-- 削除ボタン(投稿ごとに小さなフォームを作る) -->
<form action="" method="post" onsubmit="return confirm('本当に削除しますか?');">
<!-- どのIDを消すか、こっそり教える -->
<input type="hidden" name="delete_id" value="<?= $msg['id'] ?>">
<button type="submit" class="delete-btn">削除</button>
</form>
</div>
<?php endforeach; ?>
</body>
</html>
解説:削除の流れ
- 一覧表示のループの中で、投稿ごとに小さな
<form>を作っています。 - その中に
<input type="hidden" value="<?= $msg['id'] ?>">を入れています。これで、「田中さんの投稿(ID:5)」には「5」、「佐藤さんの投稿(ID:6)」には「6」が埋め込まれます。 - 削除ボタンを押すと、そのIDだけがPHPに送信され、
DELETE文で削除されます。
編集(UPDATE)機能はどうする?
今回は実装しませんが、編集機能も考え方は同じです。
- 「編集」ボタンでIDを送信し、編集画面に移動する。
- そのIDのデータをDBから取得して、入力フォームに表示する(valueに入れる)。
- 書き換えて送信されたら、SQLの
UPDATE文で上書き保存する。
UPDATE messages SET comment = '新しい本文' WHERE id = 5
PHPコース卒業!次のステップへ
おめでとうございます!これでHTML、CSS、JavaScript、PHP、そしてデータベースの基礎をすべて学び終えました。
あなたはもう、「画面を作る力」と「データを操る力」の両方を持っています。
最後に、これからプロのエンジニアを目指すためのロードマップを紹介します。
フレームワークを学ぶ(Laravel)
今のPHP開発では、今回のように全て手書き(生のPHP)することは稀です。
セキュリティや便利な機能がセットになった「Laravel(ララベル)」というフレームワークを学ぶのが次のステップです。
バージョン管理を学ぶ(Git)
コードのバックアップや変更履歴を保存する「Git(ギット)」は、チーム開発の必須スキルです。
自分だけのオリジナルアプリを作る
これが一番の近道です。家計簿アプリ、タスク管理、推し活メモ…なんでも構いません。
「作りたいもの」がある時、技術は一番伸びます。
長いコースでしたが、最後までついてきてくれてありがとうございました。
あなたのエンジニアライフが素晴らしいものになりますように!
📝 今日のミニテスト
PHP編最後のテストです!
Q1. データを削除するSQLで、絶対に忘れてはいけないキーワードは?
正解:WHERE
DELETE FROM table だけだと、全データが消えて大惨事になります。
Q2. 画面には表示したくないが、データとしてIDなどを送信したい時に使うHTMLタグは?
正解:<input type="hidden" ...>
削除ボタンや編集ボタンの実装で必ず使います。
Q3. 既存のデータを書き換える(更新する)SQL命令は?
正解:UPDATE
UPDATE テーブル名 SET カラム = 値 WHERE id = ... という形で使います。