PHPプログラミング

最終更新日:
公開日:

レシピ

データベース MySQL / MariaDB

mysqliでMySQL/MariaDBのデータを削除:DELETE

MySQLiクラスのオブジェクトや関数を使って、データベースのデータを削除する方法を解説していきます。

この記事のポイント

  • MySQLiクラスのオブジェクトや関数を使ってMySQL / MariaDBのデータベースにあるデータを削除する
  • データの削除ではプリペアドステートメントを使う
  • オブジェクト、または関数(手続き型)を使った2通りの方法を解説

目次

データベースのデータを削除する

MySQLiクラスのオブジェクトや関数とSQLのDELETE文を使って、データベースにあるデータを削除していきます。
今回は次のようなuserテーブルを使って進めていきます。

テーブル名:user
idnamegenderagemodify_datetimecreate_datetime
1青山 太郎1352016-10-04 00:00:002014-04-10 00:00:00
2飯島 彩子2262016-10-02 00:00:002014-04-10 00:00:00
3宇多 太郎1272016-10-01 00:00:002014-04-10 00:00:00
4江藤 彩子2322016-09-20 00:00:002015-08-07 00:00:00
5大島 太郎1222016-09-03 00:00:002012-10-05 00:00:00
6加藤 彩子2412016-09-18 00:00:002012-04-20 00:00:00
7岸田 太郎1272016-09-18 00:00:002012-04-20 00:00:00
8工藤 彩子2392016-10-01 00:00:002012-05-10 00:00:00
9小島 太郎1302016-09-10 00:00:002012-04-20 00:00:00
10佐藤 彩子2322016-09-24 00:00:002012-05-15 00:00:00

各カラムの役割は次の通りです。

  • id – ID(主キー、AUTO INCREMENT)
  • name – 名前
  • gender – 性別。1は男性、2は女性
  • age – 年齢
  • modify_datetime – データ更新日時
  • create_datetime – データ登録日時

まずはSQLのDELETE文の書き方を確認します。

SQLのDELETE文

DELETE FROM テーブル名 WHERE カラム名 = ;

DELETE文は削除するデータを特定する必要があるため、テーブル名とWHERE句で条件を指定します。

例えば、今回のuserテーブルにあるデータを削除する場合は次のようになります。

SQLのDELETE文

DELETE FROM user WHERE id = 5;

このSQLを元に、MySQLiクラスのオブジェクトと関数(手続き型)の2つのパターンを使った方法を見ていきます。
どちらの方法でもSQLを実行するときはプリペアドステートメントを使います。

今回の方法はMySQL、MariaDBのいずれも同じコードで動作します。

なお、データベースへの接続までは「mysqliを使ってMySQL/MariaDBのデータベースへ接続」と同様です。
より詳しくはこちらの記事をご覧ください。

オブジェクトを使った書き方

MySQLiクラスのオブジェクトを作成し、データベースのデータを削除する方法です。
以下の例ではidカラム5のデータを1件だけ削除します。

index.php

// (1)削除するデータを特定するためIDを用意
$id = 5;

// (2)データベースと接続
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

// (3)文字コードを設定
$mysqli->set_charset('utf8');

// (4)プリペアドステートメントの用意
$stmt = $mysqli->prepare('DELETE FROM user WHERE id = ?');

// (5)削除するidの値をセット
$stmt->bind_param('i', $id);

// (6)削除実行
$stmt->execute();

// (7)データベースとの接続解除
$mysqli->close();

データを削除した後のuserテーブルを出力してみると、以下のようにidカラム5のデータを1行削除していることが確認できます。

userテーブル

+----+---------------+--------+-----+---------------------+---------------------+
| id | name          | gender | age | modify_datetime     | create_datetime     |
+----+---------------+--------+-----+---------------------+---------------------+
|  1 | 青山 太郎     |      1 |  35 | 2016-10-04 00:00:00 | 2014-04-10 00:00:00 |
|  2 | 飯島 彩子     |      2 |  26 | 2016-10-02 00:00:00 | 2014-04-10 00:00:00 |
|  3 | 宇多 太郎     |      1 |  27 | 2016-10-01 00:00:00 | 2014-04-10 00:00:00 |
|  4 | 江藤 彩子     |      2 |  32 | 2016-09-20 00:00:00 | 2015-08-07 00:00:00 |
|  6 | 加藤 彩子     |      2 |  41 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
|  7 | 岸田 太郎     |      1 |  27 | 2021-11-30 18:35:00 | 2012-04-20 00:00:00 |
|  8 | 工藤 彩子     |      2 |  39 | 2016-10-01 00:00:00 | 2012-05-10 00:00:00 |
|  9 | 小島 太郎     |      1 |  30 | 2016-09-10 00:00:00 | 2012-04-20 00:00:00 |
| 10 | 佐藤 彩子     |      2 |  32 | 2016-09-24 00:00:00 | 2012-05-15 00:00:00 |
+----+---------------+--------+-----+---------------------+---------------------+

最初の(1)では削除するidカラムの値を変数に入れます。

続いて(2)でMySQLiクラスのオブジェクトを作成してデータベースの接続を行い、(3)で文字コードのセットを行います。

もし(2)のデータベース接続でエラーがあった場合はif文の中にあるecho関数でエラー番号のconnect_errnoプロパティと、エラー内容のconnect_errorプロパティを出力します。

データベースと接続

// (2)データベースと接続
$mysqli = new mysqli( 'maria', 'root', 'testtest', 'blue');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

// (3)文字コードを設定
$mysqli->set_charset('utf8');

続いて、削除を実行するためのSQLをprepareメソッドに渡してプリペアドステートを実行する用意をします。
この時点ではWHERE句に削除するidカラムの値を書かず、代わりにプレースホルダー「?」を書きます。

