PHP PostgreSQLと連携(PostgreSQL関数)
PostgreSQL関数を使って、PostgreSQLと連携してみます。Windowsで動作確認を行いましたが、設定ファイルを修正する必要があります。環境設定
そのまま動作させようとしたら以下のエラーが発生しました。事前に、php.iniとApacheのhttpd.confを修正する必要があります。
( ! ) Fatal error: Uncaught Error: Call to undefined function pg_connect() in C:\xampp\htdocs\buncho\test.php on line 9
( ! ) Error: Call to undefined function pg_connect() in C:\xampp\htdocs\buncho\test.php on line 9
httpd.conf
Apacheと連携でhttpd.confを修正しましたが、それに加えて、libpq.dllをロードする設定が必要になります。
Loadfile "C:\php\libpq.dll"
LoadModule php7_module "c:/php/php7apache2_4.dll"
PHPIniDir "C:/php"
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
php.ini
extension_dirのコメントを外し、extフォルダ(php_pgsql.dllが存在)を指定します。extension=php_pgsql.dllのコメントを外します。
;extension_dir = "ext"
extension_dir = "C:\php\ext"
;extension=php_pgsql.dll
extension=php_pgsql.dll
httpd.conf、php.iniの編集が終了したら、Apacheを再起動してください。
PostgreSQL
PostgreSQLの環境構築についてはこちらを参照してください。 今回、使用するテーブルは以下になります。
create table public.m_user (
id character varying(8) not null
, name character varying(16)
, primary key (id)
);
DB環境は以下になります。
項目 | 設定値 |
---|---|
host | localhost |
port | 5432 |
dbname | postgres |
user | postgres |
password | ps |
SELECT
pg_connect関数でDBと接続し、pg_close関数で切断します。pg_query関数でSQLを実行し、pg_fetch_row関数で抽出データを取得します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PHP Test</title>
</head>
<body>
<?php
$conn = pg_connect("host=localhost port=5432 dbname=postgres user=postgres password=ps");
$result = pg_query($conn, "SELECT id, name FROM m_user");
while ($row = pg_fetch_row($result)) {
echo "id:$row[0] name:$row[1] <br />\r\n";
}
pg_close($conn);
?>
</body>
</html>
INSERT、UPDATE、DELETE
INSERT、UPDATE、DELETEもpg_query関数で実行できます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PHP Test</title>
</head>
<body>
<?php
$conn = pg_connect("host=localhost port=5432 dbname=postgres user=postgres password=ps");
pg_query($conn, "INSERT INTO m_user(id ,name) VALUES('0099','INS')");
pg_query($conn, "UPDATE m_user SET name= 'UPD' WHERE id = '0099'");
$result = pg_query($conn, "SELECT id, name FROM m_user");
while ($row = pg_fetch_row($result)) {
echo "id:$row[0] name:$row[1] <br />\r\n";
}
pg_query($conn, "DELETE FROM m_user WHERE id = '0099'");
pg_close($conn);
?>
</body>
</html>
パラメータ指定
SQLをパラメータと分ける場合、pg_query関数の代わりにpg_query_params関数を実行します。パラメータは配列で渡し、SQLに埋め込む部分は$1、$2、・・・で指定します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PHP Test</title>
</head>
<body>
<?php
$conn = pg_connect("host=localhost port=5432 dbname=postgres user=postgres password=ps");
pg_query_params($conn, "INSERT INTO m_user(id ,name) VALUES($1, $2)" ,array('0099','INS'));
pg_query_params($conn, "UPDATE m_user SET name= $1 WHERE id = $2" ,array('UPD','0099'));
$result = pg_query_params($conn, "SELECT id, name FROM m_user WHERE id = $1" ,array('0099'));
while ($row = pg_fetch_row($result)) {
echo "id:$row[0] name:$row[1] <br />\r\n";
}
pg_query_params($conn, "DELETE FROM m_user WHERE id = $1" ,array('0099'));
pg_close($conn);
?>
</body>
</html>
トランザクション
トランザクションを開始するには、pg_query関数で、BEGINを実行するとトランザクションを開始し、COMMITを実行するとコミットされ、ROLLBACKを実行するとロールバックされます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PHP Test</title>
</head>
<body>
<?php
$conn = pg_connect("host=localhost port=5432 dbname=postgres user=postgres password=ps");
pg_query("BEGIN");
pg_query_params($conn, "INSERT INTO m_user(id ,name) VALUES($1, $2)", array('0099', 'INS'));
pg_query_params($conn, "UPDATE m_user SET name= $1 WHERE id = $2", array('UPD', '0099'));
pg_query("ROLLBACK");
//pg_query("COMMIT");
$result = pg_query($conn, "SELECT id, name FROM m_user");
while ($row = pg_fetch_row($result)) {
echo "id:$row[0] name:$row[1] <br />\r\n";
}
pg_close($conn);
?>
</body>
</html>
ページのトップへ戻る