การใช้งานโมดูลฐานข้อมูล SQLite ในตัวกับ ServBay สำหรับการพัฒนา PHP
ServBay คือสภาพแวดล้อมการพัฒนาเว็บไซต์บนโลคอลที่ทรงพลัง ถูกออกแบบมาสำหรับนักพัฒนาและสนับสนุนเทคโนโลยีหลากหลายประเภท โดยมีโมดูลฐานข้อมูล SQLite ติดตั้งมาพร้อม ทำให้ง่ายต่อการจัดเก็บและจัดการข้อมูลในแอปพลิเคชัน PHP ของคุณ บทความนี้จะอธิบายวิธีการใช้ความสามารถนี้ใน ServBay อย่างละเอียด
ภาพรวมของโมดูล SQLite
SQLite คือระบบบริหารจัดการฐานข้อมูลเชิงสัมพันธ์แบบฝังตัวที่เบาและกะทัดรัด แตกต่างจากฐานข้อมูลแบบ client/server ทั่วไป เช่น MySQL หรือ PostgreSQL เพราะ SQLite ไม่ต้องการเซิร์ฟเวอร์แยกต่างหากในการทำงาน แต่จะถูกรวมเป็นไลบรารีในแอปพลิเคชันโดยตรง โดยฐานข้อมูลทั้งหมดเก็บอยู่ในไฟล์เดียว สะดวกต่อการติดตั้งและจัดการอย่างยิ่ง
SQLite ได้รับความนิยมเพราะจุดเด่นดังต่อไปนี้ เหมาะกับแอปพลิเคชันขนาดเล็กถึงกลาง, แคชภายในเครื่อง, แอปมือถือ, รวมถึงสำหรับงานพัฒนาและทดสอบ
จุดเด่นหลัก
- เบาและกะทัดรัด: ขนาดไลบรารีเล็ก ไม่สิ้นเปลืองทรัพยากร
- ไม่ต้องตั้งค่า: ใช้งานได้ทันทีโดยไม่ต้องติดตั้งเซิร์ฟเวอร์หรือกำหนดสิทธิ์ผู้ใช้ให้ยุ่งยาก
- ประสิทธิภาพสูง: อ่านข้อมูลได้รวดเร็วและรองรับงานเขียนในปริมาณที่เหมาะสมอย่างมีประสิทธิภาพ
- ฐานข้อมูลไฟล์เดียว: ข้อมูลทั้งหมดเก็บไว้ในไฟล์
.sqlite
เพียงไฟล์เดียว สะดวกต่อการสำรองและเคลื่อนย้าย - รองรับธุรกรรม ACID: ช่วยให้การบันทึกข้อมูลมั่นใจในความถูกต้องและสมบูรณ์
- ข้ามแพลตฟอร์ม: รองรับระบบปฏิบัติการและภาษาโปรแกรมหลากหลาย
การสนับสนุน SQLite บน ServBay
ServBay มาพร้อมกับ PHP หลายเวอร์ชัน โดยได้ติดตั้งและเปิดใช้งานส่วนขยายที่เกี่ยวข้องกับ SQLite (เช่น sqlite3
และ pdo_sqlite
) ไว้แล้วโดยอัตโนมัติ คุณจึงไม่ต้องติดตั้ง คอมไพล์ หรือกำหนดค่าด้วยตนเอง สามารถเรียกใช้ SQLite ในโปรเจกต์ PHP ของคุณได้ทันที
ข้อกำหนดเบื้องต้น
- ติดตั้งและเปิดใช้งาน ServBay บน macOS แล้ว
- เปิดใช้งาน PHP เวอร์ชันที่ต้องการผ่าน ServBay
- เตรียมโฟลเดอร์สำหรับจัดเก็บไฟล์เว็บไซต์ แนะนำให้ใช้ไดเรกทอรีหลัก
/Applications/ServBay/www
ของ ServBay หรือไดเรกทอรีย่อยภายใน
วิธีใช้งาน SQLite บน ServBay
เนื่องจาก ServBay ได้เปิดใช้งาน SQLite อัตโนมัติแล้ว คุณไม่ต้องดำเนินการใดๆ เพื่อเปิดใช้งานเพิ่มเติม สภาพแวดล้อม PHP พร้อมสำหรับการเรียกใช้ฟังก์ชันและคลาส SQLite ทันที
ยืนยันการเปิดใช้งานส่วนขยาย SQLite:
หากต้องการตรวจสอบว่าได้โหลดส่วนขยาย SQLite สำเร็จหรือไม่ สามารถทำได้โดยดูหน้า phpinfo()
- สร้างไฟล์ PHP ที่มีโค้ด
<?php phpinfo(); ?>
(ตัวอย่างชื่อinfo.php
) - วางไฟล์ไว้ในไดเรกทอรีเว็บไซต์ของ ServBay (เช่น
/Applications/ServBay/www/servbay.demo/info.php
) - ไปที่เบราว์เซอร์และเปิดไฟล์นั้น (เช่น
http://servbay.demo/info.php
) - ค้นหาคำว่า "sqlite" หรือ "pdo_sqlite" ในหน้าแสดงผล หากพบแสดงว่ามีการเปิดใช้งานแล้ว
ตัวอย่างการใช้ SQLite ในโค้ด PHP
เมื่อแน่ใจว่า SQLite ถูกเปิดใช้งานแล้ว คุณสามารถใช้ API ต่างๆ ใน PHP เพื่อจัดการฐานข้อมูลได้ตามต้องการ โดย PHP มีวิธีการเชื่อมต่อ SQLite หลากหลายแบบ วิธีที่นิยมที่สุดคือการใช้คลาส SQLite3
(แนว OOP) และ PDO
(PHP Data Objects)
ตัวอย่างต่อไปนี้สำหรับการใช้งานบน ServBay แสดงวิธีการเชื่อมต่อฐานข้อมูล, สร้างตาราง, แทรกและค้นหาข้อมูล โดยแนะนำให้บันทึกไฟล์ PHP และไฟล์ฐานข้อมูล .sqlite
ไว้ในไดเรกทอรีโปรเจกต์ของเว็บไซต์ เช่น /Applications/ServBay/www/your-project-name/
ตัวอย่างโค้ด (แบบ SQLite3)
วิธีนี้ใช้คลาส SQLite3
ที่มีใน PHP โดยตรง ให้ API เชิงวัตถุในการจัดการฐานข้อมูล SQLite
php
<?php
// เส้นทางไฟล์ฐานข้อมูล
// แนะนำให้จัดเก็บฐานข้อมูลไว้ในโฟลเดอร์ย่อยในโปรเจกต์ เช่น data/
$db_file = __DIR__ . '/data/servbay_demo.sqlite'; // __DIR__ หมายถึงไดเรกทอรีที่ไฟล์สคริปต์นี้อยู่
// ตรวจสอบให้แน่ใจว่าโฟลเดอร์เก็บข้อมูลมีอยู่
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
// เชื่อมต่อฐานข้อมูล SQLite
// หากไฟล์ยังไม่มี ระบบจะสร้างอัตโนมัติ
try {
$db = new SQLite3($db_file);
echo "เชื่อมต่อฐานข้อมูลสำเร็จ: " . $db_file . "\n";
} catch (Exception $e) {
die("เชื่อมต่อฐานข้อมูลล้มเหลว: " . $e->getMessage());
}
// สร้างตาราง
// ใช้ IF NOT EXISTS เพื่อป้องกันการสร้างซ้ำ
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
if ($db->exec($create_table_sql)) {
echo "ตาราง 'users' ถูกสร้างหรือมีอยู่แล้ว\n";
} else {
echo "สร้างตารางล้มเหลว: " . $db->lastErrorMsg() . "\n";
}
// แทรกข้อมูล
$name = 'ServBay Demo User';
$email = '[email protected]';
$age = 30;
// ใช้ statement แบบ prepare เพื่อป้องกัน SQL injection
$stmt = $db->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':email', $email, SQLITE3_TEXT);
$stmt->bindValue(':age', $age, SQLITE3_INTEGER);
// ดำเนินการ insert และตรวจสอบผลลัพธ์ (email เป็น UNIQUE ถ้าแทรกซ้ำจะผิดพลาด)
if ($stmt->execute()) {
echo "แทรกข้อมูลสำเร็จ: Name=" . $name . ", Email=" . $email . "\n";
} else {
// ตรวจสอบกรณีผิดพลาดเรื่อง UNIQUE constraint
if (strpos($db->lastErrorMsg(), 'UNIQUE constraint failed') !== false) {
echo "แทรกข้อมูลล้มเหลว: Email '" . $email . "' มีอยู่แล้ว\n";
} else {
echo "แทรกข้อมูลล้มเหลว: " . $db->lastErrorMsg() . "\n";
}
}
$stmt->close(); // ปิด statement ที่เตรียมไว้
// ค้นหาข้อมูล
$search_name = 'ServBay Demo User';
$query_sql = "SELECT id, name, email, age FROM users WHERE name = :name";
$stmt = $db->prepare($query_sql);
$stmt->bindValue(':name', $search_name, SQLITE3_TEXT);
$result = $stmt->execute();
echo "ผลการค้นหา:\n";
$found = false;
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
print_r($row);
$found = true;
}
if (!$found) {
echo "ไม่พบข้อมูลที่ตรงกัน\n";
}
$result->finalize(); // ปล่อย resources ของผลลัพธ์
$stmt->close(); // ปิด statement ที่เตรียมไว้
// ปิดการเชื่อมต่อฐานข้อมูล
$db->close();
echo "ปิดการเชื่อมต่อฐานข้อมูลแล้ว\n";
?>
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
ตัวอย่างโค้ด (แบบ PDO)
PDO (PHP Data Objects) ให้ abstraction layer สำหรับเชื่อมต่อฐานข้อมูลชนิดต่างๆ ด้วยชื่อฟังก์ชันเดียวกัน แนะนำให้ใช้ PDO กับ SQLite เพราะยืดหยุ่นสูง ใช้ได้กับหลายฐานข้อมูล
php
<?php
// เส้นทางไฟล์ฐานข้อมูล
// แนะนำให้จัดเก็บฐานข้อมูลไว้ในโฟลเดอร์ย่อยในโปรเจกต์ เช่น data/
$db_file = __DIR__ . '/data/servbay_demo_pdo.sqlite'; // __DIR__ หมายถึงไดเรกทอรีของสคริปต์นี้
// ตรวจสอบให้แน่ใจว่าโฟลเดอร์สำหรับข้อมูลมีอยู่
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
try {
// สร้างอินสแตนซ์ PDO ใหม่
// DSN (Data Source Name) รูปแบบเป็น 'sqlite:เส้นทางไฟล์'
$dsn = 'sqlite:' . $db_file;
$pdo = new PDO($dsn);
// ตั้งโหมดแสดงข้อผิดพลาดแบบโยน exception เพื่อความสะดวกในการ debug
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ตั้งโหมดการ fetch ค่าเริ่มต้น เช่น associative array
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo "เชื่อมต่อฐานข้อมูลสำเร็จ: " . $db_file . "\n";
// สร้างตาราง
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
$pdo->exec($create_table_sql);
echo "ตาราง 'users' ถูกสร้างหรือมีอยู่แล้ว\n";
// แทรกข้อมูล
$name = 'ServBay PDO User';
$email = '[email protected]';
$age = 35;
// ใช้ statement แบบ prepare
$stmt = $pdo->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
// ดำเนินการ insert และตรวจสอบผลลัพธ์ (email เป็น UNIQUE)
try {
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "แทรกข้อมูลสำเร็จ: Name=" . $name . ", Email=" . $email . "\n";
} catch (PDOException $e) {
// ตรวจสอบข้อผิดพลาด unique constraint (SQLite error code 19)
if ($e->getCode() == '23000' || strpos($e->getMessage(), 'UNIQUE constraint failed') !== false) {
echo "แทรกข้อมูลล้มเหลว: Email '" . $email . "' มีอยู่แล้ว\n";
} else {
throw $e; // โยนข้อผิดพลาดประเภทอื่นต่อ
}
}
$stmt->closeCursor(); // ปล่อย resources ของ statement
// ค้นหาข้อมูล
$search_name = 'ServBay PDO User';
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => $search_name]);
$data = $stmt->fetchAll(); // ดึงข้อมูลทั้งหมด
echo "ผลการค้นหา:\n";
if ($data) {
print_r($data);
} else {
echo "ไม่พบข้อมูลที่ตรงกัน\n";
}
$stmt->closeCursor(); // ปล่อย resources ของ statement
} catch (PDOException $e) {
// ดักจับ exception จาก PDO
echo "ดำเนินการฐานข้อมูลล้มเหลว: " . $e->getMessage();
// สามารถใช้ $e->getCode() เพื่อตรวจสอบ error code ได้
}
// การเชื่อมต่อ PDO จะปิดอัตโนมัติเมื่อ script จบ ไม่ต้องเรียก close()
?>
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
ตำแหน่งของไฟล์ฐานข้อมูล:
ตัวอย่างข้างต้นจะสร้างไฟล์ฐานข้อมูล (servbay_demo.sqlite
และ servbay_demo_pdo.sqlite
) ไว้ในโฟลเดอร์ data/
ที่อยู่ในไดเรกทอรีเดียวกับไฟล์ PHP ของคุณ ตัวอย่างเช่น ถ้าไฟล์ PHP ของคุณอยู่ที่ /Applications/ServBay/www/my-servbay-project/index.php
ไฟล์ฐานข้อมูลจะอยู่ที่ /Applications/ServBay/www/my-servbay-project/data/
แนะนำให้เก็บไฟล์ฐานข้อมูลไว้ในโฟลเดอร์ย่อยของเว็บไซต์เพื่อความเป็นระเบียบและสะดวกในการสำรองข้อมูล ควรแน่ใจว่า user ที่รัน ServBay มีสิทธิ์เขียนไฟล์ในไดเรกทอรีดังกล่าว (โดยปกติการตั้งค่าจาก ServBay บน macOS จะไม่มีปัญหาอะไร)
ข้อควรระวัง
- ไฟล์ฐานข้อมูล SQLite มีข้อมูลสำคัญ ควรป้องกันไม่ให้เข้าถึงจากสาธารณะ แนะนำให้เก็บฐานข้อมูลนอกโฟลเดอร์ที่เข้าถึงผ่านเว็บ หรือกำหนดค่าเซิร์ฟเวอร์ (Caddy, Nginx ฯลฯ) เพื่อกันไม่ให้เข้าถึงไฟล์
.sqlite
โดยตรง ตัวอย่างในการเก็บไว้ในdata/
เพื่อความสะดวกในการทดสอบ ต้นแบบเท่านั้น กรณีใช้งานจริงควรเข้มงวดเรื่องความปลอดภัยมากขึ้น - SQLite เหมาะกับสถานการณ์ที่ไม่มีการเขียนข้อมูลพร้อมกันหลายๆ ครั้ง (write concurrency) หากต้องใช้งานในสภาพแวดล้อมที่มีการเขียนข้อมูลเข้ามาพร้อมกันจำนวนมาก อาจเกิดปัญหาคอขวดหรือ lock ได้ กรณีนี้แนะนำใช้ MySQL หรือ PostgreSQL ที่เป็นฐานข้อมูลแบบ client/server
- แม้ ServBay จะเปิดใช้งาน SQLite ให้อัตโนมัติ หากไม่พบข้อมูลใน
phpinfo()
ให้ตรวจสอบค่า config ของ PHP ใน ServBay หรือ restart บริการใหม่
คำถามที่พบบ่อย (FAQ)
ถาม: ต้องติดตั้ง SQLite เพิ่มเติมเองมั้ย?
ตอบ: ไม่จำเป็น ServBay มาพร้อมกับ PHP ที่เปิดใช้งาน SQLite ไว้แล้ว คุณสามารถใช้งานได้เลยในโค้ด PHP
ถาม: ควรเก็บไฟล์ฐานข้อมูล .sqlite
ไว้ที่ไหน?
ตอบ: แนะนำให้เก็บในโฟลเดอร์ย่อยที่อยู่ในโปรเจกต์เว็บไซต์แต่ไม่เปิดให้เข้าถึงผ่านเว็บ เช่น data/
หรือ database/
เพื่อความปลอดภัย ตัวอย่างโค้ดในบทความใช้ __DIR__ . '/data/'
สำหรับเส้นทางแบบ relative
ถาม: ทำไมสคริปต์ PHP ของฉันเชื่อมต่อหรือสร้างไฟล์ฐานข้อมูล SQLite ไม่ได้?
ตอบ: กรุณาตรวจสอบดังต่อไปนี้
- ตรวจสอบว่า ServBay กำลังทำงานอยู่ และเรียกไฟล์ PHP ของคุณผ่าน ServBay
- ดูที่
phpinfo()
เพื่อยืนยันว่าได้เปิดใช้งานส่วนขยายsqlite3
และpdo_sqlite
- ตรวจสอบโฟลเดอร์เก็บฐานข้อมูลว่าไม่มีปัญหาเรื่องสิทธิ์หรือโฟลเดอร์ไม่มีอยู่จริง
สรุป
ServBay มอบประสบการณ์การใช้ฐานข้อมูล SQLite สำหรับนักพัฒนา PHP ได้อย่างง่ายดาย คุณสามารถเริ่มพัฒนาและทดสอบระบบโดยใช้ SQLite ที่ติดตั้งและเปิดใช้งานให้อัตโนมัติใน ServBay บนโลคอลโดยไม่ต้องตั้งค่าซับซ้อน ด้วยความเบาและไม่ต้องตั้งค่าของ SQLite ทำให้ ServBay เป็นเครื่องมือท้องถิ่นที่มีประสิทธิภาพ ใช้งานง่ายสำหรับสายพัฒนา