PHPプログラミング

最終更新日:
公開日:

レシピ

データベース SQLite

SQLiteのデータを更新する:UPDATE

SQLiteのテーブルに登録されているデータを更新する方法について解説します。

この記事のポイント

  • SQLiteのデータベースに登録されているデータを更新する
  • データを更新する方法はSQLite3クラスを使う方法、PDOを使う方法がある
  • データを登録するときはプリペアドステートメントを使う

目次

SQLiteに登録されているデータを更新する

SQLiteのデータベースに登録されているデータを更新する方法について、SQLite3クラスを使う方法とPDOを使う方法をそれぞれ解説します。

今回は次のようなテーブル「test_table」がすでにあることを前提に進めていきます。

テーブル名:test_table
カラム名その他
idINTEGERPRIMARY KEY
nameTEXTNOT NULL
ageINTEGERNOT NULL
created_datetimeTIMESTAMPDEFAULT (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:23

SQLite3クラスでデータを更新する

まずはSQLite3クラスを使って、SQLiteのデータベースに登録されたデータを更新する方法を解説します。

以下のコードは(1)登録する値を用意し、(2)データベースに接続して(3)更新するSQLを作成、そして(4)プリペアドステートメントによる更新の準備、(5)データを登録(更新を実行)、(6)更新したデータのカラム数を確認して(7)データベースの接続を解除するという流れになっています。

index.php

// (1)登録するデータを用意
date_default_timezone_set('Asia/Tokyo');
$id = 4;
$name = '高橋(更新テスト)';
$age = 37;
$created = date('Y-m-d H:i:s');

// (2)データベースに接続
$db = new SQLite3("./sqlite/test.db");

// (3)SQL作成
$stmt = $db->prepare("UPDATE test_table
	SET
		name = :name,
		age = :age,
		created = :created
	WHERE
		id = :id
");

// (4)更新するデータをセット
$stmt->bindValue( ':id', $id, SQLITE3_INTEGER);
$stmt->bindValue( ':name', $name, SQLITE3_TEXT);
$stmt->bindValue( ':age', $age, SQLITE3_INTEGER);
$stmt->bindValue( ':created', $created, SQLITE3_TEXT);

// (5)SQL実行
$stmt->execute();

// (6)更新したデータのカラム数を取得
var_dump($db->changes()); // int(1)

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

(3)のSQLを作成するタイミングでは、値をSQLに直接記入せずに「:name」のようにプレースホルダーを記述します。
プレースホルダーへの値のセットは(4)のbindValueメソッドを使って実行します。
プリペアドステートメントを使わない方法でも更新する方法はありますが、SQLインジェクション対策含めて安全性の観点から特別な理由がない限りはプリペアドステートメントを使用にした方が無難です。

bindValueメソッドの第1パラメータは値をセットする先のプレースホルダー、第2パラメータはセットする値、そして第3パラメータはセットする値の型を用意された定数で指定します。
値の型については、以下の5種類から該当する定数を指定してください。

定数名値の型
SQLITE3_INTEGER整数(値の大きさに応じて1,2,3,4,6,8バイトで格納)
SQLITE3_FLOAT浮動小数点数(8バイトのIEEE浮動小数点数値で格納)
SQLITE3_TEXT文字列(データベースのエンコーディングで格納)
SQLITE3_BLOBblobデータ(入力をそのままの形式で格納)
SQLITE3_NULLNULL

(5)でexecuteメソッドを実行すると、ここまでプリペアドステートメントで準備した内容が実行されて、データベースに更新内容が反映されます。

今回はidカラムで更新するデータを1つに絞っているため、更新が成功すると(6)のchangesメソッドでは整数の1が得られます。
changesメソッドは更新したデータの行数を整数で返すため、もし該当するデータが見つからなかったときは整数の0が返ってきます。
この値を使うことで、更新が成功したかを判断することができます。

上記のコードを実行すると、テーブルに登録されているデータは以下のように更新されます。

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|高橋(更新テスト)|37|2022-06-02 15:00:15
5|和田|38|2022-05-20 01:11:23

PDOでデータを更新する

続いて、PDOを使ってSQLiteのデータベースに登録されたデータを更新します。
以下のコードは、基本的な流れはSQLite3クラスと同様になります。

今回はidカラム3のデータを更新します。

index.php

// (1)登録するデータを用意
date_default_timezone_set('Asia/Tokyo');
$id = 3;
$name = '佐藤(更新テスト)';
$age = 35;
$created = date('Y-m-d H:i:s');

// (2)データベースに接続
$pdo = new PDO('sqlite:./sqlite/test.db');

// (3)SQL作成
$stmt = $pdo->prepare("UPDATE test_table
	SET
		name = :name,
		age = :age,
		created = :created
	WHERE
		id = :id
");

// (4)登録するデータをセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);
$stmt->bindParam( ':name', $name, PDO::PARAM_STR);
$stmt->bindParam( ':age', $age, PDO::PARAM_INT);
$stmt->bindParam( ':created', $created, PDO::PARAM_STR);

// (5)SQL実行
$res = $stmt->execute();

// (6)更新したデータのカラム数を取得
var_dump($stmt->rowCount()); // int(1)

// (7)データベースの接続解除
$pdo = null;

(4)のプリペアドステートメントでプレースホルダーに値をセットするときに、第3パラメータで指定する型の定数名はPDO用のものに置き換わります。

定数名値の型
PDO::PARAM_BOOLBool型
PDO::PARAM_INT整数
PDO::PARAM_STR文字列
PDO::PARAM_NULLNULL

(6)ではrowCountメソッドを使ってデータを更新した行数を取得することで、更新が成功したかを確認します。
今回は更新するデータをidカラムで一意に絞っているため、更新が成功すると整数の1、もし該当するデータが見つからない場合などの理由で更新できなかったときは整数の0が返ってきます。

上記のコードを実行すると、テーブルに登録されているデータは以下のように更新されます。

test_tableのデータ一覧

1|山田|30|2022-05-19 14:02:04
2|石川|32|2022-05-19 23:04:25
3|(更新テスト)|35|2022-05-19 23:04:48
4|高橋(更新テスト)|37|2022-06-02 15:00:15
5|和田|38|2022-05-20 01:11:23

以上、SQLiteのデータベースに登録されたデータを更新する方法でした。

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

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

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