最終更新日:
公開日:
レシピ
データベース PDO
PDOでデータを更新(UPDATE)
データベースの基本操作である作成(INSERT)、取得(SELECT)、更新(UPDATE)、削除(DELETE)のうち、更新(UPDATE)を行う方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースそれぞれの場合に分けて解説します。
この記事のポイント
- データベースに登録したデータを更新する
- データの更新ではプリペアドステートメントを使用する
目次
PDOを使ってデータを更新する
今回はデータベースに登録されたデータを取得する方法について解説します。
前提として全てのデータベースには「test」というデータベースがあり、以下の構造を持つuser_listテーブルがあることとします。
カラム名 | 型 | その他 |
---|---|---|
id | 整数 | 主キー |
name | 文字列 | |
age | 整数 | |
created_at | 日付(またはタイムスタンプ、文字列) |
PDO自体の基本的な内容については「PDOについて」を、データベースへの接続方法については「PDOを使ってデータベースへ接続」をご覧ください。
データを更新する流れを確認
PDOを使った4種類のデータベースにおけるデータの更新方法は全体的な流れは共通しています。
そこでまずは、全体的な流れを確認しておきましょう。
以下のコードはMySQLとMariaDBを使っていますが、ここではデータベースの違いではなく流れに注目してください。
データを更新するコード例
<?php
// (1) 更新するデータを用意
date_default_timezone_set('Asia/Tokyo');
$id = 3;
$name = '高岡幸子';
$age = 26;
// (2) データベースに接続
$pdo = new PDO('mysql:charset=UTF8;dbname=test;host=localhost', 'username', 'password');
// (3) SQL作成
$stmt = $pdo->prepare("UPDATE user_list SET name = :name, age = :age 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);
// (5) SQL実行
$res = $stmt->execute();
// (6) データベースの接続解除
$pdo = null;
上記SQLを実行するとuser_listテーブルにあるWHERE句で指定したidを持つデータがSET句で指定した値に更新されます。
(5)のexecuteメソッドを実行してデータの登録に成功するとtrueを返し、失敗した場合はfalseを返します。
以降はデータベースの種類別にデータ更新を実行していきます。
MySQL / MariaDBでデータを更新する
まずはMySQLとMariaDBからデータの更新を行います。
こちらの2つのデータベースは互換性があるため、同じコードで更新を行うことができます。
更新前は次のようなデータが入っていて、idカラムが5である「テスト健太」さんのnameとageを更新していきます。
user_list 更新前
id | name | age | created_at
----+------------+-----+------------
1 | 山田太郎 | 34 | 2021-06-24 11:20:00
2 | 山田太郎 | 33 | 2021-06-24 11:20:00
3 | 高岡幸子 | 30 | 2021-06-24 11:20:00
4 | 山田太郎 | 30 | 2021-06-24 09:12:47
5 | テスト健太 | 30 | 2021-06-01 10:49:05
コードは先ほど「データを更新する流れを確認」の箇所で紹介したコードをほぼそのまま使いますが、(1)でセットする値のみ変更します。
コード例
<?php
// (1) 更新するデータを用意
$id = 5;
$name = '山田健太';
$age = 28;
// (2) データベースに接続
$pdo = new PDO('mysql:charset=UTF8;dbname=test;host=localhost', 'username', 'password');
// (3) SQL作成
$stmt = $pdo->prepare("UPDATE user_list SET name = :name, age = :age 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);
// (5) SQL実行
$res = $stmt->execute();
// (6) データベースの接続解除
$pdo = null;
実行してデータの更新が成功すると、次のようにテーブル内のデータが更新されます。
user_list 更新後
id | name | age | created_at
----+------------+-----+------------
1 | 山田太郎 | 34 | 2021-06-24 11:20:00
2 | 山田太郎 | 33 | 2021-06-24 11:20:00
3 | 高岡幸子 | 30 | 2021-06-24 11:20:00
4 | 山田太郎 | 30 | 2021-06-24 09:12:47
5 | 山田健太 | 28 | 2021-06-01 10:49:05
更新する前は「テスト健太」さんだったデータのageカラムが28に更新され、nameカラムは「山田健太」へと更新されました。
PostgreSQLでデータを更新する
続いて、PDOでPostgreSQLに入っているデータの更新を行います。
基本的なコードはMySQLと同様ですが、データベース接続部分など細かいところに違いが出てきます。
今回はテーブル「user_list」に以下のようなデータが入っていることとします。
user_list 更新後
id | name | age | created_at
----+------------+-----+------------
1 | 山田太郎 | 30 | 2021-06-25
2 | 山田太郎 | 30 | 2021-06-25
3 | 山田太郎 | 30 | 2021-06-25
4 | 山田太郎3 | 30 | 2021-06-25
6 | 山田太郎4 | 35 | 2021-06-01
7 | 山田太郎4 | 35 | 2021-06-27
5 | 高岡幸子 | 26 | 2021-06-01
今回はidカラムに3が入っているデータのnameカラムとageカラムを更新していきます。
以下のコードはほとんどが先述のMySQLのコードと同じ内容ですが、赤字になってる「(2) データベースに接続」部分が主な変更点です。
コード例
<?php
// (1) 更新するデータを用意
$id = 3;
$name = '山田健太';
$age = 26;
// (2) データベースに接続
$pdo = new PDO('pgsql:dbname=test;options=\'--client_encoding=UTF8\';host=localhost', 'username', 'password');
// (3) SQL作成
$stmt = $pdo->prepare("UPDATE user_list SET name = :name, age = :age 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);
// (5) SQL実行
$res = $stmt->execute();
// (6) データベースの接続解除
$pdo = null;
user_list 更新後
id | name | age | created_at
----+------------+-----+------------
1 | 山田太郎 | 30 | 2021-06-25
2 | 山田太郎 | 30 | 2021-06-25
4 | 山田太郎3 | 30 | 2021-06-25
6 | 山田太郎4 | 35 | 2021-06-01
7 | 山田太郎4 | 35 | 2021-06-27
5 | 高岡幸子 | 26 | 2021-06-01
3 | 山田健太 | 26 | 2021-06-25
idカラムに3を持つデータのnameカラムとageカラムが(1)の変数にセットした内容へ更新されました。
SQLiteでデータを更新する
最後にSQLiteでデータの更新を行います。
全体の流れは上記2つのデータベースと同じです。
今回はテーブル「user_list」に以下のようなデータが入っていることとします。
user_list 更新前
1|山田太郎|30|2021-06-25 13:22:50
2|佐藤遥|26|2021-06-27 11:02:54
3|岡部|19|2021-06-27 11:03:07
4|橋田至|18|2021-06-27 11:03:19
5|杉田咲|23|2021-06-27 11:03:33
ここでは、idカラムに3が入っているデータのnameカラムとageカラムを更新していきます。
コード例
<?php
// (1) 登録するデータを用意
$id = 3;
$name = '岡部倫太郎';
$age = 21;
// (2) データベースに接続
$pdo = new PDO('sqlite:./sqlite/test.sqlite3');
// (3) SQL作成
$stmt = $pdo->prepare("UPDATE user_list SET name = :name, age = :age 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);
// (5) SQL実行
$res = $stmt->execute();
// (6) データベースの接続解除
$pdo = null;
user_list 更新後
1|山田太郎|30|2021-06-25 13:22:50
2|佐藤遥|26|2021-06-27 11:02:54
3|岡部倫太郎|21|2021-06-27 11:03:07
4|橋田至|18|2021-06-27 11:03:19
5|杉田咲|23|2021-06-27 11:03:33
idカラムが3のnameカラムとageカラムの2箇所が(1)で設定した値に更新されていることが確認できました。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。