Sử dụng Extension PHP PostgreSQL (pgsql, PDO_PGSQL) trong ServBay
ServBay là một môi trường phát triển web cục bộ tích hợp mạnh mẽ, được tích hợp sẵn hỗ trợ cơ sở dữ liệu PostgreSQL và cung cấp các extension cần thiết cho PHP, giúp các lập trình viên dễ dàng kết nối và thao tác với PostgreSQL ngay trong ứng dụng PHP của mình. ServBay đã cài đặt sẵn và kích hoạt mặc định extension pgsql
và PDO_PGSQL
cho tất cả các phiên bản PHP mà nó hỗ trợ.
Tổng quan về Extension PHP PostgreSQL
PostgreSQL là hệ quản trị cơ sở dữ liệu quan hệ đối tượng nguồn mở mạnh mẽ, nổi tiếng về độ ổn định, toàn vẹn dữ liệu và bộ tính năng phong phú. Để tương tác với PostgreSQL trong PHP, bạn cần các extension PHP phù hợp. ServBay chính cung cấp hai extension chính như sau:
- Extension
pgsql
: Đây là extension chính thức của PHP dành cho PostgreSQL, cung cấp loạt hàm bắt đầu bằngpg_
(ví dụ:pg_connect
,pg_query
,pg_fetch_assoc
…) để thao tác trực tiếp với PostgreSQL. Extension này cho phép lập trình viên tận dụng tối đa các đặc thù của PostgreSQL. - Driver
PDO_PGSQL
: Đây là phần mở rộng của PHP Data Objects (PDO) dành riêng cho PostgreSQL. PDO cung cấp một lớp trừu tượng truy cập cơ sở dữ liệu thống nhất, cho phép bạn thao tác với nhiều loại cơ sở dữ liệu khác nhau (PostgreSQL, MySQL, SQLite, v.v.) qua cùng một API, giúp code dễ chuyển đổi giữa các hệ quản trị cơ sở dữ liệu hơn.
Extension PHP PostgreSQL trong ServBay
ServBay đã chu đáo cài đặt sẵn extension pgsql
và driver PDO_PGSQL
dành cho từng phiên bản PHP được hỗ trợ, và bảo đảm rằng chúng mặc định luôn được kích hoạt.
Cách kích hoạt Extension PostgreSQL
Với ServBay, bạn không cần thực hiện bất kỳ thao tác thủ công nào để bật extension pgsql
hay PDO_PGSQL
trong PHP. Mọi thứ đã cấu hình sẵn, bạn chỉ việc sử dụng chúng ngay trong mã nguồn PHP.
Sử dụng PostgreSQL trong Mã PHP
Khi các extension cần thiết đã được kích hoạt, bạn có thể sử dụng hàm pgsql
hoặc đối tượng PDO để kết nối và thao tác với cơ sở dữ liệu PostgreSQL trong mã PHP.
Yêu cầu trước:
- Dịch vụ PostgreSQL của ServBay đã được khởi động.
- Đã tạo database có tên
servbay_db
. - Đã tạo user tên
servbay_user
với mật khẩuyour_password
và cấp quyền truy cập tương ứng tớiservbay_db
. - Tồn tại bảng
users
trong cơ sở dữ liệuservbay_db
với các cột:id
(SERIAL PRIMARY KEY),name
(VARCHAR),email
(VARCHAR),age
(INT).
Bạn có thể sử dụng adminer tích hợp sẵn của ServBay hoặc các công cụ quản trị database khác (như DBeaver, pgAdmin) để hoàn tất các thiết lập này.
Dưới đây là mã ví dụ kết nối database và thực hiện các thao tác cơ bản bằng hai cách khác nhau:
Ví dụ Mã (sử dụng extension pgsql
)
php
<?php
// --- Ví dụ extension pgsql ---
// Thông số kết nối cơ sở dữ liệu
$host = "127.0.0.1"; // hoặc 'localhost'
$port = "5432"; // Cổng mặc định của PostgreSQL
$dbname = "servbay_db";
$user = "servbay_user";
$password = "your_password"; // Vui lòng thay bằng mật khẩu thật của bạn
// Tạo chuỗi kết nối
$conn_string = "host={$host} port={$port} dbname={$dbname} user={$user} password={$password}";
// Kết nối tới cơ sở dữ liệu PostgreSQL
$conn = pg_connect($conn_string);
// Kiểm tra kết nối có thành công không
if (!$conn) {
die("pgsql Kết nối thất bại: " . pg_last_error());
}
echo "pgsql Kết nối thành công<br>";
// Thêm dữ liệu mới (Lưu ý: pg_query chưa hỗ trợ bind tham số, cần tự tay escape để tránh injection, hoặc dùng pg_query_params)
$name = "ServBay Pgsql";
$email = "pgsql@servbay.demo";
$age = 7;
// Sử dụng pg_query_params để truy vấn tham số an toàn
$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: Thêm bản ghi mới thành công<br>";
} else {
echo "pgsql Lỗi: " . pg_last_error($conn) . "<br>";
}
// Truy vấn dữ liệu
$query = "SELECT id, name, email, age FROM users WHERE name = $1";
$result = pg_query_params($conn, $query, array('ServBay Pgsql'));
if ($result) {
echo "pgsql Dữ liệu truy vấn:<br>";
// Kiểm tra có hàng nào trả về không
if (pg_num_rows($result) > 0) {
// Lấy tất cả các hàng dưới dạng mảng kết hợp
$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: Không tìm thấy kết quả nào<br>";
}
} else {
echo "pgsql Lỗi khi truy vấn dữ liệu: " . pg_last_error($conn) . "<br>";
}
// Đóng kết nối
pg_close($conn);
?>
1
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
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
Ví dụ Mã (sử dụng PDO_PGSQL
)
php
<?php
// --- Ví dụ PDO_PGSQL ---
// Thông số kết nối cơ sở dữ liệu
$host = '127.0.0.1'; // hoặc 'localhost'
$port = 5432; // Cổng mặc định của PostgreSQL
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // Vui lòng thay bằng mật khẩu thật của bạn
// DSN (Data Source Name) cho PostgreSQL
$dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
// Các tuỳ chọn khi kết nối PDO
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Ném ngoại lệ thay vì cảnh báo
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Lấy kết quả dạng mảng kết hợp
// PDO::ATTR_EMULATE_PREPARES => false, // Thường không cần thiết với PostgreSQL
];
try {
// Tạo đối tượng PDO kết nối đến PostgreSQL
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO_PGSQL Kết nối thành công<br>";
// Thêm dữ liệu mới (dùng prepared statement)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Pgsql';
$email = 'pdo_pgsql@servbay.demo';
$age = 12;
// Gán tham số và thực thi
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO_PGSQL: Thêm bản ghi mới thành công<br>";
// Truy vấn dữ liệu
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Pgsql']);
// Lấy toàn bộ kết quả
$users = $stmt->fetchAll(); // Mặc định dùng FETCH_ASSOC
if ($users) {
echo "PDO_PGSQL Dữ liệu truy vấn:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO_PGSQL: Không tìm thấy kết quả nào<br>";
}
} catch (\PDOException $e) {
// Bắt và hiển thị lỗi khi kết nối hoặc truy vấn
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// Khi script kết thúc, kết nối PDO sẽ tự động đóng, thường không cần gọi close() rõ ràng
// $pdo = null; // Có thể set null để đóng kết nối
?>
1
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
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
Cách sử dụng mã: Hãy lưu một trong hai đoạn mã ví dụ trên thành file .php
(ví dụ: pg_test_native.php
hoặc pg_test_pdo.php
) và đặt vào thư mục gốc website trong ServBay (ví dụ /Applications/ServBay/www/myproject/
). Sau đó, truy cập qua trình duyệt theo URL tương ứng (ví dụ: http://myproject.servbay.demo/pg_test_native.php
). Đảm bảo cả website lẫn dịch vụ PostgreSQL đã được cấu hình và khởi động đúng trên ServBay.
Câu hỏi thường gặp (FAQ)
Q: Tôi có cần tự cài đặt extension PostgreSQL (pgsql
hoặc PDO_PGSQL
) cho PHP trong ServBay không?
A: Không cần. ServBay đã cài đặt sẵn và kích hoạt mặc định extension pgsql
lẫn driver PDO_PGSQL
cho tất cả phiên bản PHP mà nó quản lý. Bạn sử dụng trực tiếp mà không cần cài đặt hoặc cấu hình gì thêm.
Q: Extension pgsql
và driver PDO_PGSQL
khác nhau thế nào? Nên dùng cái nào?
A:
- Extension
pgsql
cung cấp bộ hàm đặc thù dành riêng cho PostgreSQL (vd:pg_connect
,pg_query_params
). Nếu bạn cần khai thác sâu các tính năng riêng của PostgreSQL, cách này trực tiếp và chi tiết hơn. PDO_PGSQL
là một phần của lớp trừu tượng PDO. Việc sử dụng PDO giúp mã database dễ di chuyển hơn nếu sau này bạn thay đổi sang hệ cơ sở dữ liệu khác (như MySQL...). PDO cũng buộc phải dùng prepared statement, rất an toàn và là chuẩn khuyên dùng cho PHP hiện đại.- Khuyến nghị: Với dự án mới, hoặc muốn code an toàn, dễ chuyển đổi, nên chọn
PDO_PGSQL
. Nếu bạn bảo trì code cũ, hoặc cần gọi các hàm đặc trưngpgsql
, có thể dùng extensionpgsql
.
Q: Làm sao lấy thông tin kết nối dịch vụ PostgreSQL trên ServBay (host, port, username, password, database name)?
A:
- Host: Thường là
127.0.0.1
hoặclocalhost
. - Port: PostgreSQL mặc định là
5432
. Bạn xem lại mục quản lý PostgreSQL trong ServBay để kiểm tra port thực tế đang dùng. - Username / Password / Database Name: Là các thông tin bạn tạo trong dịch vụ PostgreSQL. Có thể dùng adminer tích hợp sẵn hoặc các công cụ ngoài như pgAdmin, DBeaver... để tạo database, user và cấp quyền.
Q: Dùng extension pgsql
thì làm sao phòng chống SQL injection?
A: Không nên chèn thẳng dữ liệu của người dùng vào chuỗi SQL. Hãy luôn dùng hàm pg_query_params()
giúp tách lệnh truy vấn và dữ liệu ra, extension sẽ tự động xử lý an toàn tham số. Hoặc nếu dùng pg_query()
, bạn cần thoát ký tự với pg_escape_string()
hoặc pg_escape_literal()
trước khi đưa dữ liệu vào SQL (nhưng pg_query_params
vẫn an toàn hơn nên ưu tiên).
Kết luận
ServBay đã đơn giản hóa tối đa quá trình kết nối cơ sở dữ liệu PostgreSQL từ PHP trên macOS bằng cách cài đặt sẵn và kích hoạt mặc định extension pgsql
cũng như PDO_PGSQL
. Các nhà phát triển không còn phải lo lắng về cài đặt hay cấu hình extension, mà có thể tập trung chọn extension phù hợp dự án (ưu tiên PDO cho tính tương thích & bảo mật cao). Tận dụng tối đa nền tảng ServBay, bạn hoàn toàn có thể tập trung phát triển logic ứng dụng, xây dựng ứng dụng web mạnh mẽ và tin cậy trên nền PostgreSQL.