PHPでSELECT文で読み込んで、DELETE文で削除しよう

フォルダとファイル名

php-db フォルダに db05.php を作成します。
このページでは、データベースの users テーブルから、指定したIDのレコードを削除する操作を学びます。

基本コード(db05.php)

  1. データベースに接続する
  2. SELECT 文で現在のユーザー一覧を表示する
  3. 下部のフォームに削除したい ID を入力して POST
  4. DELETE 文を使って該当IDのデータを削除する
  5. rowCount() で削除件数を表示する
<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$password = '';

function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $msg = '';

    // フォームから削除が送信された場合
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $id = (int)($_POST['id'] ?? 0);
        if ($id > 0) {
            $stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
            $stmt->execute([$id]);
            $count = $stmt->rowCount();
            if ($count > 0) {
                $msg = "ID {$id} を削除しました。";
            } else {
                $msg = "ID {$id} のデータは見つかりませんでした。";
            }
        } else {
            $msg = "削除対象の ID を正しく入力してください。";
        }
    }

    // 一覧取得
    $stmt = $pdo->query("SELECT * FROM users ORDER BY id ASC");
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo "エラー:" . $e->getMessage();
    exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ユーザー一覧(削除機能付き)</title>
    <style>
        table {
            border-collapse: collapse;
            margin-bottom: 1em;
        }
        th, td {
            border: 1px solid #666;
            padding: .5em 1em;
        }
        form {
            margin-top: 2em;
        }
    </style>
</head>
<body>
    <h1>ユーザー一覧</h1>
    <?php if ($msg): ?>
        <p><strong><?= h($msg) ?></strong></p>
    <?php endif; ?>
    <table>
        <tr>
            <th>ID</th>
            <th>名前</th>
            <th>メール</th>
            <th>登録日</th>
        </tr>
        <?php foreach ($rows as $row): ?>
            <tr>
                <td><?= h($row['id']) ?></td>
                <td><?= h($row['name']) ?></td>
                <td><?= h($row['email']) ?></td>
                <td><?= h($row['created_at']) ?></td>
            </tr>
        <?php endforeach; ?>
    </table>

    <h2>IDを指定して削除</h2>
    <form method="post">
        <label>ID:
            <input type="number" name="id" required value="">
        </label><br>
        <button type="submit">削除する</button>
    </form>
</body>
</html>
  • rowCount() の値が「0」のときは「存在しない ID」だった可能性があります。
  • DELETE 文には必ず WHERE をつけるのが大原則です。WHERE を忘れると全件削除される可能性があります。
  • $msg はHTML側で表示して、ユーザーに処理結果を伝える用途です。

解説

項目解説
SELECT最初に一覧を取得し、対象のIDを確認しやすくしています
POSTの受信フォーム送信時だけ削除処理が実行されます($_SERVER['REQUEST_METHOD'] === 'POST'
DELETEWHERE id = ? で対象を限定して削除しています。WHERE句は絶対必要!
rowCount()削除が成功したかどうかを確認。0件ならIDが存在しなかった可能性あり
htmlspecialchars()表示時は h() 関数でXSS対策をしています

大事なまとめ

  • UPDATEDELETEWHERE が命。付け忘れは致命傷。
  • 値は プレースホルダ + execute で安全に渡す。
  • 実行後は rowCount() で結果を確認。
  • 更新・削除前に SELECTで対象を確認するのが安全な手順。