データを削除する
SQLiteのデータベースに登録されているデータを削除する方法について、SQLite3クラスを使う方法とPDOを使う方法をそれぞれ解説します。
今回は次のようなテーブル「test_table」がすでにあることを前提に進めていきます。
| カラム名 | 型 | その他 | 
|---|---|---|
| id | INTEGER | PRIMARY KEY | 
| name | TEXT | NOT NULL | 
| age | INTEGER | NOT NULL | 
| created_datetime | TIMESTAMP | DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')) | 
Note
テーブルの作成方法については別記事「SQLiteにテーブルを作成する:CREATE TABLE」をご覧ください。
test_tableには次のようなデータが登録されていることとして、この中のデータを削除していきます。
test_tableのデータ一覧
1|山田|30|2022-05-19 14:02:04
2|石川|32|2022-05-19 23:04:25
3|佐藤|34|2022-05-19 23:04:48
4|高橋|36|2022-05-20 00:45:53
5|和田|38|2022-05-20 01:11:23SQLite3クラスでデータを削除する
まずはSQLite3クラスを使って、SQLiteのデータベースに登録されているデータを削除する方法を解説します。
以下のコードは(1)削除するデータを特定するためのidカラムを用意し、(2)データベースに接続して(3)削除するSQLを作成、そして(4)プリペアドステートメントによる削除の準備と(5)データを削除、(6)削除したデータの行数を確認して(7)データベースの接続を解除するという流れになっています。
PHP コード例
// (1)削除するデータのidカラムを用意
$id = 3;
// (2)データベースに接続
$db = new SQLite3("./sqlite/test.db");
// (3)SQL作成
$stmt = $db->prepare("DELETE FROM test_table
  WHERE
    id = :id
");
// (4)削除するデータをセット
$stmt->bindValue( ':id', $id, SQLITE3_INTEGER);
// (5)SQL実行
$stmt->execute();
// (6)削除したデータのカラム数を取得
var_dump($db->changes()); // int(1)
// (7)データベースの接続解除
$db->close();(3)のSQLを作成するタイミングでは、SQLに値を直接記入せずに「:id」のようなプレースホルダーを記述しています。
プレースホルダーは続く(4)のbindValueメソッドで値をセットします。
プリペアドステートメントを使わない方法でも削除することは可能ですが、SQLインジェクション対策含めて安全性の観点から特別な理由がない限りはプリペアドステートメントを使用にした方が無難です。
bindValueメソッドの第1パラメータは値をセットする先のプレースホルダー、第2パラメータはセットする値、そして第3パラメータはセットする値の型を用意された定数で指定します。
第3パラメータで指定する値の型の定数は以下の5種類から該当する定数を指定します。
| 定数名 | 値の型 | 
|---|---|
| SQLITE3_INTEGER | 整数(値の大きさに応じて1,2,3,4,6,8バイトで格納) | 
| SQLITE3_FLOAT | 浮動小数点数(8バイトのIEEE浮動小数点数値で格納) | 
| SQLITE3_TEXT | 文字列(データベースのエンコーディングで格納) | 
| SQLITE3_BLOB | blobデータ(入力をそのままの形式で格納) | 
| SQLITE3_NULL | NULL | 
今回は整数の値を持つidカラムのプレースホルダーに値をセットするため、定数はSQLITE3_INTEGERを指定します。
(5)でexecuteメソッドを実行すると、プリペアドステートメントで用意した内容が実行され、データベースから該当するデータを削除します。
今回はidカラムで削除するデータを絞っているため、(6)のchangesメソッドでは削除に成功すると整数の1、もし該当するデータが見つからなかったときは整数の0が返ってきます。
このメソッドの戻り値を確認することで、削除に成功したかを判断することができます。
上記のコードを実行すると、テーブルに登録されているデータのうちidカラムが3のデータが削除されます。
test_tableのデータ一覧
1|山田|30|2022-05-19 14:02:04
2|石川|32|2022-05-19 23:04:25
4|高橋|36|2022-05-20 00:45:53
5|和田|38|2022-05-20 01:11:23PDOでデータを削除する
続いて、PDOを使ってSQLiteのデータベースに登録されたデータを削除します。
以下のコードの基本的な流れはSQLite3クラスと同様です。
今回はidカラムが5のデータを削除します。
PHP コード例
// (1)削除するデータのidカラムを用意
$id = 5;
// (2)データベースに接続
$pdo = new PDO('sqlite:./sqlite/test.db');
// (3)SQL作成
$stmt = $pdo->prepare("DELETE FROM test_table
  WHERE
    id = :id
");
// (4)削除するデータをセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);
// (5)SQL実行
$res = $stmt->execute();
// (6)削除したデータのカラム数を取得
var_dump($stmt->rowCount()); // int(1)
// (7)データベースの接続解除
$pdo = null;(4)のプリペアドステートメントでプレースホルダーに値をセットするときに、第3パラメータで指定する型の定数名はPDO用のものに置き換わります。
| 定数名 | 値の型 | 
|---|---|
| PDO::PARAM_BOOL | Bool型 | 
| PDO::PARAM_INT | 整数 | 
| PDO::PARAM_STR | 文字列 | 
| PDO::PARAM_NULL | NULL | 
(6)ではrowCountメソッドで削除した行数を取得して削除が成功したかを確認します。
今回は削除するデータをidカラムで一意に絞っているため、削除が成功すると整数の1、該当するデータが見つからない場合などの理由で削除が実行されなかったときは整数の0を返します。
上記のコードを実行すると、テーブルに登録されているデータは以下のように更新されます。
test_tableのデータ一覧
1|山田|30|2022-05-19 14:02:04
2|石川|32|2022-05-19 23:04:25
4|高橋|36|2022-05-20 00:45:53以上、SQLiteのデータベースに登録されたデータを更新する方法でした。