Resumo : neste tutorial, você aprenderá como gerenciar dados BLOB em banco de dados SQLite usando PHP PDO.
BLOB significa um objeto binário grande que é uma coleção de dados binários armazenados como um valor no banco de dados. Ao usar o BLOB, você pode armazenar documentos, imagens e outros arquivos multimídia no banco de dados.
Criaremos uma nova tabela nomeada documents
para fins de demonstração.
CREATE TABLE IF NOT EXISTS documents (
document_id INTEGER PRIMARY KEY,
mime_type TEXT NOT NULL,
doc BLOB
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Escrevendo BLOB na tabela
Para inserir dados BLOB na tabela, siga as seguintes etapas:
- Conecte-se ao banco de dados SQLite criando uma instância da classe PDO.
- Use
fopen()
a função para ler o arquivo. Afopen()
função retorna um ponteiro de arquivo. - Prepare a instrução INSERT para execução chamando o
prepare()
método do objeto PDO. Oprepare()
método retorna uma instância daPDOStatement
classe. - Use o
bindParam()
método doPDOStatement
objeto para vincular um parâmetro a um nome de variável. Para os dados BLOB, você vincula um parâmetro ao ponteiro do arquivo. - Chame o
execute()
método do objeto de instrução PDO.
Por exemplo, o seguinte insertDoc()
método da SQLiteBLOB
classe insere um novo documento na documents
tabela usando as etapas acima:
<?php
namespace App;
/**
* SQLite PHP Blob Demo
*/
class SQLiteBLOB {
/**
* PDO object
* @var \PDO
*/
private $pdo;
/**
* Initialize the object with a specified PDO object
* @param \PDO $pdo
*/
public function __construct($pdo) {
$this->pdo = $pdo;
}
/**
* Insert blob data into the documents table
* @param type $pathToFile
* @return type
*/
public function insertDoc($mimeType, $pathToFile) {
if (!file_exists($pathToFile))
throw new \Exception("File %s not found.");
$sql = "INSERT INTO documents(mime_type,doc) "
. "VALUES(:mime_type,:doc)";
// read data from the file
$fh = fopen($pathToFile, 'rb');
$stmt = $this->pdo->prepare($sql);
$stmt->bindParam(':mime_type', $mimeType);
$stmt->bindParam(':doc', $fh, \PDO::PARAM_LOB);
$stmt->execute();
fclose($fh);
return $this->pdo->lastInsertId();
}
}
Linguagem de código: PHP ( php )
O seguinte script index.php insere dois documentos: 1 arquivo PDF e 1 imagem da assets
pasta na documents
tabela.
<?php
require 'vendor/autoload.php';
use App\SQLiteConnection as SQLiteConnection;
use App\SQLiteBLOB as SQLiteBlob;
$sqlite = new SQLiteBlob((new SQLiteConnection)->connect());
// insert a PDF file into the documents table
$pathToPDFFile = 'assets/sqlite-sample database-diagram.pdf';
$pdfId = $sqlite->insertDoc('application/pdf', $pathToPDFFile);
// insert a PNG file into the documents table
$pathToPNGFile = 'assets/sqlite-tutorial-logo.png';
$pngId = $sqlite->insertDoc('image/png', $pathToPNGFile);
Linguagem de código: PHP ( php )
Executamos este arquivo de script index.php e usamos a seguinte instrução SELECT para verificar a inserção:
SELECT id,
mime_type,
doc
FROM documents;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Lendo BLOB da tabela
Para ler o BLOB do banco de dados, adicionamos um novo método nomeado readDoc()
à SQLiteBLOB
classe da seguinte forma:
/**
* Read document from the documents table
* @param type $documentId
* @return type
*/
public function readDoc($documentId) {
$sql = "SELECT mime_type, doc "
. "FROM documents "
. "WHERE document_id = :document_id";
// initialize the params
$mimeType = null;
$doc = null;
//
$stmt = $this->pdo->prepare($sql);
if ($stmt->execute([":document_id" => $documentId])) {
$stmt->bindColumn(1, $mimeType);
$stmt->bindColumn(2, $doc, \PDO::PARAM_LOB);
return $stmt->fetch(\PDO::FETCH_BOUND) ?
["document_id" => $documentId,
"mime_type" => $mimeType,
"doc" => $doc] : null;
} else {
return null;
}
}
Linguagem de código: PHP ( php )
O document.php
script a seguir obtém o document_id
da string de consulta e chama o readDoc()
método para renderizar o documento.
<?php
require 'vendor/autoload.php';
use App\SQLiteConnection as SQLiteConnection;
use App\SQLiteBLOB as SQLiteBlob;
$pdo = (new SQLiteConnection)->connect();
$sqlite = new SQLiteBlob($pdo);
// get document id from the query string
$documentId = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
// read documet from the database
$doc = $sqlite->readDoc($documentId);
if ($doc != null) {
header("Content-Type:" . $doc['mime_type']);
echo $doc['doc'];
} else {
echo 'Error loading document ' . $documentId;
}
Linguagem de código: PHP ( php )
Por exemplo, a captura de tela a seguir mostra como o script document.php retorna o arquivo PDF no navegador da web:
Para testar o ID do documento 2, altere o valor na string de consulta conforme mostrado na captura de tela abaixo:
Atualizar dados BLOB
O updateDoc()
método a seguir atualiza os dados BLOB na documents
tabela.
/**
* Update document
* @param type $documentId
* @param type $mimeType
* @param type $pathToFile
* @return type
* @throws \Exception
*/
public function updateDoc($documentId, $mimeType, $pathToFile) {
if (!file_exists($pathToFile))
throw new \Exception("File %s not found.");
$fh = fopen($pathToFile, 'rb');
$sql = "UPDATE documents
SET mime_type = :mime_type,
doc = :doc
WHERE document_id = :document_id";
$stmt = $this->conn->prepare($sql);
$stmt->bindParam(':mime_type', $mimeType);
$stmt->bindParam(':data', $fh, \PDO::PARAM_LOB);
$stmt->bindParam(':document_id', $documentId);
fclose($fh);
return $stmt->execute();
}
Linguagem de código: PHP ( php )
Neste tutorial, mostramos como escrever, ler e atualizar dados BLOB no banco de dados SQLite usando PHP PDO.