PHPプログラミング

レシピ

データベース PDO

PDOでデータを更新(UPDATE)

データベースの基本操作である作成(INSERT)、参照(SELECT)、更新(UPDATE)、削除(DELETE)のうち更新(UPDATE)を行う方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースを使いながら解説します。

この記事のポイント

  • データベースに登録したデータを更新する
  • データベースのデータを更新する基本的なSQLを確認する
  • パラメータ形式でデータを更新する

目次

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

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

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

テーブル名:user_list
カラム名その他
id整数主キー
name文字列
age整数
registry_datetime日付(またはタイムスタンプ、文字列)

PDO自体の基本的な内容については「PDOについて」を、データベースへの接続方法については「PDOを使ってデータベースへ接続」をご覧ください。

データを更新する流れを確認

これから4種類のデータベースにあるデータをそれぞれ更新していきますが、今回は基本的なSQLのみ扱うため、全て同じSQL文が適用できます。
そこでまずは、データ更新の部分のみ確認しておきましょう。

データを更新するコード例

// SQL文を作成
$sql = "UPDATE user_list SET age = 20 WHERE id = 5";

// クエリ実行(データを取得)
$res = $dbh->query($sql);

上記SQLを実行するとuser_listテーブルにあるWHERE句で指定したデータが、SET句の内容に更新されます。
SQLの実行が成功するとPDOStatementを返し、それ以外の場合は論理値のfalseが入ります。

テーブルにデータが入っていなかったり、条件にあうデータがなく更新できなかった場合についても、文法エラーがなくSQLが実行されればPDOStatementオブジェクトを取得します。

更新の流れを確認したところで、続いてそれぞれのデータベース別に更新処理を行なっていきましょう。

MySQL / MariaDBでデータを更新する

まずはMySQLとMariaDBからデータの更新を行います。
この2つのデータベースは共通の方法で更新を行うことができるため、まとめて解説していきます。

更新前は次のようなデータが入っています。

更新前のテーブル

更新前のテーブル(MySQL or MariaDB)

ここでは、id5であるテスト健太さんのageを更新します。

先ほどのデータを更新するコードを使って、データベースの接続からコードにしていきます。
DBの接続と解除、データベースの処理をtry文で囲む部分については「PDOを使ってデータベースへ接続」で使ったものをそのまま使っています。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

try {
	// DBへ接続
	$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');

	// SQL作成
	$sql = "UPDATE user_list SET age = 25 WHERE id = 5";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

データの更新が成功すると、次のようにテーブル内のデータが更新されます。

更新後のテーブル

更新後のテーブル(MySQL)

テスト健太さんのage24から25へ更新されました。
以上、MySQLとMariaDBでのデータ更新でした。

PostgreSQLでデータを更新する

続いて、PostgreSQLでデータ更新を行います。
基本的にコードはMySQLと同様です。

更新前のテーブル

更新前のテーブル(PostgreSQL)

今回はid4を持つテスト五郎さんのage15に変更します。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

try {
	// DBへ接続
	$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');

	// SQL作成
	$sql = "UPDATE user_list SET age = 15 WHERE id = 4";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

更新後のテーブル

更新後のテーブル(PostgreSQL)

テスト五郎さんのage16から15へ更新されました。
データの更新に合わせ、並びも変わっています。

以上、PostgreSQLでのデータ更新でした。

SQLiteでデータを更新する

最後にSQLiteでデータの更新を行います。
全体の流れは上記2つのデータベースと同じ内容です。

更新前のテーブル

更新前のテーブル(SQLite)

ここでは、id5であるテストあゆみさんのageを更新していきます。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

try {
	// DBへ接続
	$dbh = new PDO("sqlite:./sqlite/test.sqlite3");

	// SQL作成
	$sql = "UPDATE user_list SET age = 22 WHERE id = 5";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

更新後のテーブル

更新後のテーブル(SQLite)

テストあゆみさんのage21から22へ更新されました。
以上、SQLiteでのデータ更新でした。

プリペアドステートメント(prepare)でパラメータを使ってデータを更新する

ここまでは値を直接指定して登録する方法を紹介してきましたが、最後にプリペアドステートメントを使ってパラメータ形式で登録する方法を紹介します。
この方法はいずれのデータベースでも同様に使用できますが、以下の例ではMariaDBを使います。

プリペアドステートメントでパラメータを指定する方法は「名前付きパラメータ」と「疑問符パラメータ」のいずれかを選ぶことができます。

名前付きパラメータ

「名前付きパラメータ」は、SQLにパラメータで値を指定したい箇所を「:パラメータ名」の形で記述します。
変数のようなイメージです。

SQLの例

// SQLを作成
$sql = 'UPDATE test SET category = :category WHERE name = :name';

このSQLに値を渡して実行してみましょう。

コード例

<?php

// 変数の初期化
$sql = null;
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', 'username', 'password');
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'UPDATE test SET category = :category WHERE name = :name';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array(
    ':category' => 2,
    ':name' => 'エメラルドマウンテン'
));

// DB接続を解除
$statement = null;
$db_handle = null;

作成したSQLを「// SQL実行準備」で渡して実行準備をし、「// 値を渡して実行」のexecuteメソッドでそれぞれのパラメータに対応する値を指定します。

実行後、更新が成功したら「true」、失敗したら「false」が渡され$resultに入ります。

ちなみに、パラメータと値が対応していれば指定する順番は自由に記述するができます。
例えば、SQLでは「:category」「:name」の順で記述されていますが、値を渡すときは「:name」「:category」のように反対の順番で指定しても正しくデータを更新することができます。

値の指定例

// SQL作成
$sql = 'UPDATE test SET category = :category WHERE name = :name';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array(
    ':name' => 'エメラルドマウンテン',
    ':category' => 2 
));

疑問符パラメータ

「疑問符パラメータ」は、SQL文の中にパラメータを渡したい箇所に「?」を記述します。

SQLの例

// SQL作成
$sql = 'UPDATE test SET category = ? WHERE name = ?';

パラメータの値は次のように配列形式で渡します。

コード例

<?php

// 変数の初期化
$sql = null;
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', ‘username’, ‘password’);
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'UPDATE test SET category = ? WHERE name = ?';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array( 4, 'エメラルドマウンテン'));

// DB接続を解除
$statement = null;
$db_handle = null;

「疑問符パラメータ」は配列の先頭から順に「?」に当てはめていくため、値は正しい順番で指定する必要がありいます。

以上がパラメータを使ったデータの更新方法です。
今回のようなシンプルなSQLでは「疑問符パラメータ」も有効ですが、もう少し複雑になると「名前付きパラメータ」の方がパラメータと値の関係が分かりやすくなるため記述ミスなどが起きにくくなりオススメです。

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

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

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