ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

การใช้ PDO กับ BLOB Data

การใช้ PDO กับ BLOB Data

ในบทความนี้ เราจะมาเรียนรู้วิธีการจัดการกับ Binary Large Object (BLOB) data โดยใช้ PDO ใน PHP BLOB data คือข้อมูลประเภท binary เช่น รูปภาพ, ไฟล์เสียง, หรือไฟล์วิดีโอ ซึ่งเราสามารถจัดเก็บไว้ในฐานข้อมูลได้ บทความนี้จะครอบคลุมตั้งแต่การอัพโหลดไฟล์, การเก็บไฟล์ในฐานข้อมูล, และการแสดงไฟล์จากฐานข้อมูล

BLOB Data คืออะไร?

BLOB (Binary Large Object) คือประเภทข้อมูลในฐานข้อมูลที่ใช้เก็บข้อมูล binary ที่มีขนาดใหญ่ เช่น รูปภาพ, ไฟล์เสียง, ไฟล์วิดีโอ, หรือเอกสารต่างๆ ข้อดีของการเก็บข้อมูลเหล่านี้ในฐานข้อมูลคือความสะดวกในการจัดการและการสำรองข้อมูล แต่ก็มีข้อเสียคืออาจทำให้ฐานข้อมูลมีขนาดใหญ่และส่งผลต่อประสิทธิภาพ

ขั้นตอนการจัดการ BLOB Data ด้วย PDO

  1. การอัพโหลดไฟล์: รับไฟล์จากผู้ใช้ผ่านฟอร์ม HTML
  2. การอ่านไฟล์: อ่านไฟล์ที่อัพโหลดเข้ามาเป็น binary data
  3. การเก็บไฟล์ในฐานข้อมูล: ใช้ PDO prepared statements เพื่อ insert binary data ลงในฐานข้อมูล
  4. การดึงไฟล์จากฐานข้อมูล: ดึง binary data จากฐานข้อมูลโดยใช้ PDO
  5. การแสดงไฟล์จากฐานข้อมูล: ส่ง HTTP header ที่ถูกต้องและแสดง binary data

1. การอัพโหลดไฟล์

เริ่มต้นด้วยการสร้างฟอร์ม HTML สำหรับอัพโหลดไฟล์:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <label for="fileToUpload">Select image to upload:</label>
    <input type="file" name="fileToUpload" id="fileToUpload"><br><br>
    <input type="submit" value="Upload Image" name="submit">
</form>

คำอธิบาย:

  • `enctype="multipart/form-data"`: จำเป็นสำหรับการอัพโหลดไฟล์
  • `input type="file"`: สร้างช่องสำหรับเลือกไฟล์
  • `name="fileToUpload"`: ชื่อของ input field ที่ใช้ในการเข้าถึงไฟล์ใน PHP

2. การอ่านไฟล์

ในไฟล์ `upload.php` เราจะอ่านไฟล์ที่อัพโหลดเข้ามา:

<?php
if (isset($_POST["submit"])) {
    $target_dir = "uploads/"; // Directory to store uploaded files (make sure this directory exists and is writable)
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
    $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

    // Check if image file is a actual image or fake image
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check === false) {
        echo "File is not an image.";
        exit;
    }

    // Check file size
    if ($_FILES["fileToUpload"]["size"] > 500000) {
        echo "Sorry, your file is too large.";
        exit;
    }

    // Allow certain file formats
    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
    && $imageFileType != "gif" ) {
        echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
        exit;
    }

    $image = file_get_contents($_FILES["fileToUpload"]["tmp_name"]);

    // Proceed to database insertion (see next step)
}
?>

คำอธิบาย:

  • ตรวจสอบว่ามีการกดปุ่ม Submit
  • กำหนด directory ที่จะเก็บไฟล์ (ต้องสร้าง directory นี้ก่อนและให้สิทธิ์ในการเขียน)
  • ตรวจสอบว่าเป็นไฟล์รูปภาพจริง (ป้องกันการอัพโหลดไฟล์ที่เป็นอันตราย)
  • ตรวจสอบขนาดไฟล์
  • ตรวจสอบนามสกุลไฟล์
  • `file_get_contents($_FILES["fileToUpload"]["tmp_name"])`: อ่านไฟล์เป็น binary data

3. การเก็บไฟล์ในฐานข้อมูล

ตอนนี้เราจะใช้ PDO เพื่อเก็บ binary data ลงในฐานข้อมูล:

<?php
// (ต่อจากโค้ดก่อนหน้า)

// Database credentials
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "INSERT INTO images (filename, image_data) VALUES (:filename, :image_data)";
    $stmt = $conn->prepare($sql);

    $stmt->bindParam(':filename', basename($_FILES["fileToUpload"]["name"]));
    $stmt->bindParam(':image_data', $image, PDO::PARAM_LOB); // ใช้ PDO::PARAM_LOB สำหรับ BLOB data

    $stmt->execute();

    echo "New record created successfully";

} catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

$conn = null;
?>

