Resumo : neste tutorial, você aprenderá como lidar com dados BLOB usando PHP PDO. Mostraremos como inserir, atualizar e selecionar dados BLOB em bancos de dados MySQL.
Às vezes, por motivos de segurança, pode ser necessário armazenar grandes objetos de dados, como imagens, arquivos PDF e vídeos, no banco de dados MySQL.
MySQL fornece o tipo de dados BLOB que pode armazenar uma grande quantidade de dados binários.
BLOB significa objeto binário de grandes dados. O valor máximo de um objeto BLOB é especificado pela memória disponível e pelo tamanho do pacote de comunicação. Você pode alterar o tamanho do pacote de comunicação usando a max_allowed_packet
variável no MySQL e post_max_size
nas configurações do PHP.
Vamos ver como o PHP PDO lida com o tipo BLOB no MySQL.
Primeiro, crie uma nova tabela com o nome files
para praticar.
A files
tabela contém três colunas:
- A
id
coluna é a chave primária , coluna de incremento automático . - A
mime
coluna armazena o tipo MIME do arquivo. - A
data
coluna cujo tipo de dados é o BLOB usado para armazenar o conteúdo do arquivo.
A seguinte instrução CREATE TABLE cria a files
tabela:
CREATE TABLE files (
id INT AUTO_INCREMENT PRIMARY KEY,
mime VARCHAR (255) NOT NULL,
data BLOB NOT NULL
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, defina uma classe chamada BlobDemo
com o seguinte código:
<?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;
}
}
Linguagem de código: PHP ( php )
No __construct()
método, abrimos uma conexão de banco de dados com o banco de dados MySQL e, no __destruct()
método, fechamos a conexão.
Insira dados BLOB no banco de dados
PHP PDO fornece uma maneira conveniente de trabalhar com dados BLOB usando streams e instruções de preparação.
Para inserir o conteúdo de um arquivo em uma coluna BLOB, siga os passos abaixo:
- Primeiro, abra o arquivo para leitura em modo binário.
- Segundo, construa uma instrução INSERT .
- Terceiro, vincule o identificador do arquivo à instrução preparada usando o
bindParam()
método e chame oexecute()
método para executar a consulta.
Veja o seguinte insertBlob()
método:
/**
* 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();
}
Linguagem de código: PHP ( php )
Observe que o PDO::PARAM_LOB
DOP instrui a mapear os dados como um fluxo.
Atualizar uma coluna BLOB existente
Para atualizar uma coluna BLOB, use a mesma técnica descrita na inserção de dados em uma coluna BLOB. Veja o seguinte updateBlob()
método:
/**
* 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();
}
Linguagem de código: PHP ( php )
Consultar dados da coluna BLOB
As etapas a seguir descrevem como selecionar dados de uma coluna BLOB:
- Primeiro, construa uma instrução SELECT .
- Segundo, vincule o parâmetro correspondente usando o
bindColumn()
método doPDOStatement
objeto. - Terceiro, execute a instrução.
Veja o seguinte selectBlob()
método:
/**
* 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);
}
Linguagem de código: PHP ( php )
Exemplos de BLOBs PHP MySQL
Nos exemplos a seguir, usaremos a BlobDemo
classe para salvar uma imagem GIF e um arquivo PDF na coluna BLOB da files
tabela.
PHP MySQL BLOB com arquivos de imagem
Primeiro, inserimos dados binários do images/php-mysql-blob.gif
arquivo na coluna BLOB da files
tabela da seguinte forma:
$blobObj = new BlobDemo();
// test insert gif image
$blobObj->insertBlob('images/php-mysql-blob.gif',"image/gif");
Linguagem de código: PHP ( php )
Então, podemos selecionar os dados BLOB e exibi-los como uma imagem GIF:
$a = $blobObj->selectBlob(1);
header("Content-Type:" . $a['mime']);
echo $a['data'];
Linguagem de código: PHP ( php )
PHP MySQL BLOB com arquivos PDF
O código a seguir insere o conteúdo do pdf/php-mysql-blob.pdf
arquivo PDF na coluna BLOB:
$blobObj = new BlobDemo();
// test insert pdf
$blobObj->insertBlob('pdf/php-mysql-blob.pdf',"application/pdf");
Linguagem de código: PHP ( php )
Em seguida, podemos selecionar os dados do PDF e renderizá-los no navegador da seguinte forma:
$a = $blobObj->selectBlob(2);
header("Content-Type:" . $a['mime']);
echo $a['data'];
Linguagem de código: PHP ( php )
Para substituir o arquivo PDF pelo arquivo de imagem GIF, use o updateBlob()
método a seguir:
$blobObj->updateBlob(2, 'images/php-mysql-blob.gif', "image/gif");
$a = $blobObj->selectBlob(2);
header("Content-Type:" . $a['mime']);
echo $a['data'];
Linguagem de código: PHP ( php )
Você pode baixar o código fonte deste tutorial através do seguinte link:
Baixe o código-fonte PHP MySQL BLOB
Neste tutorial, você aprendeu como gerenciar dados BLOB do MySQL, incluindo inserção, atualização e consulta de blob.