PHPプログラミング

最終更新日:
公開日:

レシピ

データベース PostgreSQL

PostgreSQLでデータを更新する:UPDATE

PostgreSQLデータベースのテーブルにあるデータを更新する方法について解説します。

この記事のポイント

  • PostgreSQLのデータ更新はPostgreSQL用の関数を使う方法と、PDOを使う方法がある

目次

テーブルにあるデータを更新する

今回はテーブルに存在するデータを更新していきます。

ここでは解説用に「カフェのメニュー」を題材にして、次のようなテーブルを想定して進めていきます。

テーブル名:menu
カラム名その他
idINT(11)主キー
nameVARCHAR(20)
priceINT(11)
modify_datetimeDATETIME
create_datetimeDATETIME

id」はデータを管理する上で便利な一意となるID、「name」と「price」はメニュー名と価格、そして最後の2つはデータ更新日と登録日です。
また、テーブルには次のようなデータが登録されていることを前提に進めます。

テーブル内に登録されたデータ

PostgreSQLのデータの更新方法について、PHPではpg_query関数を使う方法、 pg_update関数を使う方法、そしてPDOを使う方法の3種類が標準で用意されています。
これらの方法について、順番に1つずつ解説をしていきます。

pg_query関数を使ってデータを更新する

PostgreSQLの関数を使って更新する方法はpg_query関数を使う方法とpg_update関数の2つが用意されています。
2つの違いはSQL文を必要とするかどうかで、pg_query関数はSQL文を指定して使いますが、pg_update関数は直接SQLを指定しなくても使うことができます。
まずはpg_query関数を使った方法から解説していきます。

pg_query関数はSQL文を指定して使う関数で、データの更新以外に新規登録や削除など各種操作で使うことができる汎用性の高い関数です。

SQLのUPDATE文の基本構造は次のようになります。

UPDATE文の基本的な形

UPDATE テーブル名 SET カラム名 = 登録したいデータ WHERE 更新するデータを特定する条件式」が更新するSQLの基本の形です。

SETの後ろに続く「カラム = 登録したいデータ」で複数のデータを更新したい場合、「,(コンマ)」で区切って指定します。
WHERE句の後ろに続く条件式も同様です。

実際にコードをみていきましょう。
今回は「カフェオレ」の価格を480から550に変更していきます。

コード例

<?php
// (1)変数の初期化
$res = null;
$pg_conn = null;
$sql = null;
$date = null;

// (2)タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d");

// (3)データベースへ接続
$pg_conn = pg_connect("host=localhost port=5432 dbname=test user=testuser password=testtest");

if( $pg_conn ) {

	// (4)更新するSQLを作成
	$sql = "UPDATE menu SET price = 550, modify_datetime = '$date' WHERE id = 2";

	// (5)更新を実行
	$res = pg_query( $pg_conn, $sql);
	var_dump(pg_result_status($res));
	
} else {
	var_dump("接続できませんでした");
}

// (6)データベースとの接続を解除
pg_close($pg_conn);

上記のコードを実行すると、以下のようにデータベースのデータが更新されます。

更新前のデータ
更新後のデータ

ここからはコードの解説に入ります。

上記のSQLではカフェオレに該当するデータを更新するために、WHERE句idカラム2の行のデータを更新します。
更新する内容はpriceカラム(価格)とmodify_datetimeカラム(更新日)の2つです。
SQLを実行する前に、(2)の箇所で現在の日時を$dateに取得して登録することで、更新日時がデータベースに反映されます。

扱うデータの型が「文字列型」の場合は、値を「'」で囲ってあげる必要があります。
整数型(int)は囲っても問題ありませんが、必須ではないので囲まなくても大丈夫です。

$resの中にはqueryメソッドから返される結果オブジェクトが入ります。
SQLクエリの実行がうまくいったかを判断するときはpg_result_status関数を使って確認することができます。
実行が正常に終了した場合は1(int型)、文法エラーなどで失敗した場合はfalseが入ります。

以上がpg_query関数を使った更新方法です。

