初心者向けPHP の MySQL のデータを削除する方法(DELETE 文)完全ガイド
新人:「PHPでMySQLのデータを削除する方法って、どうやってやるんですか?」
先輩:「データを削除するには、DELETE文を使いますよ。DELETE文を使うと、テーブル内の指定したデータを削除できます。」
新人:「DELETE文ってどうやって書けばいいんですか?」
先輩:「DELETE文の基本的な書き方を説明しますね。」
1. DELETE文とは?(基本的な説明)
DELETE文は、MySQLのテーブル内のデータを削除するためのSQL文です。例えば、あるユーザーが退会した場合、そのユーザーの情報をデータベースから削除するためにDELETE文を使います。
DELETE文の基本的な構文は次のようになります:
DELETE FROM テーブル名 WHERE 条件;
DELETE FROM
は削除したいテーブルを指定し、WHERE
で削除するデータの条件を指定します。WHERE
を使わずにDELETE文を実行すると、テーブル内の全てのデータが削除されてしまうので注意が必要です。
2. DELETE文の基本的な書き方と構文
DELETE文を使うためには、まず削除するデータを特定する必要があります。例えば、ユーザーIDが1のユーザーを削除したい場合、次のようなSQL文を使います:
DELETE FROM users WHERE id = 1;
この例では、users
テーブルからid
が1のユーザーを削除しています。WHERE
の後に条件を指定することで、特定のデータだけを削除することができます。
もし条件を指定せずに実行してしまうと、テーブル内のすべてのデータが削除されてしまうため、WHERE
句を忘れないようにしましょう。
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
を使う方が安心かもしれません。安全にデータを削除できるよう、しっかりと知識を深めていきましょう。