(5)でbind_paramメソッドを使って先ほどのプレースホルダーに(1)で用意した変数の値をセットします。
bind_paramメソッドの第1パラメータに指定している「i」は値のデータ型を表し、「i」はintegerの頭文字です。

プリペアドステートメントの用意

// (4)プリペアドステートメントの用意
$stmt = $mysqli->prepare('DELETE FROM gc_user WHERE id = ?');

// (5)削除するidの値をセット
$stmt->bind_param('i', $id);

(6)で、ここまで用意したプリペアドステートメントを実行してデータを削除します。
この時点でuserテーブルから該当するデータが削除されます。

プリペアドステートメントを実行

// (6)削除実行
$stmt->execute();

最後にデータベースとの接続を解除して終了します。

データベースとの接続解除

// (7)データベースとの接続解除
$mysqli->close();

以上がMySQLiクラスのオブジェクトを使ったデータの削除方法です。

mysqli系の関数(手続き型)を使った書き方

続いて、mysqli系の関数(手続き型)を使ってデータを削除する方法を見ていきます。
オブジェクトのメソッドを関数に置き換えるだけなので、全体的な流れやSQL自体は先述のオブジェクトを使った方法と同じ内容です。

index.php

// (1)削除するデータを特定するためIDを用意
$id = 6;

// (2)データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

// (3)文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

// (4)プリペアドステートメントの用意
$stmt = mysqli_prepare( $db_link, 'DELETE FROM user WHERE id = ?');

// (5)登録するデータをセット
mysqli_stmt_bind_param( $stmt, 'i', $id);

// (6)登録実行
mysqli_stmt_execute($stmt);

// (7)データベースとの接続解除
mysqli_close($db_link);

データを削除した後のuserテーブルを出力してみると、以下のようにidカラム6のデータを1行削除していることが確認できます。(idカラム5のデータは上記のオブジェクトを使った方法で削除済みです)

userテーブル

+----+---------------+--------+-----+---------------------+---------------------+
| id | name          | gender | age | modify_datetime     | create_datetime     |
+----+---------------+--------+-----+---------------------+---------------------+
|  1 | 青山 太郎     |      1 |  35 | 2016-10-04 00:00:00 | 2014-04-10 00:00:00 |
|  2 | 飯島 彩子     |      2 |  26 | 2016-10-02 00:00:00 | 2014-04-10 00:00:00 |
|  3 | 宇多 太郎     |      1 |  27 | 2016-10-01 00:00:00 | 2014-04-10 00:00:00 |
|  4 | 江藤 彩子     |      2 |  32 | 2016-09-20 00:00:00 | 2015-08-07 00:00:00 |
|  7 | 岸田 太郎     |      1 |  27 | 2021-11-30 18:35:00 | 2012-04-20 00:00:00 |
|  8 | 工藤 彩子     |      2 |  39 | 2016-10-01 00:00:00 | 2012-05-10 00:00:00 |
|  9 | 小島 太郎     |      1 |  30 | 2016-09-10 00:00:00 | 2012-04-20 00:00:00 |
| 10 | 佐藤 彩子     |      2 |  32 | 2016-09-24 00:00:00 | 2012-05-15 00:00:00 |
+----+---------------+--------+-----+---------------------+---------------------+

最初の(1)では削除するidカラムの値「6」を変数に入れます。

続いて、(2)でデータベースの接続情報を渡してmysqli_connect関数を実行してデータベースと接続し、接続情報が入ったオブジェクトを変数$db_linkで受け取ります。
このオブジェクトは以降のデータベースに関連する操作で使用します。

もしデータベース接続でエラーがあった場合はif文の中にあるecho関数でエラー番号のmysqli_connect_errno関数と、エラー内容のmysqli_connect_error関数から内容を取得して出力します。

接続後に(3)で文字コードのセットを行います。
mysqli_set_charset関数の第1引数には接続情報が入った$db_linkを渡していますが、mysqli系の関数ではどのデータベースに対して操作を行うか判定するために第1引数に接続情報を渡して実行します。

データベースと接続

// (2)データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

// (3)文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

続いて、削除を実行するためのSQLをmysqli_stmt_bind_param関数に渡してプリペアドステートを実行する用意をします。
この時点ではWHERE句に削除するidカラムの値を書かず、代わりにプレースホルダー「?」を書きます。

プリペアドステートメントの用意

// (4)プリペアドステートメントの用意
$stmt = mysqli_prepare( $db_link, 'DELETE FROM user WHERE id = ?');

// (5)登録するデータをセット
mysqli_stmt_bind_param( $stmt, 'i', $id);

mysqli_stmt_bind_param関数を実行すると戻り値として渡されるプリペアドステートメントのオブジェクトを変数$stmtで受け取ります。

(5)でmysqli_stmt_bind_param関数を使って先ほどのプレースホルダーに(1)で用意した変数の値をセットします。
mysqli_stmt_bind_param関数は第1引数に先ほどのプリペアドステートメントのオブジェクト、第2引数にはセットする値のデータの型、そして第3引数に置き換える値を渡します。
第2引数の「i」は値のデータ型を表し、「i」はintegerの頭文字です。

(6)でここまで用意したプリペアドステートメントを実行してデータを削除します。
この時点でuserテーブルから該当するデータが削除されます。

プリペアドステートメントを実行

// (6)登録実行
mysqli_stmt_execute($stmt);

最後にデータベースとの接続を解除して終了します。

データベースとの接続解除

// (7)データベースとの接続解除
mysqli_close($db_link);

以上がmysqli系の関数(手続き型)を使ったデータの削除方法になります。