摘要:在本教程中,您将学习如何使用 PHP PDO 处理 BLOB 数据。我们将向您展示如何在 MySQL 数据库中插入、更新和选择 BLOB 数据。
有时,出于安全原因,您可能需要在 MySQL 数据库中存储大型数据对象,例如图像、PDF 文件和视频。
MySQL提供了可以容纳大量数据的BLOB类型。 BLOB 代表二进制大数据对象。 BLOB 对象的最大值由可用内存和通信包大小指定。您可以使用 MySQL 中的max_allowed_packet
变量和 PHP 设置中的post_max_size
来更改通信包大小。
让我们看看 PHP PDO 如何处理 MySQL 中的 BLOB 类型。
首先,我们在示例数据库中创建一个名为files
的新表来进行练习。
files
表包含三列:
以下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)
然后,我们可以选择 BLOB 数据并将其显示为 GIF 图像:
$a = $blobObj->selectBlob(1);
header("Content-Type:" . $a['mime']);
echo $a['data'];
Code language: PHP (php)
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)
然后,我们可以选择 PDF 数据并在 Web 浏览器中呈现它,如下所示:
$a = $blobObj->selectBlob(2);
header("Content-Type:" . $a['mime']);
echo $a['data'];
Code language: PHP (php)
要将 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)
您可以通过以下链接下载本教程的源代码:
在本教程中,我们向您展示了如何管理 MySQL BLOB 数据,包括插入、更新和查询 Blob。