PHPプログラミング

レシピ

データベース PDO

PDOでデータを削除(DELETE)

データベースの基本操作である作成(INSERT)、参照(SELECT)、更新(UPDATE)、削除(DELETE)のうち、削除(DELETE)を行う方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースを使って解説します。

この記事のポイント

  • データベースに登録されたデータを削除する
  • データベースのデータを削除する基本的なSQLを確認する
  • パラメータ形式でデータを削除する

目次

PDOを使ってデータを削除する

今回はデータベースに登録されたデータを削除する方法について解説します。

前提として、全てのデータベースには「test」データベースがあり、次の構造を持ったテーブルがあることとします。

テーブル名:user_list
カラム名その他
id整数主キー
name文字列
age整数
registry_datetime日付(またはタイムスタンプ、文字列)

PDO自体の基本的な内容については「PDOについて」を、データベースへの接続方法については「PDOを使ってデータベースへ接続」をご覧ください。

データを削除する流れを確認

これから4種類のデータベースにあるデータをそれぞれ更新していきますが、今回は基本的なSQLのみ扱うため、全て同じSQL文が適用できます。
そこでまずは、データ更新の部分のみ確認しておきましょう。

データを取得するコード例

// SQL文を作成
$sql = "DELETE FROM user_list WHERE id = 3";

// クエリ実行(データを取得)
$res = $dbh->query($sql);

上記SQLを実行するとuser_listテーブルにあるWHERE句で指定したデータが削除されます。
SQLの実行が成功するとPDOStatementオブジェクト、それ以外の場合は論理値のfalse$resに入ります。

文法エラーがなくSQLが実行されればPDOStatementオブジェクトが返ってくる点に注意してください。
例えばテーブルにそもそもデータが入っていなかったり、条件にあうデータがなく削除できなかった場合についても、文法エラーではないため返り値はPDOStatementオブジェクトです。

削除する流れを確認したところで、続いてそれぞれのデータベース別にデータの削除を行なっていきましょう。

MySQL / MariaDBでデータを削除する

まずはMySQLとMariaDBからデータの削除を行います。
この2つのデータベースは共通の方法で削除操作を行うことができます。

操作前のテーブルには次のデータが入っています。

操作前のテーブル

操作前のテーブル(MySQL or MariaDB)

ここでは、id3であるテスト太郎さんのデータを削除します。

先ほどのデータを削除するコードを使い、データベースの接続からコードにしていきます。
データベースの接続と解除、処理をtry文で囲む部分については「PDOを使ってデータベースへ接続」で使ったものをそのまま使っています。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

try {
	// DBへ接続
	$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');

	// SQL作成
	$sql = "DELETE FROM user_list WHERE id = 3";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

削除が成功すると、テーブルの内容は次のようになります。

操作後のテーブル

操作後のテーブル(MySQL or MariaDB)

テスト太郎のデータがテーブルから削除されました。
以上、MySQLとMariaDBでのデータ削除方法でした。

PostgreSQLでデータを削除する

続いて、PostgreSQLでデータ削除を行います。
基本的なコードは上記MySQLと同様です。

操作前のテーブル

操作前のテーブル(PostgreSQL)

今回はid3を持つテスト四郎さんのデータを削除します。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

try {
	// DBへ接続
	$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');

	// SQL作成
	$sql = "DELETE FROM user_list WHERE id = 3";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

操作後のテーブル

操作後のテーブル(PostgreSQL)

テスト四郎さんのデータがテーブルから削除されました。
以上、PostgreSQLでのデータ削除方法でした。

SQLiteでデータを削除する

最後にSQLiteでデータの削除を行います。
全体の流れは上記2つのデータベースと同じ内容です。

操作前のテーブル

操作前のテーブル(SQLite)

ここでは、id3のテスト健太さんのデータを削除していきます。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

try {
	// DBへ接続
	$dbh = new PDO("sqlite:./sqlite/test.sqlite3");

	// SQL作成
	$sql = "DELETE FROM user_list WHERE id = 3";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

操作後のテーブル

操作後のテーブル(SQLite)

テスト健太さんのデータがテーブルから削除されました。
以上、SQLiteでのデータ削除方法でした。

プリペアドステートメント(prepare)でパラメータを使ってデータを削除する

最後にプリペアドステートメントを使ってパラメータ形式でデータを削除する方法を紹介します。
こちらの方法はいずれのデータベースでも共通して使用できますが、以下の例ではMariaDBを使います。

プリペアドステートメントでパラメータを指定する方法は「名前付きパラメータ」と「疑問符パラメータ」のいずれかを選ぶことができます。

名前付きパラメータ

「名前付きパラメータ」は、SQLで値をパラメータで渡したい箇所を変数のように「:パラメータ名」の形で記述します。

SQLの例

// SQLを作成
$sql = 'DELETE FROM test WHERE name = :name';

このSQLに値を渡して実行してみましょう。

コード例

<?php

// 変数の初期化
$sql = null;
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', 'username', 'password');
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'DELETE FROM test WHERE name = :name';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array(
    ':name' => 'モーニングブレンド'
));

// DB接続を解除
$statement = null;
$db_handle = null;

作成したSQLを「// SQL実行準備」で実行準備をし、「// 値を渡して実行」のexecuteメソッドでパラメータに対応する値を指定して削除を実行します。
実行後に返される結果は登録に成功したら「true」、失敗したら「false」が渡され、$resultに入ります。

ちなみに複数のパラメータを指定する場合、「名前付きパラメータ」では指定の順番は自由に記述するができます。
例えば、SQL文では「:name」「:category」の2つを指定する場合、以下のコード例のようにSQLと値を渡す順番が反対になっていても正しくデータを削除することができます。

値の指定例

// SQL作成
$sql = 'DELETE FROM test WHERE name = :name AND category = :category';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array(
    ':category' => 1,
    ':name' => 'モーニングブレンド'
));

疑問符パラメータ

「疑問符パラメータ」は、SQL文の中にパラメータを渡したい箇所に「?」を記述します。

SQLの例

// SQLを作成
$sql = 'DELETE FROM test WHERE name = ? AND category = ?';

パラメータの値は次のように配列形式で渡します。

コード例

<?php

// 変数の初期化
$sql = null;
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', ‘username’, ‘password’);
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'DELETE FROM test WHERE name = ? AND category = ?';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array( 'クリスマスブレンド ライト', 4));

// DB接続を解除
$statement = null;
$db_handle = null;

「疑問符パラメータ」は配列の先頭から順に「?」に当てはめていくため、「名前付きパラメータ」とは違って値を正しい順番で指定する必要がある点に注意してください。

以上がパラメータを使ったデータの削除方法です。
今回はSQLが比較的シンプルなので「疑問符パラメータ」は有効ですが、もう少し複雑なときは「名前付きパラメータ」の方がパラメータと値の関係が分かりやすく記述ミスが起きづらくなりオススメです。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。