การใช้งาน PHP PostgreSQL Extension (pgsql, PDO_PGSQL) ใน ServBay
ServBay เป็นสภาพแวดล้อมสำหรับพัฒนาเว็บแบบครบวงจรที่ทรงพลัง โดยมาพร้อมกับการสนับสนุนฐานข้อมูล PostgreSQL ในตัว และได้เตรียมส่วนขยายที่จำเป็นสำหรับ PHP ไว้เรียบร้อย ช่วยให้นักพัฒนาสามารถเชื่อมต่อและจัดการกับ PostgreSQL ได้ง่ายดายในแอป PHP ของคุณ ServBay ได้ติดตั้งและเปิดใช้งานส่วนขยาย pgsql
และ PDO_PGSQL
เป็นค่าเริ่มต้นสำหรับทุกเวอร์ชันของ PHP ที่รองรับ
แนะนำส่วนขยาย PHP PostgreSQL
PostgreSQL เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบออบเจ็กต์โอเพ่นซอร์สที่ทรงพลัง มีชื่อเสียงในด้านความเสถียร ความถูกต้องของข้อมูล และฟีเจอร์ที่หลากหลาย ในการติดต่อกับ PostgreSQL จาก PHP จำเป็นต้องใช้ส่วนขยายที่เกี่ยวข้อง โดย ServBay มีให้เลือกหลัก ๆ 2 แบบ:
pgsql
Extension: ส่วนขยาย PostgreSQL ดั้งเดิมของ PHP โดยจะให้ฟังก์ชันที่ขึ้นต้นด้วยpg_
เช่นpg_connect
,pg_query
,pg_fetch_assoc
เพื่อจัดการฐานข้อมูล PostgreSQL ได้โดยตรง เหมาะสำหรับใช้ฟีเจอร์เฉพาะของ PostgreSQLPDO_PGSQL
Driver: เป็นส่วนหนึ่งของ PHP Data Objects (PDO) ที่ออกแบบมาเฉพาะสำหรับเชื่อมต่อกับ PostgreSQL โดย PDO จะเสนอโครงสร้าง API เดียวกันสำหรับหลากหลายฐานข้อมูล (เช่น PostgreSQL, MySQL, SQLite ฯลฯ) ช่วยให้เขียนโค้ดที่ย้ายข้ามฐานข้อมูลได้ง่าย
PHP PostgreSQL Extension ใน ServBay
ServBay ได้ติดตั้ง pgsql
extension และ PDO_PGSQL
driver สำหรับแต่ละเวอร์ชัน PHP ที่รองรับไว้ให้แล้ว และเปิดใช้งานเป็นค่าเริ่มต้น
วิธีเปิดใช้งาน PostgreSQL Extension
ใน ServBay ไม่จำเป็นต้องดำเนินการใด ๆ เพิ่มเพื่อเปิดใช้ pgsql
หรือ PDO_PGSQL
Extension ทั้งหมดนี้ตั้งค่าให้พร้อมใช้งานใน PHP ของคุณแล้ว สามารถเรียกโค้ด PHP ที่อาศัย extension เหล่านี้ได้ทันที
การใช้งาน PostgreSQL ในโค้ด PHP
เมื่อ extension ที่จำเป็นพร้อมแล้ว คุณสามารถเรียกใช้ฟังก์ชัน pgsql
หรือใช้งาน PDO สำหรับเชื่อมต่อและจัดการกับ PostgreSQL
ข้อกำหนดเบื้องต้น:
- ต้องเปิดใช้บริการ PostgreSQL ใน ServBay
- สมมุติว่าคุณสร้างฐานข้อมูลชื่อ
servbay_db
แล้ว - สมมุติว่ามี user ชื่อ
servbay_user
รหัสผ่านเป็นyour_password
และได้รับสิทธิ์เหมาะสมในฐานข้อมูลservbay_db
- ฐานข้อมูล
servbay_db
มีตารางชื่อusers
ซึ่งมีคอลัมน์id
(SERIAL PRIMARY KEY),name
(VARCHAR),email
(VARCHAR),age
(INT)
คุณสามารถตั้งค่าพวกนี้ด้วย adminer ที่รวมมากับ ServBay หรือเครื่องมืออื่น ๆ เช่น DBeaver, pgAdmin
ด้านล่างคือตัวอย่างโค้ดสำหรับการเชื่อมต่อและใช้งานฐานข้อมูลด้วยทั้งสองวิธี:
ตัวอย่างโค้ด (แบบ pgsql
Extension)
php
<?php
// --- ตัวอย่าง pgsql extension ---
// พารามิเตอร์เชื่อมต่อฐานข้อมูล
$host = "127.0.0.1"; // หรือ 'localhost'
$port = "5432"; // พอร์ตเริ่มต้นของ PostgreSQL
$dbname = "servbay_db";
$user = "servbay_user";
$password = "your_password"; // กรุณาแก้ไขเป็นรหัสผ่านจริงของคุณ
// สร้าง connection string
$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 ไม่รองรับ parameter binding โดยตรง ต้อง escape ด้วยตนเอง หรือใช้ pg_query_params)
$name = "ServBay Pgsql";
$email = "[email protected]";
$age = 7;
// ใช้ pg_query_params เพื่อความปลอดภัยจาก SQL injection
$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) {
// ดึงข้อมูลเป็น associative array
$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);
?>
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
ตัวอย่างโค้ด (แบบ PDO_PGSQL
)
php
<?php
// --- ตัวอย่าง PDO_PGSQL ---
// พารามิเตอร์เชื่อมต่อฐานข้อมูล
$host = '127.0.0.1'; // หรือ 'localhost'
$port = 5432; // พอร์ตเริ่มต้นของ PostgreSQL
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // กรุณาแก้ไขเป็นรหัสผ่านจริงของคุณ
// สร้าง DSN สำหรับ PostgreSQL
$dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
// ตัวเลือกการเชื่อมต่อ PDO
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // แจ้ง error แบบโยน exception
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // ดึงข้อมูลเป็น associative array โดยปริยาย
// PDO::ATTR_EMULATE_PREPARES => false, // โดยปกติ PostgreSQL ไม่จำเป็นต้องตั้งค่านี้
];
try {
// สร้าง instance ของ PDO
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO_PGSQL Connected successfully<br>";
// เพิ่มข้อมูล (ใช้ prepared statement)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Pgsql';
$email = '[email protected]';
$age = 12;
// Bind parameter และ execute
$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 ตามค่า default
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 จะถูกปิดโดยอัตโนมัติเมื่อสคริปต์จบ
// $pdo = null; // สั่งปิดได้ด้วยการตั้งค่า null
?>
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
การวางไฟล์โค้ด: บันทึกตัวอย่างโค้ดข้างต้นเป็นไฟล์ .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: ต้องติดตั้ง PHP PostgreSQL extension (pgsql
หรือ PDO_PGSQL
) เองใน ServBay ไหม?
A: ไม่ต้อง ServBay ได้ติดตั้งและเปิดใช้งาน pgsql
extension และ PDO_PGSQL
driver สำหรับ PHP ทุกเวอร์ชันที่จัดการไว้แล้ว คุณใช้งานจากโค้ดได้ทันทีโดยไม่ต้องติดตั้งหรือปรับตั้งค่าใดๆ เพิ่ม
Q: pgsql
กับ PDO_PGSQL
แตกต่างกันอย่างไร? ควรเลือกใช้อะไรดี?
A:
pgsql
extension ให้ฟังก์ชั่นที่ specific กับ PostgreSQL (เช่นpg_connect
,pg_query_params
) ใช้เหมาะหากต้องการใช้ความสามารถเฉพาะของ PostgreSQLPDO_PGSQL
คือ driver สำหรับ PDO ซึ่งเป็น abstraction layer สำหรับฐานข้อมูลต่างๆ ทำให้โค้ดสามารถย้ายข้ามฐานข้อมูลได้สะดวกกว่า โบนัสคือต้องใช้ prepared statement เสมอ ปลอดภัยและเป็น best practice ที่แนะนำใน PHP ยุคใหม่- คำแนะนำ: สำหรับ project ใหม่หรือ project ที่เน้นความยืดหยุ่นในการเปลี่ยนฐานข้อมูลและความปลอดภัย แนะนำใช้
PDO_PGSQL
หากบำรุงรักษาระบบเดิมหรือเน้นใช้ฟังก์ชั่นของpgsql
เป็นหลัก ก็สามารถเลือกpgsql
ได้
Q: จะดูข้อมูลการเชื่อมต่อกับ PostgreSQL ใน ServBay เช่น host, port, username, password, database ได้อย่างไร?
A:
- Host: โดยทั่วไปคือ
127.0.0.1
หรือlocalhost
- Port: ค่า default ของ PostgreSQL คือ
5432
คุณสามารถดูพอร์ตจริงที่ ServBay ใช้ได้ในส่วนจัดการ PostgreSQL ในหน้าแดชบอร์ด ServBay - Username / Password / Database Name: เป็นค่าที่คุณตั้งไว้เองขณะสร้าง user/ฐานข้อมูลใหม่ผ่าน adminer ของ ServBay หรือโปรแกรม client อื่น
Q: ใช้ pgsql
Extension ทำอย่างไรให้ปลอดภัยจาก SQL injection?
A: อย่าเอาค่าที่ผู้ใช้กรอกมาต่อ string SQL ตรง ๆ แต่ควรใช้ฟังก์ชัน pg_query_params()
ที่สามารถส่ง statement และ parameter แยกกันได้ เพื่อให้ระบบจัดการ escaping ให้อัตโนมัติ หากใช้ pg_query()
ควร escape input ทุกครั้งด้วย pg_escape_string()
หรือ pg_escape_literal()
(แต่ pg_query_params
ปลอดภัยที่สุดและควรเลือกใช้)
สรุป
ServBay ได้ติดตั้งและเปิดใช้งาน PHP pgsql
กับ PDO_PGSQL
extension ไว้ให้ล่วงหน้าโดยอัตโนมัติ ทำให้การใช้งาน PHP กับ PostgreSQL บน macOS ในเครื่องตัวเองสะดวกและรวดเร็วสุด ๆ นักพัฒนาไม่ต้องวุ่นวายกับติดตั้งหรือคอนฟิกส่วนขยายเหล่านี้ สามารถเลือกใช้ extension ที่เหมาะสมกับงาน (แนะนำ PDO เพื่อความปลอดภัยและความสามารถในการย้ายข้ามฐานข้อมูล) เข้าถึงฐานข้อมูล PostgreSQL ที่จัดการโดย ServBay ได้ทันที เท่านี้ก็โฟกัสเขียนโค้ดแอปพลิเคชันได้เต็มที่ และดึงศักยภาพของ PostgreSQL มาสร้างเว็บแอปที่ไว้วางใจได้อย่างมั่นใจ