pg_update関数を使ってデータを更新する

続いて、pg_update関数を使ったデータの更新方法を解説していきます。

pg_update関数はデータの更新のみを行うことができる関数です。
用途は更新のみですが、SQL文が不要なため扱いやすいことが特徴になります。
主に、次の4つのパラメータを指定して使います。

pg_update関数の基本的なコード例

pg_update( DBオブジェクト, テーブル名, 更新するデータ, 更新対象の条件);

1つ目のパラメータは接続しているデータベースのオブジェクト、2つ目のパラメータは更新データのあるテーブル名を指定します。

3つ目と4つ目のパラメータは更新後のデータと、更新対象を絞り込むためのデータをそれぞれ指定します。

5つ目のパラメータをオプションとして指定することも可能ですが今回は割愛します。
詳しくはphp.netをご覧ください。
pg_update関数 – php.net

返り値は論理値になり、更新に成功したらtrue、失敗したらfalseを返します。

実際にコードを確認していきましょう。
カフェオレのpriceカラム(価格)を700へ更新するコードです。

コード例

<?php
// (1)変数の初期化
$res = null;
$pg_conn = null;
$sql = null;
$date = null;

// (2)タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d");

// (3)データベースへ接続
$pg_conn = pg_connect("host=localhost port=5432 dbname=test user=testuser password=testtest");

if( $pg_conn ) {

	// (4)更新するデータ(行)を絞り込む条件
	$key = array(
		'id' => 2
	);

	// (5)更新後のデータ
	$data = array(
		'price' => 700,
		'modify_datetime' => $date
	);

	// (6)クエリ実行
	var_dump(pg_update( $pg_conn, 'menu', $data, $key));
	
} else {
	var_dump("接続できませんでした");
}

// (7)データベースとの接続を解除
pg_close($pg_conn);

こちらのコードでは$keyに更新するデータ(行)を絞り込む条件を指定しています。
今回はカフェオレの価格を更新したいので、id2を指定します。

もう1つの配列$dataには更新後のデータを格納しています。
priceカラム(価格)を700、そしてmodify_datetimeカラム(更新日)が更新した日時になるようにセットしています。

これらの値を(6)の箇所でpg_update関数へ渡して実行することでデータベースの値が更新されます。
var_dump関数で出力する返り値は論理値になり、成功した場合はtrue、失敗した場合はfalseです。

以上がpg_update関数を使った更新方法です。

PDOでデータを更新する

PDOを使ってデータを登録する場合は、上記のpg_query関数と同様にSQL文を作成して実行します。
PDOオブジェクトのインスタンス作成、データベースへの接続については「PostgreSQLデータベースへ接続」で解説している方法と同じコードを使います。

データを更新するSQL文を作成して、queryメソッドを実行してみましょう。

コード例

<?php
// (1)変数の初期化
$res = null;
$pdo_conn = null;
$sql = null;
$date = null;

// (2)現在の日付を取得
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d");

try {
	// (3)データベースへ接続
	$pdo_conn = new PDO( 'pgsql:host=localhost; dbname=test;', 'testuser', 'testtest' );	

	// (4)データを更新するSQLを作成
	$sql = "UPDATE menu SET price = 600, modify_datetime = '$date' WHERE id = 2";

	// (5)データの更新を実行
	$res = $pdo_conn->query( $sql);
	var_dump($res);

} catch(PDOException $e) {

	var_dump($e->getMessage());
}

// (6)接続を切断
$pdo_conn = null;

成功した場合は次のように実行したSQL文が出力され、失敗した場合はfalseが出力されます。

実行結果

object(PDOStatement)[2]
  public 'queryString' => string 'UPDATE menu SET price = 600, modify_datetime = '2017-04-26' WHERE id = 2' (length=72)

SQL文自体は先述のpg_query関数を使ってデータを更新するで使用したものと同じ内容です。
priceカラム(金額)の値のみ600に変更しています。
このSQL文はPostgreSQL以外のデータベースでも使うことができます。

以上、PostgreSQLのデータを更新する方法についての解説でした。