初心者向けPHP の MySQL のデータを削除する方法(DELETE 文)完全ガイド
新人:「PHPでMySQLのデータを削除する方法って、どうやってやるんですか?」
先輩:「データを削除するには、DELETE文を使いますよ。DELETE文を使うと、テーブル内の指定したデータを削除できます。」
新人:「DELETE文ってどうやって書けばいいんですか?」
先輩:「DELETE文の基本的な書き方を説明しますね。」
1. DELETE文とは?(基本的な説明)
DELETE文は、MySQLのテーブルから不要になったデータを削除するためのSQL文です。例えば、退会したユーザーや不要な商品データを削除する場合など、データベースを整理する場面でよく使われます。普段の管理業務でも頻繁に登場するため、最初にしっかり理解しておきたい文です。
DELETE文の基本的な構文はとてもシンプルで、次のように書きます。
DELETE FROM テーブル名 WHERE 条件;
DELETE FROMには削除したいテーブル名を指定し、WHEREには「どのデータを削除するのか」という条件を書きます。条件に合ったレコードだけが削除されます。
例えば、ユーザーIDが1のデータだけを削除したいときは、次のようになります。
DELETE FROM users WHERE id = 1;
このように、特定のデータだけを狙って削除できる仕組みになっています。ただし、WHEREを付けずに実行すると、テーブル内の全データが削除されてしまうので非常に危険です。DELETE文を使う際は、条件の書き忘れに注意しながら操作しましょう。
2. DELETE文の基本的な書き方と構文
DELETE文を使うときに大切なのは、「どのデータを削除するのか」を明確にすることです。削除したいデータが特定できていないと、意図しないデータまで消えてしまう危険があります。まずは、基本的な書き方からゆっくり見ていきましょう。
例えば、ユーザーIDが1のユーザーだけを削除したい場合は、次のように書きます。
DELETE FROM users WHERE id = 1;
このSQL文では、usersテーブルの中から、idが1のデータだけを削除しています。WHEREの後に条件を書くことで、「このデータだけ削除してね」という指定ができます。
初心者の方が特に注意したいのが、WHERE句を忘れた場合の挙動です。もし次のように書いてしまうと、usersテーブル内のすべてのデータが削除されてしまいます。
DELETE FROM users;
このように、DELETE文はとても強力な命令なので、どのデータを削除するのかしっかり確認しながら使うことが大切です。まずは1件だけ削除する簡単な例から練習してみると理解が深まります。
3. mysqliを使ったDELETE文の実行方法
PHPのmysqliを使ってMySQLのデータを削除する方法を見ていきましょう。mysqliは、PHPでMySQLデータベースにアクセスするための拡張機能で、簡単にデータベース操作が行えます。
基本的な流れとして、まずデータベースに接続し、その後DELETE文を実行します。
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQLに接続
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 接続確認
if (!$conn) {
die("接続失敗: " . mysqli_connect_error());
}
// DELETE文を実行
$sql = "DELETE FROM users WHERE id = 1"; // idが1のユーザーを削除
if (mysqli_query($conn, $sql)) {
echo "レコードが削除されました";
} else {
echo "エラー: " . mysqli_error($conn);
}
// 接続を閉じる
mysqli_close($conn);
?>
このコードでは、usersというテーブルから、idが1のレコードを削除しています。実行後、レコードが削除されたかどうかがメッセージで確認できます。
4. PDOを使ったDELETE文の実行方法
次に、PHPのPDOを使ってDELETE文を実行する方法について説明します。PDOは、複数のデータベース管理システム(DBMS)をサポートするため、より汎用的で柔軟にデータベースを操作することができます。
PDOを使った場合、SQLインジェクション対策としてプリペアドステートメント(prepared statement)を使うことが推奨されます。以下のコード例では、PDOを使ってデータを削除します。
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// PDOに接続
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// エラーモードを設定
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// DELETE文を実行
$stmt = $conn->prepare("DELETE FROM users WHERE id = :id");
$stmt->bindParam(':id', $id); // バインド変数
$id = 1; // idが1のユーザーを削除
$stmt->execute();
echo "レコードが削除されました";
} catch(PDOException $e) {
echo "エラー: " . $e->getMessage();
}
// 接続を閉じる
$conn = null;
?>
このコードでは、PDOを使ってusersテーブルからidが1のレコードを削除しています。prepareメソッドとbindParamを使うことで、安全にデータを削除することができます。
5. mysqliとPDOの違い(どちらを選ぶべきか)
PHPでMySQLにアクセスする方法として、mysqliとPDOの2つがありますが、それぞれに特徴があります。
- mysqli:MySQL専用の拡張機能で、MySQLデータベースに特化しています。簡単に使えますが、他のデータベースに対応していません。
- PDO:複数のデータベース管理システム(MySQL、PostgreSQL、SQLiteなど)をサポートしています。コードの移植性が高く、SQLインジェクション対策が強力です。
どちらを選ぶかは、プロジェクトの要件によります。もしMySQLだけを使う場合は、mysqliで十分ですが、複数のデータベースを使う可能性がある場合は、PDOの方が便利です。
初心者には、まずmysqliを使ってみて、後からPDOを学ぶのが良いでしょう。
6. MySQLのエラーハンドリング(DELETE文のエラー処理)
データベース操作を行う際、エラーが発生することがあります。特にDELETE文のようなデータを削除する操作は、予期しない結果を招く可能性があるため、エラーハンドリングが非常に重要です。
例えば、テーブル名や条件に誤りがある場合、DELETE文は失敗してエラーが発生します。エラーハンドリングをしっかり行うことで、問題の早期発見やユーザーへの適切なフィードバックが可能になります。
以下は、mysqliとPDOを使った基本的なエラーハンドリングの方法です。
mysqliでのエラーハンドリング
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("接続失敗: " . mysqli_connect_error());
}
$sql = "DELETE FROM users WHERE id = 1";
if (mysqli_query($conn, $sql)) {
echo "レコードが削除されました";
} else {
echo "エラー: " . mysqli_error($conn); // エラー内容を表示
}
mysqli_close($conn);
?>
mysqli_error($conn)を使うと、SQL文が失敗した場合のエラー内容を取得して表示できます。これにより、エラーが発生した原因を特定できます。
PDOでのエラーハンドリング
<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=test_db", "root", "");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "DELETE FROM users WHERE id = 1";
$conn->exec($sql);
echo "レコードが削除されました";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage(); // エラー内容を表示
}
$conn = null;
?>
PDOExceptionを使って、エラーが発生した場合にその内容をキャッチし、表示することができます。
7. セキュリティ対策(SQLインジェクション対策)
SQLインジェクションとは、悪意のあるユーザーが入力フォームに不正なSQLコードを挿入して、データベースを不正に操作する攻撃手法です。DELETE文でもSQLインジェクションのリスクは存在するため、しっかりと対策を講じることが重要です。
SQLインジェクションを防ぐための基本的な方法として、プレースホルダ(パラメータ化クエリ)を使うことが推奨されます。これにより、SQL文とデータが分離され、悪意のあるコードが実行されることを防ぎます。
mysqliでのSQLインジェクション対策
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("接続失敗: " . mysqli_connect_error());
}
// プレースホルダを使ったSQL文
$sql = "DELETE FROM users WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);
// idの値をバインド
$id = 1;
mysqli_stmt_bind_param($stmt, "i", $id); // "i"は整数を示す
if (mysqli_stmt_execute($stmt)) {
echo "レコードが削除されました";
} else {
echo "エラー: " . mysqli_error($conn);
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>
上記のように、mysqli_prepareでSQL文を準備し、mysqli_stmt_bind_paramでパラメータをバインドすることで、SQLインジェクションを防ぎます。
PDOでのSQLインジェクション対策
<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=test_db", "root", "");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// プレースホルダを使ったSQL文
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $conn->prepare($sql);
// idの値をバインド
$id = 1;
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
echo "レコードが削除されました";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
$conn = null;
?>
PDOでも同様に、プレースホルダを使ってSQLインジェクションを防ぐことができます。bindParamを使って、データの型を指定しながらパラメータをバインドします。
8. おすすめの使い方
この記事では、PHPを使ってMySQLのデータを削除する方法について解説しました。DELETE文は強力な機能ですが、正しく使用しないと大切なデータを失う可能性があります。以下にまとめを示します。
- DELETE文を使ってデータを削除する際は、
WHERE句で削除対象を指定することが重要です。 - エラーハンドリングを行い、問題が発生した場合には適切に対処できるようにしましょう。
- SQLインジェクションを防ぐために、プレースホルダを使ってパラメータ化されたクエリを実行しましょう。
また、DELETE文は取り扱いに慎重を要する操作なので、実行する前に十分なバックアップを取ることをおすすめします。データベースを操作する際は、いつでも慎重に行動しましょう。
最後に、初心者の方にはmysqliよりも、エラーハンドリングが強力なPDOを使う方が安心かもしれません。安全にデータを削除できるよう、しっかりと知識を深めていきましょう。
まとめ
PHPでMySQLのデータを安全に削除する方法として、DELETE文の基本構文から実践的な使い方まで幅広く学びました。DELETE文は非常に強力で便利な一方、使い方を誤るとデータベースの情報をすべて消してしまうリスクがあるため、WHERE句の指定は必須です。加えて、エラーハンドリングの実装やSQLインジェクション対策も重要なポイントです。
PHPにはmysqliとPDOの2つの方法でデータベースと連携する方法があり、それぞれに特徴があります。mysqliはMySQL専用で初心者にとって扱いやすく、PDOは複数のデータベースをサポートしており、セキュリティ対策がしやすい利点があります。
また、DELETE文を扱う際は、SQL文が正しく実行されたかどうかを確認し、必要に応じてmysqli_error()やPDOExceptionでエラーを取得することが大切です。何よりも、開発環境や本番環境に関わらず、データを削除する操作は慎重に行うべきです。バックアップの取得や確認ダイアログの導入など、操作ミスを防ぐ工夫も重要です。
以下は、改めてDELETE文を安全に実行する際のPDOを使ったサンプルコードです。
<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=test_db", "root", "");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $conn->prepare($sql);
$id = 3;
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
echo "レコードが削除されました";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
$conn = null;
?>
このように、プレースホルダを使って変数をバインドし、安全にSQLを実行することで、予期せぬ削除や不正なアクセスを防ぐことができます。これらの知識は今後のPHP開発でも頻繁に活用することになるため、しっかりと身につけておきましょう。
生徒:「今回の記事で、DELETE文ってすごく慎重に使わないと危ないってことがよく分かりました!」
先生:「その通り。WHEREを忘れると、テーブル全体のデータが消えるから特に注意が必要だね。」
生徒:「あと、mysqliとPDOの違いも知れて勉強になりました。セキュリティ的にはPDOの方が良さそうですね。」
先生:「うん。プレースホルダでSQLインジェクションを防げるし、エラー処理も柔軟だよ。」
生徒:「これからはDELETE文を使う前に必ずバックアップを取るようにします!慎重に扱わないといけない操作ですね。」
先生:「その心がけが大事。エンジニアとして信頼されるためにも、安全に扱う知識と姿勢を身につけよう。」
生徒:「はい、ありがとうございました!」