最終更新日:
公開日:
レシピ
データベース MySQL / MariaDB
mysqliでMySQL/MariaDBのデータを削除:DELETE
MySQLiクラスのオブジェクトや関数を使って、データベースのデータを削除する方法を解説していきます。
この記事のポイント
- MySQLiクラスのオブジェクトや関数を使ってMySQL / MariaDBのデータベースにあるデータを削除する
- データの削除ではプリペアドステートメントを使う
- オブジェクト、または関数(手続き型)を使った2通りの方法を解説
目次
データベースのデータを削除する
MySQLiクラスのオブジェクトや関数とSQLのDELETE文を使って、データベースにあるデータを削除していきます。
今回は次のような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 |
5 | 大島 太郎 | 1 | 22 | 2016-09-03 00:00:00 | 2012-10-05 00:00:00 |
6 | 加藤 彩子 | 2 | 41 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
7 | 岸田 太郎 | 1 | 27 | 2016-09-18 00:00: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 |
各カラムの役割は次の通りです。
- 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系の関数(手続き型)を使ったデータの削除方法になります。