PHP MySQL的BLOB
简介:在本教程中,您将学习如何使用PHP PDO处理BLOB数据。
我们将向您展示如何在MySQL数据库中插入,更新和选择BLOB数据。
有时出于安全原因,您可能需要在MySQL数据库中存储大型数据对象,例如图像,PDF文件和视频。
MySQL提供了可以容纳大量数据的BLOB类型。
BLOB代表二进制大数据对象。
BLOB对象的最大值由可用内存和通信包大小指定。
您可以使用MySQL中的max_allowed_packet变量和PHP设置中的post_max_size来更改通信包的大小。
让我们看看PHP PDO如何处理MySQL中的BLOB类型。
首先,我们在示例数据库中创建一个名为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
);
其次,我们使用以下代码定义一个名为BlobDemo的类:
<?php
/**
* PHP MySQL BLOB Demo
*/
class BobDemo {
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;
}
}
在__construct()方法中,我们打开到MySQL数据库的数据库连接,在__destruct()方法中,我们关闭了连接。
将BLOB数据插入数据库
PHP PDO提供了使用流和prepare语句处理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();
}
请注意,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();
}
从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);
}
PHP MySQL BLOB示例
在以下示例中,我们将使用BlobDemo类将GIF图像和PDF文件保存到files表的BLOB列中。
PHP MySQL BLOB与图像文件
首先,我们将来自images / php-mysql-blob.gif文件的二进制数据插入到文件表的BLOB列中,如下所示:
$blobObj = new BlobDemo();
// test insert gif image
$blobObj->insertBlob('images/php-mysql-blob.gif',"image/gif");
然后,我们可以选择BLOB数据并将其显示为GIF图像:
$a = $blobObj->selectBlob(1);
header("Content-Type:" . $a['mime']);
echo $a['data'];
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");
然后,我们可以选择PDF数据并将其呈现在Web浏览器中,如下所示:
$a = $blobObj->selectBlob(2);
header("Content-Type:" . $a['mime']);
echo $a['data'];
要将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'];
您可以通过以下链接下载本教程的源代码:
下载PHP MySQL BLOB源代码
在本教程中,我们向您展示了如何管理MySQL BLOB数据,包括插入,更新和查询Blob。

