การเชื่อมต่อฐานข้อมูลด้วย PDO: ตัวอย่างการเชื่อมต่อ MySQL
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการติดตั้งและตั้งค่า PDO รวมถึงการสร้าง Data Source Name (DSN) ที่ใช้ระบุข้อมูลการเชื่อมต่อกับฐานข้อมูล ในบทนี้ เราจะมาดูตัวอย่างการเชื่อมต่อกับฐานข้อมูล MySQL โดยใช้ PDO กันครับ
การสร้าง PDO object
การเชื่อมต่อกับฐานข้อมูล MySQL โดยใช้ PDO เริ่มต้นด้วยการสร้าง PDO object โดยใช้ DSN, username และ password ที่เราเตรียมไว้ในบทที่แล้ว
<?php
$host = 'localhost';
$db = 'mydatabase';
$user = 'myuser';
$pass = 'mypassword';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "เชื่อมต่อฐานข้อมูลสำเร็จ!";
} catch (\PDOException $e) {
throw new \PDOException("ไม่สามารถเชื่อมต่อฐานข้อมูลได้: " . $e->getMessage());
}
?>
คำอธิบายโค้ด:
$host,$db,$user,$pass,$charset: ตัวแปรเหล่านี้เก็บข้อมูลการเชื่อมต่อกับฐานข้อมูล MySQL ของเรา$dsn: สร้าง DSN string โดยใช้ข้อมูลที่เก็บไว้ในตัวแปรข้างต้น รูปแบบคือmysql:host=localhost;dbname=mydatabase;charset=utf8mb4$options: กำหนดค่าต่างๆ ให้กับ PDO object เช่น การจัดการ error และการ fetch ข้อมูลPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION: ตั้งค่าให้ PDO โยน exception เมื่อเกิด error ซึ่งจะช่วยให้เราจัดการ error ได้ง่ายขึ้นPDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC: ตั้งค่าให้ PDO fetch ข้อมูลในรูปแบบ associative array (array ที่มี key เป็นชื่อ column)PDO::ATTR_EMULATE_PREPARES => false: ปิดการจำลอง prepared statements เพื่อให้ PDO ใช้ prepared statements จริงๆ ซึ่งจะช่วยป้องกัน SQL injection ได้ดีขึ้นtry...catch: ใช้เพื่อจัดการ exception ที่อาจเกิดขึ้นระหว่างการเชื่อมต่อกับฐานข้อมูล หากการเชื่อมต่อสำเร็จ จะแสดงข้อความ "เชื่อมต่อฐานข้อมูลสำเร็จ!" หากเกิด error จะโยน exception ที่มี message บอกรายละเอียดของ error$pdo = new PDO($dsn, $user, $pass, $options): สร้าง PDO object โดยใช้ DSN, username, password และ options ที่เรากำหนดไว้
ข้อควรจำ:
- อย่าลืมเปลี่ยนค่า
$host,$db,$user, และ$passให้เป็นข้อมูลที่ถูกต้องของฐานข้อมูล MySQL ของคุณ - เก็บ username และ password ของฐานข้อมูลอย่างปลอดภัย อย่าเปิดเผยข้อมูลเหล่านี้ใน public repository หรือ commit ลงใน version control system
การจัดการข้อผิดพลาดในการเชื่อมต่อ
ดังที่ได้กล่าวไปแล้ว เราใช้ try...catch block เพื่อจัดการข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการเชื่อมต่อกับฐานข้อมูล การใช้ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION จะทำให้ PDO โยน exception เมื่อเกิด error ซึ่งเราสามารถจับ exception เหล่านี้ได้ใน catch block และจัดการได้อย่างเหมาะสม
ตัวอย่างเช่น เราสามารถ log error ไปยังไฟล์ หรือแสดงข้อความ error ที่เป็นมิตรต่อผู้ใช้ (user-friendly message) แทนที่จะแสดง error message ที่เป็น technical ให้ผู้ใช้เห็น
<?php
$host = 'localhost';
$db = 'mydatabase';
$user = 'myuser';
$pass = 'mypassword';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "เชื่อมต่อฐานข้อมูลสำเร็จ!";
} catch (\PDOException $e) {
// Log error ไปยังไฟล์
error_log("Database connection error: " . $e->getMessage());
// แสดงข้อความ error ที่เป็นมิตรต่อผู้ใช้
echo "เกิดข้อผิดพลาดในการเชื่อมต่อฐานข้อมูล กรุณาลองใหม่อีกครั้งภายหลัง";
}
?>
การปิดการเชื่อมต่อ
เมื่อเราใช้งาน PDO object เสร็จแล้ว เราควรปิดการเชื่อมต่อกับฐานข้อมูลเพื่อเป็นการจัดการ resource ที่ดี โดยการกำหนดค่า null ให้กับ PDO object
<?php
$host = 'localhost';
$db = 'mydatabase';
$user = 'myuser';
$pass = 'mypassword';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "เชื่อมต่อฐานข้อมูลสำเร็จ!";
// ทำงานกับฐานข้อมูล...
// ปิดการเชื่อมต่อ
$pdo = null;
echo "ปิดการเชื่อมต่อฐานข้อมูลแล้ว";
} catch (\PDOException $e) {
// Log error ไปยังไฟล์
error_log("Database connection error: " . $e->getMessage());
// แสดงข้อความ error ที่เป็นมิตรต่อผู้ใช้
echo "เกิดข้อผิดพลาดในการเชื่อมต่อฐานข้อมูล กรุณาลองใหม่อีกครั้งภายหลัง";
}
?>
สรุป:
ในบทนี้ เราได้เรียนรู้วิธีการเชื่อมต่อกับฐานข้อมูล MySQL โดยใช้ PDO รวมถึงการจัดการข้อผิดพลาดในการเชื่อมต่อ และการปิดการเชื่อมต่อ การเชื่อมต่อกับฐานข้อมูลเป็นขั้นตอนพื้นฐานที่สำคัญในการพัฒนา web application ที่มีการใช้งานฐานข้อมูล ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการตั้งค่า Attribute ของ PDO เพื่อปรับแต่งการทำงานของ PDO ให้เหมาะสมกับความต้องการของเรา