トッカンソフトウェア

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>

			



ページのトップへ戻る