O autor selecionou as Meninas Que Código para receber uma doação como parte da Gravação para o programa de Doações.
introdução
um objeto binário grande (BLOB
) é um tipo de dados MySQL que pode armazenar dados binários, como imagens, multimídia e arquivos PDF.
ao criar aplicativos que exigem um banco de dados fortemente acoplado onde as imagens devem estar em sincronia com dados relacionados (por exemplo, um portal de funcionários, um banco de dados de alunos ou um aplicativo financeiro), você pode achar conveniente armazenar imagens como fotos e assinaturas de passaporte de alunos em um banco de dados MySQL junto com outras informações relacionadas.
é aqui que entra o tipo de dados MySQL BLOB
. Essa 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 são isolados do sistema de arquivos. Criar backups também é mais simples, pois você pode criar um único arquivo de despejo MySQL que contém todos os seus dados.
recuperar dados é mais rápido e, ao criar registros, você pode ter certeza de que as regras de validação de dados e a integridade referencial são mantidas especialmente ao usar transações MySQL.
neste tutorial, você usará o tipo de dados MySQL BLOB
para armazenar imagens com PHP no Ubuntu 18.04.
pré-requisitos
para acompanhar este guia, você precisará do seguinte:
- um servidor Ubuntu 18.04 configurado usando a configuração inicial do servidor com Ubuntu 18.04 e um usuário não root com privilégios
sudo
. - Apache, MySQL e PHP configurados seguindo o guia sobre como instalar a pilha Linux, Apache, MySQL, PHP (LAMP) no Ubuntu 18.04. Para este tutorial, não é necessário criar hosts virtuais, para que você possa pular a Etapa 4.
Passo 1-Criando um banco de dados
você começará criando um banco de dados de amostra para o seu projeto. Para fazer isso, faça SSH no seu servidor e execute o seguinte comando para fazer login no seu servidor MySQL como root:
- sudo mysql -u root -p
Digite a senha raiz 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 vamos nomeá-lo test_company
:
- CREATE DATABASE test_company;
uma Vez que o banco de dados é criado, você verá a seguinte saída:
OutputQuery OK, 1 row affected (0.01 sec)
em seguida, crie uma test_user
conta no servidor MySQL e lembre-se de substituir PASSWORD
com uma senha forte:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Você verá a seguinte saída:
OutputQuery OK, 0 rows affected (0.01 sec)
Para conceder test_user
cheio de privilégios no test_company
banco de dados, executar:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
certifique-se de que você obter o seguinte resultado:
OutputQuery OK, 0 rows affected (0.01 sec)
por fim, lave os privilégios de tabela para o MySQL para recarregar as permissões:
- FLUSH PRIVILEGES;
Garantir que você verá a seguinte saída:
OutputQuery OK, 0 rows affected (0.01 sec)
Agora que o e test_user
estiver pronto, você vai passar para a criação de um products
tabela para armazenar amostras de produtos. Você usará esta tabela mais tarde para inserir e recuperar registros para demonstrar como o MySQL BLOB
funciona.
sair 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 pressione ENTER
para continuar. De seguida, alternar para o test_company
banco de dados, digitando o seguinte:
- USE test_company;
uma Vez que o test_company
banco de dados é selecionada, o MySQL irá exibir:
OutputDatabase changed
em seguida, crie uma products
tabela 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 chamada products
. A tabela tem quatro colunas:
-
product_id
: Esta coluna usa um tipo de dadosBIGINT
para acomodar uma grande lista de produtos até um máximo de 2 items3-1 itens. Você marcou a coluna comoPRIMARY KEY
para identificar produtos exclusivamente. Para que o MySQL manipule a geração de novos identificadores para colunas inseridas, você usou a palavra-chaveAUTO_INCREMENT
. -
product_name
: esta coluna contém os nomes dos produtos. Você usou o tipo de dadosVARCHAR
, pois esse campo geralmente lida com caracteres alfanuméricos até um máximo de50
—o limite de50
é apenas um valor hipotético usado para o propósito deste tutorial. -
price
: para fins de demonstração, sua tabelaproducts
contém a colunaprice
para armazenar o preço de varejo dos produtos. Como alguns produtos podem ter valores flutuantes (por exemplo, 23.69, 45.36, 102.99), você usou o tipo de dadosDOUBLE
. -
product_image
: esta coluna usa um tipo de dadosBLOB
para armazenar os dados binários reais das imagens dos produtos.
você usou o armazenamento InnoDB
ENGINE
para a tabela para suportar uma ampla gama de recursos, incluindo transações MySQL. Depois de executar este procedimento para criar o products
tabela, você verá a seguinte saída:
OutputQuery OK, 0 rows affected (0.03 sec)
Registo de saída a partir do seu MySQL server:
- QUIT;
Você vai obter o seguinte resultado
OutputBye
O products
tabela agora está pronto para armazenar alguns registros, incluindo produtos de imagens e você poderá preenchê-lo com alguns produtos na próxima etapa.
Etapa 2-criando Scripts PHP para conectar e preencher o banco de dados
nesta etapa, você criará um script PHP que se conectará ao banco de dados MySQL que você criou na Etapa 1. O script preparará três produtos de amostra e os inserirá na tabela products
.
Para criar o código PHP, abra um novo arquivo com o seu editor de texto:
- sudo nano /var/www/html/config.php
em Seguida, introduza as seguintes informações para o arquivo e substitua PASSWORD
com o test_user
senha que você criou na Etapa 1:
<?phpdefine('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 na Etapa 1:
-
DB_NAME
: essa constante contém o nome do banco de dadostest_company
. -
DB_USER
: esta variável contém o nome de usuáriotest_user
. -
DB_PASSWORD
: esta constante armazena o MySQLPASSWORD
da contatest_user
. -
DB_HOST
: isso representa o servidor onde o banco de dados reside. Nesse caso, você está usando o servidorlocalhost
.
a linha a seguir em seu arquivo inicia um objeto de dados PHP (PDO) e se conecta ao banco de dados MySQL:
...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...
no 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 registrada para fins de depuração. -
ATTR_EMULATE_PREPARES, false
: essa opção aumenta a segurança dizendo ao mecanismo de banco de dados MySQL para fazer o prepare em vez 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 /var/www/html/insert_products.php
script PHP para inserir registros para a tabela produtos:
- sudo nano /var/www/html/insert_products.php
em Seguida, adicione as seguintes informações em /var/www/html/insert_products.php
arquivo:
<?phprequire_once 'config.php';$products = ;$products = ;$products = ;$products = ;$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
na parte superior. Este é o primeiro arquivo que você criou para definir as variáveis do 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 a serem inseridos no banco de dados. Além dos product_name
e price
, que são preparados como strings e valores numéricos, respectivamente, o script usa a função file_get_contents
embutida do PHP para ler imagens de uma fonte externa e passá-las 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 navegador usando o 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
Depois de executar o arquivo, você verá uma mensagem de sucesso, em seu navegador, confirmando registros foram inseridos no banco de dados.
você inseriu com sucesso três registros contendo imagens de produtos na tabela products
. Na próxima etapa, você criará um script PHP para recuperar esses registros e exibi-los em seu navegador.
Etapa 3 — exibindo as informações dos produtos do banco de dados MySQL
com as informações e imagens dos produtos no banco de dados, agora você vai codificar outro script PHP que consulta e exibe as informações dos produtos em uma tabela HTML em 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 . '</td>'; echo '<td>' . $row . '</td>'; echo '<td>' . $row . '</td>'; echo '<td>' . '<img src = "data:image/png;base64,' . base64_encode($row) . '" 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 PDO para recuperar todos os itens da tabela products
usando o comando SELECT * FROM products
.
em seguida, 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ê exibiu em uma coluna de tabela HTML usando a sintaxe $row
.
as imagens da coluna product_image
estã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 caber na coluna da tabela HTML.
para converter os dados realizada por BLOB
tipo de dados para imagens, você usou a PHP base64_encode
função e a seguinte sintaxe para os Dados de esquema de URI:
data:media_type;base64, base_64_encoded_data
neste caso, a image/png
é o media_type
e o Base64
string codificada a partir do product_image
é a coluna base_64_encoded_data
.
em seguida, executar o display_products.php
arquivo em um navegador da web digitando o seguinte endereço:
http://your-server-IP/display_products.php
Depois de executar o display_products.php
arquivo no 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 conforme o esperado.
conclusão
neste guia, você usou 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, em vez de armazená-las em um sistema de arquivos. Isso inclui portabilidade, segurança e facilidade de backup. Se você está construindo um aplicativo como um portal de alunos ou banco de dados de funcionários que requer informações e imagens relacionadas para serem armazenadas juntas, essa tecnologia pode ser de grande utilidade para você.
para obter mais informações sobre os tipos de dados suportados no MySQL, siga o guia Tipos de dados MySQL. Se você estiver interessado em mais conteúdo relacionado ao MySQL e PHP, confira os seguintes tutoriais:
- Como Implementar a Paginação no MySQL com PHP no Ubuntu 18.04
- Como Usar a Extensão PDO do PHP para Realizar Transações no MySQL PHP no Ubuntu 18.04