คำอธิบาย:

  • สร้าง connection ไปยังฐานข้อมูล
  • สร้าง SQL query สำหรับ INSERT ข้อมูล โดยใช้ prepared statement
  • `bindParam(':filename', basename($_FILES["fileToUpload"]["name"]))`: ผูกค่า filename
  • `bindParam(':image_data', $image, PDO::PARAM_LOB)`: ผูก binary data โดยใช้ `PDO::PARAM_LOB` ซึ่งสำคัญมากสำหรับการจัดการ BLOB data
  • `execute()`: execute query
  • จัดการ exception ในกรณีที่เกิดข้อผิดพลาด

ข้อควรจำ: สร้างตาราง `images` ในฐานข้อมูลของคุณด้วยโครงสร้างดังนี้:

CREATE TABLE images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    filename VARCHAR(255) NOT NULL,
    image_data MEDIUMBLOB NOT NULL
);

ตรวจสอบให้แน่ใจว่าประเภทข้อมูลของคอลัมน์ `image_data` เป็น `BLOB`, `MEDIUMBLOB`, หรือ `LONGBLOB` ขึ้นอยู่กับขนาดของไฟล์ที่คุณต้องการเก็บ

4. การดึงไฟล์จากฐานข้อมูล

ในการดึงไฟล์จากฐานข้อมูล เราจะใช้ PDO เพื่อ select ข้อมูลจากตาราง:

<?php
// Database credentials (เหมือนเดิม)
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT image_data, filename FROM images WHERE id = :id"; // สมมติว่าเราต้องการดึงรูปภาพที่มี ID = 1
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':id', $_GET['id']); // Assuming the image ID is passed in the URL
    $stmt->execute();

    $stmt->bindColumn(1, $lob, PDO::PARAM_LOB);
    $stmt->bindColumn(2, $filename);

    $stmt->fetch(PDO::FETCH_BOUND);

    header("Content-Type: image/jpeg"); // Adjust content type based on the actual image type
    header("Content-Disposition: inline; filename=\"" . $filename . "\"");
    echo $lob;


} catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

$conn = null;
?>

คำอธิบาย:

  • สร้าง connection ไปยังฐานข้อมูล
  • สร้าง SQL query สำหรับ SELECT ข้อมูล
  • `bindParam(':id', 1)`: ผูกค่า ID (ในตัวอย่างนี้เราสมมติว่าต้องการดึงรูปภาพที่มี ID = 1)
  • `execute()`: execute query
  • `header("Content-Type: image/jpeg")`: กำหนด HTTP header เป็น `image/jpeg` (หรือ content type ที่ถูกต้องตามชนิดของไฟล์)
  • `echo $image_data`: แสดง binary data ออกมา

5. การแสดงไฟล์จากฐานข้อมูล

เพื่อให้แสดงรูปภาพใน HTML เราจะใช้ tag `<img>` โดยกำหนด `src` เป็น URL ของ script ที่ดึงรูปภาพจากฐานข้อมูล:

<img src="get_image.php?id=1" alt="Image from database">

คำอธิบาย:

  • `src="get_image.php?id=1"`: กำหนด URL ของ script ที่ดึงรูปภาพจากฐานข้อมูล และส่งค่า ID ของรูปภาพผ่าน query string
  • `alt="Image from database"`: ข้อความที่จะแสดงหากรูปภาพไม่สามารถโหลดได้

กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย

  • ขนาดไฟล์ที่ใหญ่เกินไป: ตรวจสอบขนาดไฟล์ก่อนที่จะทำการอัพโหลดและเก็บลงในฐานข้อมูล หากไฟล์มีขนาดใหญ่เกินไป อาจส่งผลต่อประสิทธิภาพของฐานข้อมูล
  • Content Type ไม่ถูกต้อง: ตรวจสอบให้แน่ใจว่าคุณกำหนด Content Type ใน HTTP header ให้ถูกต้องตามชนิดของไฟล์ หาก Content Type ไม่ถูกต้อง เบราว์เซอร์อาจไม่สามารถแสดงไฟล์ได้อย่างถูกต้อง
  • การจัดการ Error: ควรมีการจัดการ error ที่ครอบคลุม เพื่อให้ทราบถึงสาเหตุของปัญหาและสามารถแก้ไขได้อย่างรวดเร็ว
  • Security: ควรมีการตรวจสอบไฟล์ที่อัพโหลดเข้ามาอย่างละเอียด เพื่อป้องกันการอัพโหลดไฟล์ที่เป็นอันตราย เช่น ไฟล์ PHP หรือไฟล์ที่อาจมีโค้ด malicious

สรุป

ในบทความนี้ เราได้เรียนรู้วิธีการจัดการกับ BLOB data โดยใช้ PDO ใน PHP ตั้งแต่การอัพโหลดไฟล์, การเก็บไฟล์ในฐานข้อมูล, และการแสดงไฟล์จากฐานข้อมูล การจัดการ BLOB data อาจมีความซับซ้อน แต่ด้วยความเข้าใจที่ถูกต้องและการใช้งาน PDO อย่างเหมาะสม เราสามารถจัดการกับข้อมูลประเภทนี้ได้อย่างมีประสิทธิภาพและปลอดภัย

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์