PHP MySQL BLOB

摘要:在本教程中,您将学习如何使用 PHP PDO 处理 BLOB 数据。我们将向您展示如何在 MySQL 数据库中插入、更新和选择 BLOB 数据。

PHP MySQL Blob

有时,出于安全原因,您可能需要在 MySQL 数据库中存储大型数据对象,例如图像、PDF 文件和视频。

MySQL提供了可以容纳大量数据的BLOB类型。 BLOB 代表二进制大数据对象。 BLOB 对象的最大值由可用内存和通信包大小指定。您可以使用 MySQL 中的max_allowed_packet变量和 PHP 设置中的post_max_size来更改通信包大小。

让我们看看 PHP PDO 如何处理 MySQL 中的 BLOB 类型。

首先,我们在示例数据库中创建一个名为files新表来进行练习。

files表包含三列:

  • id列为主自增列
  • mime 列存储文件的 mime 类型。
  • 数据类型为BLOB的数据列,用于存储文件的内容。

以下CREATE TABLE语句创建files表:

CREATE TABLE files (
    id   INT           AUTO_INCREMENT PRIMARY KEY,
    mime VARCHAR (255) NOT NULL,
    data BLOB          NOT NULL
);Code language: SQL (Structured Query Language) (sql)

其次,我们定义一个名为BlobDemo的类,代码如下:

<?php

/**
 * PHP MySQL BLOB Demo
 */
class BlobDemo {

    const DB_HOST = 'localhost';
    const DB_NAME = 'classicmodels';
    const DB_USER = 'root';
    const DB_PASSWORD = '';

    /**
     * Open the database connection
     */
    public function __construct() {
        // open database connection
        $conStr = sprintf("mysql:host=%s;dbname=%s;charset=utf8", self::DB_HOST, self::DB_NAME);

        try {
            $this->pdo = new PDO($conStr, self::DB_USER, self::DB_PASSWORD);
            //for prior PHP 5.3.6
            //$conn->exec("set names utf8");
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

    /**
     * close the database connection
     */
    public function __destruct() {
        // close the database connection
        $this->pdo = null;
    }

}Code language: PHP (php)

__construct()方法中,我们打开与 MySQL 数据库的数据库连接,并在__destruct()方法中关闭该连接。

将 BLOB 数据插入数据库

PHP PDO 提供了一种使用流和准备语句处理 BLOB 数据的便捷方法。要将文件的内容插入到 BLOB 列中,请按照以下步骤操作:

  • 首先,打开文件以二进制模式读取。
  • 其次,构造一个INSERT语句
  • 第三,使用bindParam()方法将文件句柄绑定到准备好的语句,并调用execute()方法来执行查询。

请参阅以下insertBlob()方法:

   /**
     * insert blob into the files table
     * @param string $filePath
     * @param string $mime mimetype
     * @return bool
     */
    public function insertBlob($filePath, $mime) {
        $blob = fopen($filePath, 'rb');

        $sql = "INSERT INTO files(mime,data) VALUES(:mime,:data)";
        $stmt = $this->pdo->prepare($sql);

        $stmt->bindParam(':mime', $mime);
        $stmt->bindParam(':data', $blob, PDO::PARAM_LOB);

        return $stmt->execute();
    }Code language: PHP (php)

请注意, PDO::PARAM_LOB指示 PDO 将数据映射为流。

更新现有的 BLOB 列

要更新 BLOB 列,请使用与将数据插入 BLOB 列中所述相同的技术。请参阅以下updateBlob()方法:

   /**
     * update the files table with the new blob from the file specified
     * by the filepath
     * @param int $id
     * @param string $filePath
     * @param string $mime
     * @return bool
     */
    function updateBlob($id, $filePath, $mime) {

        $blob = fopen($filePath, 'rb');

        $sql = "UPDATE files
                SET mime = :mime,
                    data = :data
                WHERE id = :id;";

        $stmt = $this->pdo->prepare($sql);

        $stmt->bindParam(':mime', $mime);
        $stmt->bindParam(':data', $blob, PDO::PARAM_LOB);
        $stmt->bindParam(':id', $id);

        return $stmt->execute();
    }Code language: PHP (php)

从 BLOB 列查询数据

以下步骤描述如何从 BLOB 列中选择数据:

  • 首先,构造一条SELECT 语句
  • 其次,使用PDOStatement对象的bindColumn()方法绑定相应的参数。
  • 第三,执行语句。

请参阅以下selectBlob()方法:

    /**
     * select data from the the files
     * @param int $id
     * @return array contains mime type and BLOB data
     */
    public function selectBlob($id) {

        $sql = "SELECT mime,
                        data
                   FROM files
                  WHERE id = :id;";

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute(array(":id" => $id));
        $stmt->bindColumn(1, $mime);
        $stmt->bindColumn(2, $data, PDO::PARAM_LOB);

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

        return array("mime" => $mime,
            "data" => $data);
    }Code language: PHP (php)

PHP MySQL BLOB 示例

在下面的示例中,我们将使用BlobDemo类将 GIF 图像和 PDF 文件保存到files表的 BLOB 列中。

PHP MySQL BLOB 与图像文件

首先,我们将images/php-mysql-blob.gif文件中的二进制数据插入到files表的 BLOB 列中,如下所示:

$blobObj = new BlobDemo();

// test insert gif image
$blobObj->insertBlob('images/php-mysql-blob.gif',"image/gif");Code language: PHP (php)
php mysql blob gif example

然后,我们可以选择 BLOB 数据并将其显示为 GIF 图像:

$a = $blobObj->selectBlob(1);
header("Content-Type:" . $a['mime']);
echo $a['data'];Code language: PHP (php)
php mysql blob render gif image

PHP MySQL BLOB 与 PDF 文件

以下代码将pdf/php-mysql-blob.pdf PDF 文件的内容插入到 BLOB 列中:

$blobObj = new BlobDemo();

// test insert pdf
$blobObj->insertBlob('pdf/php-mysql-blob.pdf',"application/pdf");Code language: PHP (php)
php mysql blob pdf example

然后,我们可以选择 PDF 数据并在 Web 浏览器中呈现它,如下所示:

$a = $blobObj->selectBlob(2);
header("Content-Type:" . $a['mime']);
echo $a['data'];Code language: PHP (php)
php mysql blob render PDF

要将 PDF 文件替换为 GIF 图像文件,请使用updateBlob()方法,如下所示:

$blobObj->updateBlob(2, 'images/php-mysql-blob.gif', "image/gif");

$a = $blobObj->selectBlob(2);
header("Content-Type:" . $a['mime']);
echo $a['data'];Code language: PHP (php)

您可以通过以下链接下载本教程的源代码:

下载 PHP MySQL BLOB 源代码

在本教程中,我们向您展示了如何管理 MySQL BLOB 数据,包括插入、更新和查询 Blob。

本教程有帮助吗?