在 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)来完成这些设置。
以下是使用这两种方式连接数据库并执行基本操作的示例代码:
示例代码(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'; // 请替换为您的实际密码
// 数据源名称 (DSN) for PostgreSQL
$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/
)下,然后通过浏览器访问对应的 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),改动会更小。PDO 也强制使用预处理语句,是现代 PHP 开发中推荐的安全实践。- 推荐: 对于新项目或追求代码可移植性和安全性的项目,推荐使用
PDO_PGSQL
。如果维护旧项目或需要特定pgsql
函数,可以使用pgsql
扩展。
Q: 如何获取连接 ServBay 中 PostgreSQL 服务的必要信息(主机、端口、用户名、密码、数据库名)?
A:
- 主机 (Host): 通常是
127.0.0.1
或localhost
。 - 端口 (Port): PostgreSQL 的标准端口是
5432
。您可以在 ServBay 的 PostgreSQL 软件包管理界面确认实际运行的端口。 - 用户名 (Username) / 密码 (Password) / 数据库名 (Database Name): 这些是您在 PostgreSQL 服务中创建的。您可以使用 ServBay 自带的 adminer 或其他 PostgreSQL 客户端工具(如 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 应用。