PDO⑫ DELETE文
今回は削除機能のサンプルを作成してみましょう。
■仕様
- 一覧表示されるデータそれぞれに削除画面へのリンクがある
- リンクを押すと削除確認画面へ遷移し、レコード削除の確認と削除・戻るボタンを表示
- 確認画面で削除ボタンを押すとレコードを削除するシステム
■プログラム
○一覧表示画面
list.php
<?php
try {
// 接続処理
$dsn = 'mysql:host=localhost;dbname=sample_db';
$user = 'root';
$password = '';
$dbh = new PDO($dsn, $user, $password);
// SELECT文を発行
$sql = "SELECT * FROM members";
$stmt = $dbh->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(); // 全てのレコードを取得
// 接続切断
$dbh = null;
} catch (PDOException $e) {
print $e->getMessage() . "<br/>";
die();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>一覧</title>
</head>
<body>
<table border="1">
<tr>
<th>ID</th>
<th>名前</th>
<th>年齢</th>
<th>住所</th>
<th>更新</th>
<th>削除</th>
</tr>
<?php
foreach($rows as $row){
?>
<tr>
<td><?php print($row['id']) ?></td>
<td><?php print($row['name']) ?></td>
<td><?php print($row['age']) ?></td>
<td><?php print($row['address']) ?></td>
<td><a href="edit.php?id=<?php print($row['id']) ?>">更新</a></td>
<td><a href="confirm.php?id=<?php print($row['id']) ?>">削除</a></td>
</tr>
<?php
}
?>
</table>
</body>
</html>
○削除確認画面
confirm.php
<?php
if (isset($_GET['id'])) {
try {
// 接続処理
$dsn = 'mysql:host=localhost;dbname=sample_db';
$user = 'root';
$password = '';
$dbh = new PDO($dsn, $user, $password);
// SELECT文を発行
$sql = "SELECT * FROM members WHERE id = :id";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':id', $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$member = $stmt->fetch(PDO::FETCH_OBJ); // 1件のレコードを取得
// 接続切断
$dbh = null;
} catch (PDOException $e) {
print $e->getMessage() . "<br/>";
die();
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>確認画面</title>
</head>
<body>
<p>以下のデータを削除しますか?</p>
<table>
<tr>
<th>ID : </th>
<td><?php print($member->id) ?></td>
</tr>
<tr>
<th>名前 : </th>
<td><?php print($member->name) ?></td>
</tr>
<tr>
<th>年齢 : </th>
<td><?php print($member->age) ?></td>
</tr>
<tr>
<th>住所 : </th>
<td><?php print($member->address) ?></td>
</tr>
</table>
<a href="delete.php?id=<?php print($member->id)?>">削除する</a><br>
<a href="list.php">戻る</a>
</body>
</html>
○削除プログラム
delete.php
<?php
if (isset($_GET['id'])) {
try {
// 接続処理
$dsn = 'mysql:host=localhost;dbname=sample_db';
$user = 'root';
$password = '';
$dbh = new PDO($dsn, $user, $password);
// DELETE文を発行
$id = $_GET['id']; // DELETEするレコードのID
$sql = "DELETE FROM members WHERE id = :id";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(":id", $id); // 削除したいIDでバインド
$stmt->execute(); // DELETE文実行
print("レコードを削除しました");
print('<a href="list.php">一覧表示へ</a>');
// 接続切断
$dbh = null;
} catch (PDOException $e) {
print $e->getMessage() . "<br/>";
die();
}
}
?>
■解説
まず一覧表示画面について、
中身はUPDATE文のときに使用したサンプルコードとほとんど変わりません。
仕様に書かれている通り、データごとに削除画面へのリンクを追加しています。(40行目、52行目)
次に削除確認画面について、
こちらもSELECT文のサンプルで使用したものをベースにしています。
一覧表示画面から遷移する際にGETで受け取った id のデータを使用して1レコードを取得し、
削除確認画面に予めデータを埋め込んでいます。
「削除する」のリンクを押すとデータは削除され、「戻る」のリンクを押すと一覧表示の画面に戻ります。
また、一度変更・削除を行ったデータは基本的にもとに戻せません。
更新や削除といったデータの書き換えを行う場合は
今回のように確認画面を挟むことによって誤った処理を防ぐことに繋がります。
最後に削除プログラムについて、
こちらはDELETE文のサンプルで使用したものと殆ど変わりません。
GETで送られてきた id を SQL に埋め込み削除処理を行っています。
処理が完了したあとは削除完了のメッセージとともに一覧画面へのリンクを表示しています。
いかがでしたでしょうか。
今回の記事のテーマとしては大事なのはもちろん delete.php ですが、
UPDATE文のサンプルとおおよそ同じプログラムを使用し、
一覧表示・更新・削除が行うことができるサンプルになりました。
少し大きなプログラムになり達成感もあるかと思いますが、注意点もあります。
今回のDELETEの処理では「/delete.php?id=1」のように
URLのパラメータを使って id を指定しdelete.php の処理を行っています。
この仕様のままだと、URLのパラメータを id=2、id=3、id=… と変更してしまえば、
誰でも次々とデータを削除することが可能になってしまいます。
このようなことが発生しないよう
実際に同じようなシステムを作成するとなったときは
誰がどのデータを閲覧でき、更新削除の処理が行えるかといった
権限のチェックを行う必要が出てきますのでご注意ください。
■まとめ
- 主キーを用いて削除するレコードの指定し、DELETE文を実行する
- データの更新・削除など、データを書き換える処理を行う際は確認画面をいれるなど慎重に処理を行う
- 更新・削除は特に権限のチェックをした上で処理を行う(今回のサンプルでは考慮していません)


