PHPのPostgreSQLへ接続してinsert/update/deleteするサンプルです。
(確認環境:PHP 7.2.8,PostgreSQL 11.5,Windows 10)
目次
SQLの実行 | insertのサンプル |
updateのサンプル | |
deleteのサンプル | |
プレースホルダ | |
例外発生時 | |
環境 | php.iniの設定 |
接続先のデータベースとテーブル |
insertのサンプル
PostgreSQLに接続してインサートを実行するサンプルです。
<?php
// DB接続情報
$dsn = 'pgsql:host=localhost;dbname=testdb10';
$username = 'postgres';
$password = 'test1';
$id = 2; //プレースホルダの値を指定
$name = "田中"; //プレースホルダの値を指定
$romaji = "tanaka"; //プレースホルダの値を指定
// try-catch
try{
// データベースへの接続を表すPDOインスタンスを生成
$dbh = new PDO($dsn,$username,$password);
// 静的プレースホルダを指定
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// DBエラー発生時は例外を投げる設定
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL文 :id,:name,:romajiは、名前付きプレースホルダ
$sql = "insert into employee(id,name,romaji) VALUES(:id,:name,:romaji)";
// プリペアドステートメントを作成
$stmt = $dbh->prepare($sql);
$dbh->beginTransaction();
try{
// プレースホルダと変数をバインド
$stmt -> bindParam(":id",$id);
$stmt -> bindParam(":name",$name);
$stmt -> bindParam(":romaji",$romaji);
$stmt -> execute();
//コミット
$dbh->commit();
}catch (PDOException $e) {
//ロールバック
$dbh->rollback();
throw $e; //
}
// 接続を閉じる
//$dbh = null; スクリプト終了時に自動で切断されるので不要
}catch (PDOException $e) {
// エラーメッセージを表示
exit($e->getMessage());
}
?>
23行目は、名前付きプレースホルダを使用したSQLです。(:名称)の箇所が名前付きプレースホルダです。
32~34行目は、7~9行目の変数を23行目のプレースホルダにバインドしています。
updateのサンプル
PostgreSQLに接続してアップデートを実行するサンプルです。
<?php
// DB接続情報
$dsn = 'pgsql:host=localhost;dbname=testdb10';
$username = 'postgres';
$password = 'test1';
$id = 2; //プレースホルダの値を指定
$name = "山下"; //プレースホルダの値を指定
$romaji = "yamashita"; //プレースホルダの値を指定
// try-catch
try{
// データベースへの接続を表すPDOインスタンスを生成
$dbh = new PDO($dsn,$username,$password);
// 静的プレースホルダを指定
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// DBエラー発生時は例外を投げる設定
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL文 :id,:name,:romajiは、名前付きプレースホルダ
$sql = "update employee set name = :name,romaji = :romaji where id = :id";
// プリペアドステートメントを作成
$stmt = $dbh->prepare($sql);
$dbh->beginTransaction();
try{
// プレースホルダと変数をバインド
$stmt -> bindParam(":id",$id);
$stmt -> bindParam(":name",$name);
$stmt -> bindParam(":romaji",$romaji);
$stmt -> execute();
//コミット
$dbh->commit();
}catch (PDOException $e) {
//ロールバック
$dbh->rollback();
throw $e; //
}
// 接続を閉じる
//$dbh = null; スクリプト終了時に自動で切断されるので不要
}catch (PDOException $e) {
// エラーメッセージを表示
exit($e->getMessage());
}
?>
23行目は、名前付きプレースホルダを使用したSQLです。(:名称)の箇所が名前付きプレースホルダです。
32~34行目は、7~9行目の変数を23行目のプレースホルダにバインドしています。
deleteのサンプル
PostgreSQLに接続して削除を実行するサンプルです。
<?php
// DB接続情報
$dsn = 'pgsql:host=localhost;dbname=testdb10';
$username = 'postgres';
$password = 'test1';
$id = 2; //プレースホルダの値を指定
// try-catch
try{
// データベースへの接続を表すPDOインスタンスを生成
$dbh = new PDO($dsn,$username,$password);
// 静的プレースホルダを指定
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// DBエラー発生時は例外を投げる設定
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL文 :idは、名前付きプレースホルダ
$sql = "delete from employee where id = :id";
// プリペアドステートメントを作成
$stmt = $dbh->prepare($sql);
$dbh->beginTransaction();
try{
// プレースホルダと変数をバインド
$stmt -> bindParam(":id",$id);
$stmt -> execute();
//コミット
$dbh->commit();
}catch (PDOException $e) {
//ロールバック
$dbh->rollback();
throw $e; //
}
// 接続を閉じる
//$dbh = null; スクリプト終了時に自動で切断されるので不要
}catch (PDOException $e) {
// エラーメッセージを表示
exit($e->getMessage());
}
?>
23行目は、名前付きプレースホルダを使用したSQLです。(:名称)の箇所が名前付きプレースホルダです。
32行目は、7行目の変数を23行目のプレースホルダにバインドしています。
プレースホルダ
- SQLにある(:名称)は、名前付きプレースホルダです。
→疑問符(?)のプレースホルダのやり方もあります。 - 動的に値をセットできます。
- 入力される不正な文字を抑止できるのでSQLインジェクション対策になります。
- 固定文字列のSQLの部分がプリコンパイルされるので実行速度が上がります。
- place=場所、holder=入れものです。
例外発生時
上記コードの49行目は、$e->getMessage()でエラーメッセージを取得しています。
インサート時にキーが重複していた場合は以下のメッセージが表示されます。
SQLSTATE[23505]: Unique violation: 7 ERROR: 重複キーが一意性制約"employee_pkey"に違反しています DETAIL: キー (id)=(2) はすでに存在します。 |
php.iniの設定
上記コードを動かすためには、php.iniの;extension=pdo_pgsqlのコメントのセミコロン(;)を削除します。ドライバの設定をしていない場合「could not find driver」と画面に表示されます。
;extension=odbc
;extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
;extension=shmop
接続先のデータベースとテーブル
PostgreSQLのインストール方法と、データベースとテーブルを作成する方法は以下を参照願います。
PostgreSQLをインストールする手順(Windows)
PostgreSQL pgAdmin 4の使い方(起動からデータ参照)
関連の記事
PHP PostgreSQLに接続してselectするサンプル
PostgreSQL psqlを使用するサンプル(Windows)