PHPプログラミング

最終更新日:
公開日:

レシピ

データベース PDO

PDOでデータを更新(UPDATE)

データベースの基本操作である作成(INSERT)、取得(SELECT)、更新(UPDATE)、削除(DELETE)のうち、更新(UPDATE)を行う方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースそれぞれの場合に分けて解説します。

この記事のポイント

  • データベースに登録したデータを更新する
  • データの更新ではプリペアドステートメントを使用する

目次

PDOを使ってデータを更新する

今回はデータベースに登録されたデータを取得する方法について解説します。

前提として全てのデータベースには「test」というデータベースがあり、以下の構造を持つuser_listテーブルがあることとします。

テーブル名: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である「テスト健太」さんのnameageを更新していきます。

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カラム3nameカラムageカラムの2箇所が(1)で設定した値に更新されていることが確認できました。

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

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

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