PlusMagi's Blog By Pitt Phunsanit

PHP PDO: วิธีเชื่อมต่อฐานข้อมูลที่ปลอดภัยและมีประสิทธิภาพ

ในการพัฒนาเว็บแอปพลิเคชันด้วยภาษา PHP หนึ่งในขั้นตอนที่สำคัญที่สุดคือ การเชื่อมต่อและจัดการกับฐานข้อมูล ในอดีตเราอาจจะคุ้นเคยกับฟังก์ชันกลุ่ม mysql_* (ซึ่งยกเลิกไปแล้ว) หรือ mysqli_* แต่ในปัจจุบัน ตัวเลือกที่เป็นมาตรฐานและได้รับการยอมรับมากที่สุดคือ PDO หรือ PHP Data Objects


PHP PDO คืออะไร?

PDO (PHP Data Objects) คือ Extension ของ PHP ที่ทำหน้าที่เป็น “ตัวกลาง” (Database Abstraction Layer) ในการเชื่อมต่อกับฐานข้อมูล หมายความว่า PDO ไม่ได้ยึดติดกับฐานข้อมูลใดฐานข้อมูลหนึ่ง แต่ระบบนี้รองรับฐานข้อมูลหลากหลายประเภท เช่น MySQL, PostgreSQL, SQLite, MS SQL Server และ Oracle โดยใช้คำสั่ง (Method) ในรูปแบบเดียวกันทั้งหมด


ทำไมต้องใช้ PDO? (ข้อดีหลัก)


เริ่มต้นใช้งาน PHP PDO

การเชื่อมต่อฐานข้อมูล (Connection)

การเชื่อมต่อจะใช้การสร้าง Object จากคลาส PDO โดยต้องระบุ DSN (Data Source Name), Username และ Password แนะนำให้ครอบด้วย try-catch เสมอ เพื่อความปลอดภัยหากการเชื่อมต่อล้มเหลว

<?php
$host = 'localhost';
$db   = 'my_database';
$user = 'root';
$pass = 'password123';
$charset = 'utf8mb4';

// กำหนด Data Source Name
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

// กำหนด Option เพิ่มเติมเพื่อความปลอดภัยและการจัดการ Error
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, // ให้โยน Exception เมื่อเจอ Error
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,       // ดึงข้อมูลออกมาในรูปแบบ Array Key-Value
    PDO::ATTR_EMULATE_PREPARES   => false,                  // ปิดการจำลอง Prepared Statement เพื่อความปลอดภัยที่แท้จริง
];

try {
     $pdo = new PDO($dsn, $user, $pass, $options);
     echo "เชื่อมต่อฐานข้อมูลสำเร็จ!";
} catch (\PDOException $e) {
     // ในการใช้งานจริง ไม่ควร echo $e->getMessage() ให้ผู้ใช้ทั่วไปเห็น เพราะอาจหลุดข้อมูลสำคัญ
     die("เกิดข้อผิดพลาดในการเชื่อมต่อ: " . $e->getMessage());
}

การดึงข้อมูล (SELECT) ด้วย Prepared Statements

เพื่อความปลอดภัย เราจะไม่นำตัวแปรไปใส่ในคำสั่ง SQL ตรงๆ แต่จะใช้เครื่องหมาย : (Named Placeholder) แทน แล้วค่อยส่งค่าเข้าไปผูก (Bind) ทีหลัง

<?php
// คำสั่ง SQL ที่ใช้ Placeholder (:role)
$sql = "SELECT id, username, email FROM users WHERE role = :role";
$stmt = $pdo->prepare($sql);

// ประมวลผลโดยส่งค่าตัวแปรเข้าไปใน Array
$stmt->execute(['role' => 'admin']);

// ดึงข้อมูลทั้งหมดออกมา
$users = $stmt->fetchAll();

foreach ($users as $user) {
    echo "ID: " . $user['id'] . " - Username: " . $user['username'] . "<br>";
}

การเพิ่มข้อมูล (INSERT)

ใช้หลักการเดียวกับข้างต้น คือสร้าง Placeholder เพื่อความปลอดภัยจาก SQL Injection

<?php
$sql = "INSERT INTO users (username, email, password) VALUES (:username, :email, :password)";
$stmt = $pdo->prepare($sql);

$data = [
    'username' => 'john_doe',
    'email'    => 'john@example.com',
    'password' => password_hash('securepwd123', PASSWORD_DEFAULT)
];

if ($stmt->execute($data)) {
    // ดึง ID ล่าสุดที่เพิ่งเพิ่มเข้าไป
    $lastId = $pdo->lastInsertId();
    echo "เพิ่มข้อมูลสำเร็จ! ID ล่าสุดคือ: " . $lastId;
}

การแก้ไข (UPDATE) และ ลบข้อมูล (DELETE)

<?php
// ตัวอย่างการ UPDATE
$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([
    'email' => 'new_email@example.com',
    'id'    => 5
]);

// ตัวอย่างการ DELETE
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['id' => 5]);

// ตรวจสอบจำนวนแถวที่ได้รับผลกระทบ
echo "จำนวนแถวที่ถูกลบหรือแก้ไข: " . $stmt->rowCount();

สรุป

การเปลี่ยนมาใช้ PHP PDO ถือเป็นก้าวสำคัญในการเขียนโค้ด PHP ให้ทันสมัย (Modern PHP) มันไม่เพียงแต่ช่วยให้ระบบของคุณ ปลอดภัยจากการถูกเจาะระบบผ่าน SQL Injection เท่านั้น แต่ยังช่วยให้โค้ดของคุณมีความยืดหยุ่น พร้อมที่จะขยายสเกลหรือเปลี่ยนระบบฐานข้อมูลในอนาคตได้อย่างง่ายดาย


อ่านเพิ่มเติม

Exit mobile version