O autor selecionou Girls Who Code para receber uma doação como parte do programa Write for DOnations.
Um Binary Large Object (BLOB
) é um tipo de dados MySQL que pode armazenar dados binários como imagens, multimedia e arquivos PDF.
Ao criar aplicações que requerem um banco de dados fortemente acoplado onde imagens devem estar sincronizadas com dados relacionados (por exemplo, um portal de funcionários, um banco de dados de estudantes, ou uma aplicação financeira), você pode achar que é conveniente armazenar imagens como fotos de passaporte e assinaturas de alunos em um banco de dados MySQL, juntamente com outras informações relacionadas.
É aqui que o tipo de dados MySQL BLOB
entra. Esta abordagem de programação elimina a necessidade de criar um sistema de arquivos separado para armazenar imagens. O esquema também centraliza o banco de dados, tornando-o mais portátil e seguro porque os dados estão isolados do sistema de arquivos. A criação de backups também é mais simples, pois você pode criar um único arquivo de dump do MySQL que contém todos os seus dados.
A recuperação de dados é mais rápida e, ao criar registros, você pode garantir que as regras de validação de dados e a integridade referencial sejam mantidas especialmente ao utilizar as transações do MySQL.
Neste tutorial, você usará o tipo de dados MySQL BLOB
para armazenar imagens com PHP no Ubuntu 18.04.
Para seguir com este guia, você precisará do seguinte:
sudo
.Você começará criando um banco de dados de exemplo para seu projeto. Para fazer isso, faça um SSH em seu servidor e, em seguida, execute o seguinte comando para fazer login no seu servidor MySQL como root:
- sudo mysql -u root -p
Digite a senha do root do seu banco de dados MySQL e clique em ENTER
para continuar.
Em seguida, execute o seguinte comando para criar um banco de dados. Neste tutorial, iremos nomeá-lo como test_company
:
- CREATE DATABASE test_company;
Assim que o banco de dados for criado, você verá a seguinte saída:
OutputQuery OK, 1 row affected (0.01 sec)
Em seguida, crie uma conta test_user
no servidor MySQL e lembre-se de substituir PASSWORD
por uma senha forte:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Você verá o seguinte resultado:
OutputQuery OK, 0 rows affected (0.01 sec)
Para conceder ao test_user
privilégios completos no banco de dados test_company
, execute:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
Certifique-se de obter a seguinte saída:
OutputQuery OK, 0 rows affected (0.01 sec)
Finalmente, libere a tabela de privilégios para que o MySQL recarregue as permissões:
- FLUSH PRIVILEGES;
Certifique-se de ver a seguinte saída:
OutputQuery OK, 0 rows affected (0.01 sec)
Agora que o banco de dados test_company
e o test_user
estão prontos, você prosseguirá com a criação de uma tabela products
para armazenar produtos de exemplo. Você usará esta tabela mais tarde para inserir e recuperar registros para demonstrar como o MySQL BLOB
funciona.
Faça log-off do servidor MySQL:
- QUIT;
Em seguida, faça login novamente com as credenciais do test_user
que você criou:
- mysql -u test_user -p
Quando solicitado, digite a senha para o test_user
e tecle ENTER
para continuar. Em seguida, alterne para o banco de dados test_company
digitando o seguinte:
- USE test_company;
Assim que o banco de dados test_company
for selecionado, o MySQL exibirá:
OutputDatabase changed
Em seguida, crie uma tabela products
executando:
- CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;
Este comando cria uma tabela com nome products
. A tabela tem quatro colunas:
product_id
: esta coluna utiliza um tipo de dados BIGINT
para acomodar uma grande lista de produtos até um máximo de 2⁶³-1 items. Você marcou a coluna como PRIMARY KEY
para identificar unicamente os produtos. Para que o MySQL trate da geração de novos identificadores para as colunas inseridas, você usou a palavra-chave AUTO_INCREMENT
.
product_name
: esta coluna contém os nomes dos produtos. Você usou o tipo de dados VARCHAR
já que este campo geralmente irá lidar com alfanuméricos com um máximo de 50
caracteres — o limite de 50
é apenas um valor hipotético usado para o propósito deste tutorial.
price
: para fins de demonstração, sua tabela products
contém a coluna de preço
para armazenar o preço de varejo dos produtos. Como alguns produtos podem ter valores de ponto flutuante (por exemplo, 23.69, 45.36, 102.99), você utilizou o tipo de dados DOUBLE
.
product_image
: esta coluna utiliza um tipo de dados BLOB
para armazenar os dados do binário real das imagens dos produtos.
Você usou o InnoDB
storage ENGINE
para que a tabela suporte uma grande variedade de recursos, incluindo as transações do MySQL. Após executar isso para criar a tabela de products
, você verá a seguinte saída:
OutputQuery OK, 0 rows affected (0.03 sec)
Saia do seu servidor MySQL:
- QUIT;
Você receberá a seguinte saída:
OutputBye
A tabela products
agora está pronta para armazenar alguns registros, incluindo imagens de produtos e você a preencherá com alguns produtos no próximo passo.
Neste passo, você criará um script PHP que se conectará ao banco de dados MySQL que você criou no Passo 1. O script preparará três produtos de exemplo e os inserirá na tabela products
.
Para criar o código PHP, abra um novo arquivo com seu editor de texto:
- sudo nano /var/www/html/config.php
Em seguida, digite as seguintes informações no arquivo e substitua PASSWORD
pela senha do test_user
que você criou no Passo 1:
<?php
define('DB_NAME', 'test_company');
define('DB_USER', 'test_user');
define('DB_PASSWORD', 'PASSWORD');
define('DB_HOST', 'localhost');
$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Salve e feche o arquivo.
Neste arquivo, você usou quatro constantes PHP para se conectar ao banco de dados MySQL que você criou no Passo 1:
DB_NAME
esta constante contém o nome do banco de dados test_company
.
DB_USER
: esta variável contém o nome de usuário test_user
.
DB_PASSWORD
: esta constante armazena a PASSWORD
MySQL da conta do test_user
.
DB_HOST
: isso representa o servidor onde o banco de dados está. Neste caso, você está usando o servidor localhost
.
A seguinte linha em seu arquivo inicia um PHP Data Object (PDO) e se conecta ao banco de dados MySQL:
...
$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
...
Perto do final do arquivo, você definiu alguns atributos PDO:
ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
: este atributo instrui o PDO a lançar uma exceção que pode ser logada para fins de depuração.ATTR_EMULATE_PREPARES, false
: esta opção aumenta a segurança ao informar ao o mecanismo de banco de dados do MySQL para fazer a preparação ao invés do PDO.Você incluirá o arquivo /var/www/html/config.php
em dois scripts PHP que você criará a seguir para inserir e recuperar registros, respectivamente.
Primeiro, crie o script PHP /var/www/html/insert_products.php
para inserir registros na tabela products:
- sudo nano /var/www/html/insert_products.php
Em seguida, adicione as seguintes informações no arquivo /var/www/html/insert_products.php
<?php
require_once 'config.php';
$products = [];
$products[] = [
'product_name' => 'VIRTUAL SERVERS',
'price' => 5,
'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png")
];
$products[] = [
'product_name' => 'MANAGED KUBERNETES',
'price' => 30,
'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png")
];
$products[] = [
'product_name' => 'MySQL DATABASES',
'price' => 15,
'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" )
];
$sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)";
foreach ($products as $product) {
$stmt = $pdo->prepare($sql);
$stmt->execute($product);
}
echo "Records inserted successfully";
Salve e feche o arquivo.
No arquivo, você incluiu o arquivo config.php
no topo. Este é o primeiro arquivo que você criou para definir as variáveis de banco de dados e se conectar ao banco de dados. O arquivo também inicia um objeto PDO e o armazena em uma variável $pdo
.
Em seguida, você criou uma matriz de dados dos produtos para serem inseridos no banco de dados. Além de product_name
e price
, que são preparados como strings e valores numéricos respectivamente, o script utiliza a função integrada do PHP file_get_contents
para ler imagens de uma origem externa e as passar como strings para a coluna product_image
.
Em seguida, você preparou uma instrução SQL e usou a instrução PHP foreach{...}
para inserir cada produto no banco de dados.
Para executar o arquivo /var/www/html/insert_products.php
execute-o na janela do seu navegador usando a seguinte URL. Lembre-se de substituir your-server-IP
pelo endereço IP público do seu servidor:
http://your-server-IP/insert_products.php
Após executar o arquivo, você verá uma mensagem de sucesso em seu navegador, confirmando que os registros foram inseridos no banco de dados.
Você inseriu com sucesso três registros contendo imagens de produtos na tabela products
. No próximo passo, você criará um script PHP para recuperar esses registros e exibi-los no seu navegador.
Com as informações e imagens dos produtos no banco de dados, você agora irá programar outro script PHP que consulta e exibe informações dos produtos em uma tabela HTML no seu navegador.
Para criar o arquivo, digite o seguinte:
- sudo nano /var/www/html/display_products.php
Em seguida, digite as seguintes informações no arquivo:
<html>
<title>Using BLOB and MySQL</title>
<body>
<?php
require_once 'config.php';
$sql = "SELECT * FROM products";
$stmt = $pdo->prepare($sql);
$stmt->execute();
?>
<table border = '1' align = 'center'> <caption>Products Database</caption>
<tr>
<th>Product Id</th>
<th>Product Name</th>
<th>Price</th>
<th>Product Image</th>
</tr>
<?php
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo '<tr>';
echo '<td>' . $row['product_id'] . '</td>';
echo '<td>' . $row['product_name'] . '</td>';
echo '<td>' . $row['price'] . '</td>';
echo '<td>' .
'<img src = "data:image/png;base64,' . base64_encode($row['product_image']) . '" width = "50px" height = "50px"/>'
. '</td>';
echo '</tr>';
}
?>
</table>
</body>
</html>
Salve as alterações no arquivo e feche-o.
Aqui, você incluiu novamente o arquivo config.php
para se conectar ao banco de dados. Em seguida, você preparou e executou uma instrução SQL usando o PDO para recuperar todos os itens da tabela products
usando o comando SELECT * FROM products
Depois, você criou uma tabela HTML e a preencheu com os dados dos produtos usando a instrução PHP while() {...}
. A linha $row = $stmt->fetch(PDO::FETCH_ASSOC)
consulta o banco de dados e armazena o resultado na variável $row
como uma matriz multidimensional, que você então exibiu em uma coluna de tabela HTML usando a sintaxe $row['column_name']
.
As imagens da coluna product_image
são incluídas dentro das tags <img src = "">
. Você usou os atributos width
e height
para redimensionar as imagens para um tamanho menor que pode se encaixar na coluna HTML.
Para converter os dados mantidos pelo tipo de dados BLOB
de volta para imagens, você usou a função PHP integrada base64_encode
e a seguinte sintaxe para o esquema Data URI:
data:media_type;base64, base_64_encoded_data
Neste caso, o image/png
é o media_type
e a string codificada em Base64
da coluna product_image
é o base_64_encoded_data
.
Em seguida, execute o arquivo display_products.php
em um navegador web digitando o seguinte endereço:
http://your-server-IP/display_products.php
Após executar o arquivo display_products.php
em seu navegador, você verá uma tabela HTML com uma lista de produtos e imagens associadas.
Isso confirma que o script PHP para recuperar imagens do MySQL está funcionando como esperado.
Neste guia, você utilizou o tipo de dados MySQL BLOB
para armazenar e exibir imagens com PHP no Ubuntu 18.04. Você também viu as vantagens básicas de armazenar imagens em um banco de dados, ao invés de armazená-las em um sistema de arquivos. Elas incluem a portabilidade, segurança e facilidade de backup. Se você estiver construindo uma aplicação como um portal de estudantes ou o banco de dados de funcionários que exige que informações e imagens relacionadas sejam armazenadas em conjunto, então essa tecnologia pode ser de grande uso para você.
Para obter mais informações sobre os tipos de dados suportados no MySQL, siga o guia MySQL Data Types. Se você estiver interessado em mais conteúdos relacionados ao MySQL e ao PHP, verifique os seguintes tutoriais:
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!