PHPプログラミング

最終更新日:
公開日:

レシピ

データベース MySQL / MariaDB

mysqliでMySQL/MariaDBのデータを更新:UPDATE

MySQLiクラスのオブジェクトや関数を使って、データベースにあるデータを更新する方法を解説していきます。

この記事のポイント

  • MySQLiクラスのオブジェクトや関数を使ってMySQL / MariaDBに登録されているデータを更新する
  • データの更新ではプリペアドステートメントを使う
  • オブジェクト、または関数(手続き型)を使った2通りの方法を解説

目次

データベースのデータを更新する

MySQLiクラスのオブジェクトや関数とSQLのUPDATE文を使って、データベースにあるデータを更新していきます。
今回は次のようなuserテーブルを使って進めていきます。

テーブル名:user
idnamegenderagemodify_datetimecreate_datetime
1青山 太郎1352016-10-04 00:00:002014-04-10 00:00:00
2飯島 彩子2262016-10-02 00:00:002014-04-10 00:00:00
3宇多 太郎1272016-10-01 00:00:002014-04-10 00:00:00
4江藤 彩子2322016-09-20 00:00:002015-08-07 00:00:00
5大島 太郎1222016-09-03 00:00:002012-10-05 00:00:00
6加藤 彩子2412016-09-18 00:00:002012-04-20 00:00:00
7岸田 太郎1272016-09-18 00:00:002012-04-20 00:00:00
8工藤 彩子2392016-10-01 00:00:002012-05-10 00:00:00
9小島 太郎1302016-09-10 00:00:002012-04-20 00:00:00
10佐藤 彩子2322016-09-24 00:00:002012-05-15 00:00:00

各カラムの役割は次の通りです。

  • id – ID(主キー、AUTO INCREMENT)
  • name – 名前
  • gender – 性別。1は男性、2は女性
  • age – 年齢
  • modify_datetime – データ更新日時
  • create_datetime – データ登録日時

まず、SQLのUPDATE文の基本的な形を確認しましょう。

SQLのUPDATE文

UPDATE テーブル名 SET
	カラム名1 = 更新後の値1,
	カラム名2 = 更新後の値2,
	カラム名3 = 更新後の値3
WHERE カラム名 = ;

テーブル名、更新するカラムと値のセット、そして更新データを特定するカラムと値のセットをそれぞれ指定します。
SET句以降に更新したいカラム名と値のセットを必要なだけ記述し、WHERE句に更新するデータを特定する条件を記述します。

例えば、今回のuserテーブルにあるデータを更新する場合であれば次のようになります。

SQLのUPDATE文

UPDATE user SET
	name = '岸田 タロウ',
	age = 28,
	modify_datetime = '2021-11-30 18:20:00'
WHERE id = 7;

このSQLを元に、MySQLiクラスのオブジェクトと関数(手続き型)の2つのパターンを使った方法を見ていきます。
どちらの方法でもSQLを実行するときはプリペアドステートメントを使います。

今回の方法はMySQL、MariaDBのいずれも同じコードで動作します。

なお、データベースへの接続までは「mysqliを使ってMySQL/MariaDBのデータベースへ接続」と同様です。
より詳しくはこちらの記事をご覧ください。

オブジェクトを使った書き方

MySQLiクラスのインスタンスを生成し、データベースのデータを更新する方法です。

index.php

// (1)更新するデータを用意
$id = 7;
$name = '岸田 タロウ';
$age = 28;
$modify_datetime = '2021-11-30 18:20:00';

// (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('UPDATE user SET
	name = ?,
	age = ?,
	modify_datetime = ?
WHERE id = ?');

// (5)更新するデータをセット
$stmt->bind_param('sisi', $name, $age, $modify_datetime, $id);

// (6)更新実行
$stmt->execute();

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

データを更新した後のuserテーブルを出力してみると、以下のようにデータが更新されていることがわかります。

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 |  28 | 2021-11-30 18:20: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)でデータベースへの接続を行ないます。
もしここで接続にエラーがあった場合は、3行目のif文の中にあるecho関数でエラー内容が出力されます。
エラー番号のconnect_errnoプロパティとエラー内容のconnect_errorプロパティをそれぞれ出力し、エラーの内容を特定するヒントを表示します。

データベースと接続

// (2)データベースと接続
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

(3)ではデータベースで使う文字コードを設定します。

