在 ServBay 中使用 PHP PostgreSQL 擴充(pgsql, PDO_PGSQL)
ServBay 是一款功能強大的集成在地 Web 開發環境,內建對 PostgreSQL 資料庫的支援,並為 PHP 提供必要的擴充,讓開發者可輕鬆於 PHP 應用程式中連接及操作 PostgreSQL 資料庫。ServBay 為所有支援的 PHP 版本皆預先安裝並預設啟用 pgsql
及 PDO_PGSQL
擴充。
PHP PostgreSQL 擴充簡介
PostgreSQL 是功能強大且開源的物件關聯式資料庫系統,以穩定性、資料完整性與多元功能著稱。若要在 PHP 與 PostgreSQL 資料庫互動,須搭配相應的 PHP 擴充。ServBay 主要提供以下兩種:
pgsql
擴充:這為 PHP 原生的 PostgreSQL 擴充,提供一系列以pg_
開頭的函式(如pg_connect
,pg_query
,pg_fetch_assoc
等),能直接操作 PostgreSQL 資料庫。開發者可善用 PostgreSQL 的多元特性。PDO_PGSQL
驅動:屬於 PHP Data Objects (PDO) 擴充的一部分,專為連接 PostgreSQL 資料庫設計。PDO 為多種資料庫提供一致的 API,可讓程式碼更具可攜性,便於在 PostgreSQL、MySQL、SQLite 等不同資料庫間切換。
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 等)來建立設定上述內容。
以下為分別以兩種方式連接資料庫並進行基礎操作之 PHP 範例:
範例程式碼(使用 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 Connection failed: " . pg_last_error());
}
echo "pgsql Connected successfully<br>";
// 插入資料(注意:pg_query 無法直接支援參數綁定,需手動轉義預防注入,或建議用 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: New record created successfully<br>";
} else {
echo "pgsql Error: " . 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 Queried data:<br>";
// 檢查是否有回傳資料
if (pg_num_rows($result) > 0) {
// 取得所有資料列為關聯陣列
$data = pg_fetch_all($result, PGSQL_ASSOC);
foreach ($data as $row) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. " - Age: " . $row["age"]. "<br>";
}
} else {
echo "pgsql: 0 results found<br>";
}
} else {
echo "pgsql Error querying data: " . 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 Connected successfully<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: New record created successfully<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 Queried data:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO_PGSQL: 0 results found<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/
),然後用瀏覽器訪問對應的網址(例: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)時修改幅度較小。PDO 預設必須使用預備語句,亦為現代 PHP 安全開發推薦做法。- 建議: 新專案或注重可攜與安全性者,建議採用
PDO_PGSQL
。舊專案維護或需特定pgsql
函式則可選用pgsql
擴充。
Q: 如何取得連接 ServBay 內 PostgreSQL 服務所需資訊(主機、連接埠、使用者、密碼、資料庫)?
A:
- 主機 (Host): 一般為
127.0.0.1
或localhost
。 - 連接埠 (Port): PostgreSQL 標準埠號為
5432
,具體數值可於 ServBay 介面查詢當前執行的埠。 - 用戶名稱 / 密碼 / 資料庫名稱: 均為您於 PostgreSQL 服務中建立的。您可透過 ServBay 內建 adminer 或其他工具(如 pgAdmin、DBeaver)來建立與管理用戶、資料庫以及設定權限。
Q: 使用 pgsql
擴充怎麼防止 SQL 注入?
A: 請避免直接將用戶輸入值組合進 SQL 字串。建議一律使用 pg_query_params()
進行查詢,因其能將查詢語句與參數分開處理,自動安全轉譯。若用 pg_query()
,必須以 pg_escape_string()
或 pg_escape_literal()
先處理所有用戶輸入(不過,pg_query_params
為首選)。
結論
ServBay 透過預裝並預設啟用 PHP 之 pgsql
及 PDO_PGSQL
擴充,大幅簡化於 macOS 本地環境中,PHP 連接 PostgreSQL 資料庫的流程。開發者無需擔憂擴充安裝與設定,即可按项目需求直接選用符合需求的擴充(推薦用 PDO 以獲得更佳相容性與安全性)來存取 ServBay 管理的 PostgreSQL。這讓您能專注於應用邏輯,發揮 PostgreSQL 的強大功能,高效打造可靠的 Web 應用程式。