Tutorial

Como Usar o Tipo de Dados MySQL BLOB para Armazenar Imagens com PHP no Ubuntu 18.04

MySQLPHPUbuntu 18.04Databases

O autor selecionou Girls Who Code para receber uma doação como parte do programa Write for DOnations.

Introdução

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.

Pré-requisitos

Para seguir com este guia, você precisará do seguinte:

Passo 1 — Criando um Banco de Dados

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:

Output
Query 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:

Output
Query 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:

Output
Query 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:

Output
Query 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á:

Output
Database 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:

Output
Query OK, 0 rows affected (0.03 sec)

Saia do seu servidor MySQL:

  • QUIT;

Você receberá a seguinte saída:

Output
Bye

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:

/var/www/html/config.php
<?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

/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.

Uma mensagem mostrando que os registros foram inseridos com sucesso 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.

Passo 3 — Exibindo Informações de Produtos do Banco de Dados MySQL

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:

/var/www/html/display_products.php
<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.

List of products from MySQL database

Isso confirma que o script PHP para recuperar imagens do MySQL está funcionando como esperado.

Conclusão

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:

Creative Commons License