(4)でprepareメソッドを使ってプリペアドステートメントを実行する準備を行います。
この時点では更新するデータの値は書かず、プレースホルダーの「?」を記述します。
このプレースホルダーは(5)でbind_paramメソッドを使って登録するデータの値をセットします。

プリペアドステートメントの用意

// (4)プリペアドステートメントの用意
$stmt = $mysqli->prepare('UPDATE user SET
	name = ?,
	age = ?,
	modify_datetime = ?
WHERE id = ?');

// (5)更新するデータをセット
$stmt->bind_param('sisi', $name, $age, $modify_datetime, $id);

bind_paramメソッドのパラメーター(引数)には(1)で用意した変数の前に「sisi」という文字があります。
これは先ほどのプレースホルダーを変数の値に置き換えるときのデータの型を指定するものです。
s」はstring(文字列)の頭文字、「i」はinteger(整数)の頭文字になります。

今回はプレースホルダーが4つあるので、先頭から順に「$name -> s」、「$age -> i」、「$modify_datetime -> s」、「$id -> i」と対応させていることになります。
この順番はprepareメソッドで書いたSQLのプレースホルダーを先頭から並べたものになっています。

(6)で、ここまで用意したプリペアドステートメントを実行してデータを更新します。
この時点でuserテーブルの該当するデータの値が更新されます。

プリペアドステートメントを実行

// (6)更新実行
$stmt->execute();

最後にcloseメソッドでデータベースとの接続を解除して終了します。

データベースとの接続解除

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

以上がMySQLiクラスのオブジェクトを使ったデータの登録方法でした。

mysqli系の関数(手続き型)を使った書き方

続いて、mysqli系の関数(手続き型)を使ってデータを更新する方法を見ていきます。
オブジェクトを関数に置き換えるだけなので、全体的な流れやSQL自体は先述のオブジェクトを使った方法と同じ内容です。

index.php

// (1)登録するデータを用意
$id = 7;
$name = '岸田 太郎';
$age = 27;
$modify_datetime = '2021-11-30 18:35:00';

// (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, 'UPDATE user SET
	name = ?,
	age = ?,
	modify_datetime = ?
WHERE id = ?');

// (5)登録するデータをセット
mysqli_stmt_bind_param( $stmt, 'sisi', $name, $age, $modify_datetime, $id);

// (6)登録実行
mysqli_stmt_execute($stmt);

// (7)データベースとの接続解除
mysqli_close($db_link);

データを更新した後のuserテーブルを出力してみると、以下のようにデータが更新されていることがわかります。

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 | 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)では新しく登録するデータの各カラムの値を変数に入れます。

続く(2)ではmysqli_connect関数を実行してデータベースの接続を行います。
関数を実行するとデータベースの接続情報が返されるので、変数$db_linkで受け取ります。

もし接続にエラーがあった場合は、if文の中にあるecho関数mysqli_connect_errno関数からエラー番号と、mysqli_connect_error関数からエラー内容をそれぞれ取得して出力します。

データベースに接続

// (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関数を使ってデータベースの文字コードを指定します。
関数を使った方法では、データベースに関連する操作を実行する関数は第1引数にデータベースの接続情報(オブジェクト)を渡す必要があります。

文字コードの設定

// (3)文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

(4)はmysqli_prepare関数にSQLを渡してプリペアドステートメントを実行する準備をして、続く(5)でmysqli_stmt_bind_param関数を使って更新するデータをセットします。
プレースホルダーを使ったSQLの記述と値のセットについては先述のオブジェクトを使った書き方と同様です。

プリペアドステートメントの用意

// (4)プリペアドステートメントの用意
$stmt = mysqli_prepare( $db_link, 'UPDATE user SET
	name = ?,
	age = ?,
	modify_datetime = ?
WHERE id = ?');

// (5)登録するデータをセット
mysqli_stmt_bind_param( $stmt, 'sisi', $name, $age, $modify_datetime, $id);

ここまで用意したプリペアドステートメントを(6)で実行してデータを更新します。
この時点でuserテーブルにある該当するデータが更新されます。

プリペアドステートメントを実行

// (6)登録実行
mysqli_stmt_execute($stmt);

最後にmysqli_close関数でデータベースとの接続を解除して終了します。

データベースとの接続解除

// (7)データベースとの接続解除
mysqli_close($db_link);

以上がmysqli系の関数(手続き型)を使ったデータの更新方法になります。

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

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

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