การใช้งาน PHP MySQL Extensions (mysqlnd, mysqli, PDO) ใน ServBay
ServBay เป็นสภาพแวดล้อมการพัฒนาเว็บแบบโลคอลที่ครบวงจรทรงพลัง ช่วยให้การเชื่อมต่อและทำงานกับฐานข้อมูลในแอปพลิเคชัน PHP เป็นเรื่องง่าย โดย ServBay ได้ติดตั้งและเปิดใช้งานโดยค่าเริ่มต้นสำหรับส่วนขยายสำคัญของฐานข้อมูล MySQL ได้แก่ mysqlnd
, mysqli
และ PDO_MySQL
ให้ครบทุกรุ่น PHP ที่รองรับ ซึ่งหมายความว่าคุณสามารถเริ่มใช้งาน MySQL หรือ MariaDB ในโครงการ PHP ได้ทันที โดยไม่ต้องตั้งค่าใด ๆ เพิ่มเติม
ส่วนขยาย PHP MySQL ที่มีใน ServBay
ServBay ได้เตรียมสามส่วนขยาย MySQL หลักในตัว เพื่อรับประกันความเข้ากันได้และประสิทธิภาพสูงสุด ดังนี้
- MySQL Native Driver (
mysqlnd
): ไดรเวอร์โดยตรงของ PHP สำหรับ MySQL/MariaDB ที่ใช้เป็นพื้นฐานให้mysqli
และPDO_MySQL
ช่วยสื่อสารกับเซิร์ฟเวอร์ฐานข้อมูล ให้ประสิทธิภาพและการจัดการหน่วยความจำที่ดีกว่า - MySQLi (
mysqli
): ส่วนขยาย MySQL Improved รองรับทั้งรูปแบบเชิงวัตถุและโพรซีเดอร์ เพื่อเชื่อมต่อและจัดการ MySQL/MariaDB รองรับฟีเจอร์ขั้นสูง เช่น prepared statements, ธุรกรรม, stored procedures และหลายคำสั่งในหนึ่งคำสั่ง - PDO MySQL (
PDO_MySQL
): เป็น driver MySQL สำหรับ PHP Data Objects (PDO) ที่ให้ API เดียวสำหรับใช้งานฐานข้อมูลหลากหลายชนิด (เช่น MySQL, MariaDB, PostgreSQL, SQLite ฯลฯ) เพิ่มความคล่องตัวและนำโค้ดไปใช้ในโปรเจคอื่นได้ง่าย
สถานะการเปิดใช้งาน
ใน ServBay ส่วนขยาย mysqlnd
, mysqli
และ PDO_MySQL
จะถูกเปิดใช้งานโดยอัตโนมัติในทุกเวอร์ชันของ PHP โดยที่คุณไม่ต้องปรับตั้งค่าใด ๆ ServBay ได้เตรียม php.ini
ให้พร้อมใช้งานแล้ว คุณสามารถเรียกใช้งานส่วนขยายเหล่านี้ในโค้ดเพื่อเชื่อมต่อฐานข้อมูลได้เลย
เจาะลึกแต่ละส่วนขยาย PHP MySQL
การเลือกใช้ส่วนขยายที่เหมาะสมจะช่วยให้ตอบโจทย์ความต้องการแต่ละโปรเจคได้ดียิ่งขึ้น โดยแต่ละตัวมีรายละเอียดดังนี้
MySQL Native Driver (
mysqlnd
)- บทบาทหลัก:
mysqlnd
คือ native driver ที่เขียนด้วย C ของ PHP สำหรับการเชื่อมต่อ MySQL/MariaDB ใช้งานเป็นพื้นฐานให้กับmysqli
และPDO_MySQL
- คุณสมบัติเด่น: ตั้งแต่ PHP 5.3 เป็นต้นไป
mysqlnd
เป็น default driver สำหรับmysqli
และPDO_MySQL
ไม่ต้องพึ่งไลบรารีภายนอกอย่างlibmysqlclient
- จุดเด่นหลัก: เร็ว ประหยัดหน่วยความจำ ซึ่งเหนือกว่า
libmysqlclient
และยังรองรับฟีเจอร์สมัยใหม่ (เช่น async query, persistent connection, plugin API ฯลฯ) โดยทั่วไปคุณไม่ต้องเรียก API ของmysqlnd
โดยตรง แต่จะใช้งานผ่านmysqli
หรือPDO
- บทบาทหลัก:
MySQLi (
mysqli
)- บทบาทหลัก: MySQL Improved Extension สำหรับ PHP ที่สร้างขึ้นเพื่อ MySQL (4.1.3 ขึ้นไป) และ MariaDB
- คุณสมบัติเด่น: รองรับทั้งแนวเชิงวัตถุ (OOP) และโพรซีเดอร์ รองรับ prepared statements (ป้องกัน SQL injection ได้ดี), ควบคุมธุรกรรม, stored procedures, การ execute หลาย statement ในคำสั่งเดียว ฯลฯ
- จุดเด่นหลัก: ฟังก์ชันครบ ประสิทธิภาพดี เหมาะกับงานที่ใช้คุณสมบัติเฉพาะของ MySQL/MariaDB หากท่านมั่นใจว่าใช้งานเฉพาะฐานข้อมูลนี้
mysqli
จะตอบโจทย์มาก
PDO MySQL (
PDO_MySQL
)- บทบาทหลัก: PHP Data Objects (PDO) ให้ API มาตรฐานสำหรับการติดต่อต่างฐานข้อมูลในรูปแบบเดียว ใช้งานโค้ดน้อย ประหยัดและกระชับ
- คุณสมบัติเด่น: ใช้งานฐานข้อมูลผ่าน API เดียว (
PDO
/PDOStatement
), บังคับใช้ prepared statement โดยอัตโนมัติ (ผ่านprepare()
และexecute()
) ช่วยป้องกัน SQL injection และรองรับ business transaction - จุดเด่นหลัก: สะดวกต่อการย้ายฐานข้อมูล ถ้าคุณต้องการเปลี่ยนจาก MySQL/MariaDB ไปฐานข้อมูลอื่นทีหลัง (PostgreSQL, SQLite ฯลฯ) จะเปลี่ยนน้อยมาก โค้ดอ่านง่าย ปลอดภัย เหมาะสำหรับโครงการใหม่เป็นอย่างยิ่ง
ตัวอย่างโค้ด PHP: การเชื่อมต่อและใช้งานฐานข้อมูล
ตัวอย่างต่อไปนี้จะแสดงวิธีใช้ mysqli
และ PDO
เพื่อเชื่อมต่อฐานข้อมูลที่ตั้งค่าไว้ใน ServBay (เช่น MariaDB หรือ MySQL) และใช้งานเบื้องต้น
ข้อกำหนดเบื้องต้น:
- ต้องเปิดใช้งานบริการ MySQL หรือ MariaDB ใน ServBay
- ตั้งค่าสร้างฐานข้อมูลชื่อ
servbay_db
แล้ว - มี user
servbay_user
และรหัสผ่านyour_password
พร้อมสิทธิ์เข้าถึงฐานข้อมูลนี้ - มีตาราง
users
ในservbay_db
โดยประกอบด้วยคอลัมน์id
(INT, PK, AI),name
(VARCHAR),email
(VARCHAR),age
(INT)
คุณสามารถใช้ phpMyAdmin ที่มากับ ServBay หรือเครื่องมือฐานข้อมูลอื่น ๆ ตั้งค่าตามที่กำหนดได้เลย
ตัวอย่างโค้ด (mysqli
)
php
<?php
// --- mysqli ตัวอย่าง ---
// พารามิเตอร์สำหรับเชื่อมต่อฐานข้อมูล
$servername = "127.0.0.1"; // หรือ 'localhost'
$port = 3306; // พอร์ตเริ่มต้นของ MySQL/MariaDB ใน ServBay
$username = "servbay_user";
$password = "your_password"; // กรุณาเปลี่ยนเป็นรหัสจริงของคุณ
$dbname = "servbay_db";
// สร้างการเชื่อมต่อแบบ OOP
$conn = new mysqli($servername, $username, $password, $dbname, $port);
// ตรวจสอบการเชื่อมต่อ
if ($conn->connect_error) {
die("mysqli Connection failed: " . $conn->connect_error);
}
echo "mysqli Connected successfully<br>";
// แทรกข้อมูล (ใช้ prepared statements ป้องกัน SQL injection)
$stmt = $conn->prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
$name = "ServBay Demo";
$email = "[email protected]";
$age = 5;
// "ssi" คือ string, string, integer ตามลำดับ
$stmt->bind_param("ssi", $name, $email, $age);
if ($stmt->execute()) {
echo "mysqli: New record created successfully<br>";
} else {
echo "mysqli Error: " . $stmt->error . "<br>";
}
$stmt->close();
// คิวรีข้อมูล
$sql = "SELECT id, name, email, age FROM users WHERE name = 'ServBay Demo'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "mysqli Queried data:<br>";
// แสดงข้อมูลที่ได้
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. " - Age: " . $row["age"]. "<br>";
}
} else {
echo "mysqli: 0 results found<br>";
}
// ปิดการเชื่อมต่อ
$conn->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
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
ตัวอย่างโค้ด (PDO
)
php
<?php
// --- PDO ตัวอย่าง ---
// พารามิเตอร์สำหรับเชื่อมต่อฐานข้อมูล
$host = '127.0.0.1'; // หรือ 'localhost'
$port = 3306; // พอร์ตเริ่มต้นของ MySQL/MariaDB ใน ServBay
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // กรุณาเปลี่ยนเป็นรหัสจริงของคุณ
$charset = 'utf8mb4';
// Data Source Name (DSN)
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=$charset";
// ตัวเลือกสำหรับสร้าง PDO instance
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // แจ้ง error เป็น exception
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // ดึงข้อมูลแบบ associative array
PDO::ATTR_EMULATE_PREPARES => false, // ใช้ prepared statement แท้จริง
];
try {
// สร้าง PDO instance เชื่อมต่อฐานข้อมูล
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO Connected successfully<br>";
// แทรกข้อมูล (ใช้ prepared statement เพื่อความปลอดภัย)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Demo';
$email = '[email protected]';
$age = 10;
// bind ค่าพารามิเตอร์ และ execute
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO: New record created successfully<br>";
// คิวรีข้อมูล
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Demo']);
// ดึงข้อมูลทั้งหมด
$users = $stmt->fetchAll(); // ได้ associative array
if ($users) {
echo "PDO Queried data:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO: 0 results found<br>";
}
} catch (\PDOException $e) {
// ดักจับและแสดง error ในการเชื่อมต่อหรือ sql
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// PDO จะปิด connection อัตโนมัติเมื่อ script จบ ไม่ต้อง close() เอง
// $pdo = null; // กำหนด null เพื่อปิด connection แบบชัดเจน
?>
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
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
วิธีวางโค้ด: ให้นำโค้ดตัวอย่างข้างต้นไปบันทึกเป็นไฟล์ .php
(เช่น db_test_mysqli.php
หรือ db_test_pdo.php
) แล้วนำไปวางไว้ในโฟลเดอร์เว็บไซต์ root ของ ServBay (เช่น /Applications/ServBay/www/myproject/
) จากนั้นเข้าเบราว์เซอร์ที่ URL ที่เกี่ยวข้อง (เช่น http://myproject.servbay.demo/db_test_mysqli.php
) ตรวจสอบให้แน่ใจว่าเว็บไซต์ของคุณอยู่ใน ServBay และทำงานได้ปกติ
คำถามที่พบบ่อย (FAQ)
ถาม: จำเป็นต้องติดตั้ง MySQL extension สำหรับ PHP เองใน ServBay หรือไม่?
ตอบ: ไม่จำเป็น ServBay ได้ติดตั้งและเปิดใช้งานส่วนขยายสำคัญอย่าง mysqlnd
, mysqli
และ PDO_MySQL
ให้ครบถ้วนสำหรับ PHP ทุกเวอร์ชันอยู่แล้ว คุณสามารถเรียกใช้จากโค้ดได้ทันทีโดยไม่ต้องตั้งค่าหรือดาวน์โหลดเพิ่ม
ถาม: ควรเลือกใช้ mysqli
หรือ PDO
?
ตอบ:
- แนะนำใช้
PDO
: ถ้าคุณต้องการโค้ดยืดหยุ่น รองรับฐานข้อมูลหลายชนิด (ไม่จำกัดเฉพาะ MySQL/MariaDB) หรือเน้นความปลอดภัยสมัยใหม่ ใช้ PDO จะง่ายกว่า เพราะบังคับใช้ prepared statement และโค้ดอ่านง่าย - ใช้
mysqli
เมื่อเหมาะสม: ถ้าโปรเจคแน่นอนว่าต้องใช้แค่ MySQL/MariaDB และต้องการควบคุมหรือต้องใช้ฟีเจอร์เฉพาะ เช่น Multi Query, Transaction, Stored Procedure สามารถเลือก mysqli ได้ เพราะประสิทธิภาพสูงและยืดหยุ่นดี
สำหรับโปรเจคใหม่โดยทั่วไป แนะนำให้ใช้ PDO
ถาม: จะหาค่าที่ใช้เชื่อมต่อ MySQL/MariaDB ที่รันใน ServBay ได้อย่างไร?
ตอบ:
- Host: ส่วนใหญ่จะเป็น
127.0.0.1
หรือlocalhost
- พอร์ต (Port): ปกติ ServBay ใช้
3306
เป็นค่าเริ่มต้น คุณสามารถตรวจสอบพอร์ตจริงได้ในหน้าจัดการแพ็กเกจซอฟต์แวร์ของ ServBay - ชื่อผู้ใช้/รหัสผ่าน: ใช้ข้อมูลบัญชีผู้ใช้ฐานข้อมูลที่คุณตั้งไว้ใน MySQL/MariaDB ไม่ควรใช้ root กับโค้ด production สามารถแก้ไขและจัดการผ่าน phpMyAdmin หรือเครื่องมือจัดการฐานข้อมูลที่แนบมากับ ServBay
- ชื่อฐานข้อมูล: ใช้ฐานข้อมูลที่คุณสร้างไว้สำหรับเว็บไซต์นั้น ๆ
ถาม: ถ้ามีโปรเจคเก่าที่ใช้ฟังก์ชัน mysql_*
(ที่เลิกใช้แล้ว) จะรองรับใน ServBay หรือไม่?
ตอบ: รองรับ สำหรับช่วยให้นักพัฒนาที่มีโปรเจคเก่าสามารถดูแลหรือย้ายระบบได้ง่าย ServBay จึงรวมการรองรับฟังก์ชันเก่า mysql_*
ไว้ใน PHP 5.6 (เช่น mysql_connect
) ด้วย ถึงแม้ฟังก์ชันเหล่านี้จะยกเลิกใช้ตั้งแต่ PHP 5.5 และถูกถอดออกใน PHP 7.0 แล้วก็ตาม คุณสามารถรันโค้ดเก่าที่พึ่งพาฟังก์ชันชุดนี้ได้ทันทีใน ServBay PHP 5.6 โดยไม่ต้องไปหาตัวติดตั้ง PHP รุ่นเก่าให้ยุ่งยาก
อย่างไรก็ตาม ขอแนะนำให้
- ใช้ฟีเจอร์นี้สำหรับงานเฉพาะกิจ ชั่วคราว หรือดูแลระบบเก่าเท่านั้น
- สำหรับโปรเจคใหม่หรือปรับปรุงโค้ดเก่าให้ทันสมัย ให้ย้ายไปใช้
mysqli
หรือPDO
เพื่อความปลอดภัยมากขึ้นและได้ฟีเจอร์ ฐานข้อมูลที่ล้ำสมัยกว่าเดิม เนื่องจากฟังก์ชันmysql_*
มีความเสี่ยงต่อ SQL injection และไม่รองรับสิ่งใหม่ ๆ
สรุป
ServBay ได้รวมและเปิดใช้งานส่วนขยาย mysqlnd
, mysqli
และ PDO_MySQL
สำหรับ PHP ทุกรุ่นอย่างสมบูรณ์ รวมทั้งรองรับ mysql_*
สำหรับ PHP 5.6 เพื่องานโปรเจคเก่าโดยเฉพาะ จึงช่วยลดขั้นตอนการติดตั้งและตั้งค่า ทำให้เหลือแค่เลือกใช้ส่วนขยายที่เหมาะกับงานของคุณ (แนะนำ PDO หรือ mysqli) จากนั้นก็โฟกัสกับตรรกะของโค้ดได้เลย
ความสะดวกนี้ ช่วยให้คุณพัฒนา ทดสอบ ดูแล Web Service ของคุณบน ServBay ได้อย่างรวดเร็ว ในสภาพแวดล้อมที่เสถียรและทรงประสิทธิภาพ