ServBay で PHP PostgreSQL 拡張(pgsql, PDO_PGSQL)を利用する
ServBay は強力な統合ローカル Web 開発環境として、PostgreSQL データベースのサポートを内蔵し、PHP 用の必要な拡張機能もあらかじめ用意しています。これにより、開発者は PHP アプリケーションから簡単に PostgreSQL データベースへ接続・操作できます。ServBay は、サポートされるすべての PHP バージョンで pgsql
および PDO_PGSQL
拡張をプリインストールおよび標準で有効化しています。
PHP PostgreSQL 拡張の概要
PostgreSQL は高機能なオープンソースのオブジェクトリレーショナルデータベースシステムで、安定性、データ一貫性、豊富な機能で知られています。PHP から PostgreSQL データベースへアクセスするためには、対応する PHP 拡張が必要です。ServBay では主に以下の2種類の拡張が提供されています:
pgsql
拡張: PHP 標準の PostgreSQL 拡張であり、pg_
で始まる関数群(例:pg_connect
,pg_query
,pg_fetch_assoc
など)を通じて直接 PostgreSQL データベースを操作できます。PostgreSQL の特有機能の活用にも向いています。PDO_PGSQL
ドライバー: これは PHP Data Objects(PDO)拡張の一部で、PostgreSQL 専用の接続ドライバーです。PDO は統一されたデータベースアクセスの抽象化レイヤーを提供し、PostgreSQL、MySQL、SQLite など複数のデータベースに共通APIでアクセスでき、コードの移植性を高めます。
ServBay の PHP PostgreSQL 拡張について
ServBay では、サポートされている各 PHP バージョンごとに pgsql
拡張と PDO_PGSQL
ドライバーがプリインストールされ、標準で有効化されています。
PostgreSQL 拡張の有効化方法
ServBay では、pgsql
や PDO_PGSQL
拡張の有効化のために手動操作を行う必要はありません。すでに構成済みなので、PHP コードからそのまま利用できます。
PHP コードでの PostgreSQL 利用方法
拡張機能が有効になっていれば、PHP の pgsql
関数や PDO オブジェクトを使って、PostgreSQL データベースと接続・操作が可能です。
前提条件:
- ServBay で PostgreSQL サービスが起動していること
- データベース
servbay_db
が作成されていること - ユーザー
servbay_user
とパスワードyour_password
が設定され、そのユーザーがservbay_db
に必要な権限を持っていること servbay_db
の中にusers
という名前のテーブルがあり、id
(SERIAL PRIMARY KEY)、name
(VARCHAR)、email
(VARCHAR)、age
(INT)の列が存在すること
これらの設定は ServBay 内蔵の adminer や DBeaver, pgAdmin などのデータベース管理ツールを使って簡単に行なえます。
以下は、二つの方法(pgsql・PDO_PGSQL)で PostgreSQL に接続し、基本的な操作を行うサンプルコードです:
サンプルコード(pgsql
拡張)
<?php
// --- pgsql 拡張のサンプル ---
// データベース接続パラメータ
$host = "127.0.0.1"; // または 'localhost'
$port = "5432"; // PostgreSQL のデフォルトポート
$dbname = "servbay_db";
$user = "servbay_user";
$password = "your_password"; // ご自身のパスワードに置き換えてください
// 接続文字列の作成
$conn_string = "host={$host} port={$port} dbname={$dbname} user={$user} password={$password}";
// PostgreSQL データベースへ接続
$conn = pg_connect($conn_string);
// 接続成功かどうか確認
if (!$conn) {
die("pgsql 接続失敗: " . pg_last_error());
}
echo "pgsql に正常に接続しました<br>";
// データ挿入(注意:pg_query はパラメータバインドに未対応のため SQL インジェクション対策が必要。推奨は pg_query_params)
$name = "ServBay Pgsql";
$email = "[email protected]";
$age = 7;
// pg_query_params を用いた安全なパラメータクエリ
$query = "INSERT INTO users (name, email, age) VALUES ($1, $2, $3)";
$result = pg_query_params($conn, $query, array($name, $email, $age));
if ($result) {
echo "pgsql: 新しいレコードの追加に成功しました<br>";
} else {
echo "pgsql エラー: " . pg_last_error($conn) . "<br>";
}
// データ検索
$query = "SELECT id, name, email, age FROM users WHERE name = $1";
$result = pg_query_params($conn, $query, array('ServBay Pgsql'));
if ($result) {
echo "pgsql 取得データ:<br>";
// 行があるか確認
if (pg_num_rows($result) > 0) {
// 全行を連想配列で取得
$data = pg_fetch_all($result, PGSQL_ASSOC);
foreach ($data as $row) {
echo "id: " . $row["id"]. " - 名前: " . $row["name"]. " - メール: " . $row["email"]. " - 年齢: " . $row["age"]. "<br>";
}
} else {
echo "pgsql: データが見つかりませんでした<br>";
}
} else {
echo "pgsql データ取得エラー: " . pg_last_error($conn) . "<br>";
}
// データベース接続をクローズ
pg_close($conn);
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
サンプルコード(PDO_PGSQL
)
<?php
// --- PDO_PGSQL サンプル ---
// データベース接続パラメータ
$host = '127.0.0.1'; // または 'localhost'
$port = 5432; // PostgreSQL のデフォルトポート
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // ご自身のパスワードに置き換えてください
// PostgreSQL 用 DSN(データソース名)
$dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
// PDO の接続オプション
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 警告ではなく例外を発生
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // デフォルトで連想配列で取得
// PDO::ATTR_EMULATE_PREPARES => false, // 通常 PostgreSQL では不要
];
try {
// PDO インスタンスの作成
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO_PGSQL に正常に接続しました<br>";
// データ挿入(プリペアドステートメント利用)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Pgsql';
$email = '[email protected]';
$age = 12;
// パラメータをバインドして実行
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO_PGSQL: 新しいレコードの追加に成功しました<br>";
// データ検索
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Pgsql']);
// 結果すべて取得
$users = $stmt->fetchAll(); // 標準では FETCH_ASSOC
if ($users) {
echo "PDO_PGSQL 取得データ:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - 名前: " . $row['name'] . " - メール: " . $row['email'] . " - 年齢: " . $row['age'] . "<br>";
}
} else {
echo "PDO_PGSQL: データが見つかりませんでした<br>";
}
} catch (\PDOException $e) {
// 接続やクエリのエラーをキャッチして表示
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// PDO 接続はスクリプト終了時に自動でクローズされるため、通常明示的な close() は不要
// $pdo = null; // 明示的に切断する場合は null 代入
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
コードの配置例: 上記のいずれかのサンプルコードを .php
ファイル(例:pg_test_native.php
または pg_test_pdo.php
)として保存し、ServBay のサイトルートディレクトリ(例:/Applications/ServBay/www/myproject/
)に配置してください。その後、ブラウザで対応する URL(例:http://myproject.servbay.demo/pg_test_native.php
)にアクセスすることで動作を確認できます。サイトおよび PostgreSQL サービスが ServBay 上で正しく構成・起動されていることを確認してください。
よくある質問 (FAQ)
Q: ServBay で PHP の PostgreSQL 拡張(pgsql
または PDO_PGSQL
)を手動でインストールする必要はありますか?
A: いいえ。ServBay は管理しているすべての PHP バージョンで pgsql
拡張および PDO_PGSQL
ドライバーをあらかじめインストールし、デフォルトで有効化しています。追加のインストールや設定は不要で、すぐにご利用いただけます。
Q: pgsql
拡張と PDO_PGSQL
ドライバーは何が違いますか?どちらを選べばいいですか?
A:
pgsql
拡張は PostgreSQL 特有の関数群(pg_connect
,pg_query_params
など)を提供します。PostgreSQL 独自の機能を深く利用したい場合に向いています。PDO_PGSQL
は PDO 抽象レイヤーの一部です。PDO を使うことで、将来的に MySQL など他の DB への移行時もコードの変更が最小限で済みます。PDO では必ずプリペアドステートメントを活用できるため、安全面でも推奨です。- 推奨: 新規プロジェクトや、移植性・安全性を重視する場合は
PDO_PGSQL
の利用をおすすめします。既存プロジェクトやpgsql
特有の機能が必要な場合はpgsql
拡張も選択肢です。
Q: ServBay で動作する PostgreSQL への接続情報(ホスト・ポート・ユーザー名・パスワード・データベース名)はどうやって調べますか?
A:
- ホスト(Host): 通常は
127.0.0.1
もしくはlocalhost
です。 - ポート(Port): 標準では
5432
です。実際のポート番号は ServBay の PostgreSQL パッケージ管理画面で確認できます。 - ユーザー名/パスワード/データベース名: これは PostgreSQL サービス内で自分で作成したものになります。ServBay 付属の adminer や pgAdmin、DBeaver などの PostgreSQL クライアントツールで、データベースやユーザー作成、パスワード設定・権限付与が行えます。
Q: pgsql
拡張を使用する場合、SQL インジェクションを防ぐには?
A: ユーザー入力を SQL に直接組み込まず、pg_query_params()
関数を利用しましょう。これにより SQL とパラメータを分離し、ドライバー側で自動的に安全な値として処理されます。あるいは pg_query()
利用時は、pg_escape_string()
や pg_escape_literal()
で入力値を必ずエスケープしてください(ただし pg_query_params
の利用がより推奨されます)。
まとめ
ServBay では PHP の pgsql
や PDO_PGSQL
拡張をプリインストール&標準有効化済みのため、macOS のローカル環境で PHP から PostgreSQL データベースへ接続する手間が大幅に省略できます。開発者は拡張のインストールや設定を気にせず、プロジェクト要件に合った拡張(互換性・安全性の観点から PDO 推奨)を選んで PostgreSQL サービスへアクセスするだけです。これにより、開発作業に集中でき、PostgreSQL の高機能を生かしつつ堅牢な Web アプリケーションを効率良く構築できます。