フォルダとファイル名
php-db フォルダに db05.php を作成します。
このページでは、データベースの users テーブルから、指定したIDのレコードを削除する操作を学びます。
基本コード(db05.php)
- データベースに接続する
SELECT文で現在のユーザー一覧を表示する- 下部のフォームに削除したい
IDを入力してPOST DELETE文を使って該当IDのデータを削除する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') |
DELETE文 | WHERE id = ? で対象を限定して削除しています。WHERE句は絶対必要! |
rowCount() | 削除が成功したかどうかを確認。0件ならIDが存在しなかった可能性あり |
htmlspecialchars() | 表示時は h() 関数でXSS対策をしています |
大事なまとめ
UPDATE/DELETEは WHERE が命。付け忘れは致命傷。- 値は プレースホルダ + execute で安全に渡す。
- 実行後は rowCount() で結果を確認。
- 更新・削除前に SELECTで対象を確認するのが安全な手順。
