One place for hosting & domains

      Cómo utilizar el tipo de datos BLOB de MySQL para almacenar imágenes con PHP en Ubuntu 18.04


      El autor seleccionó Girls Who Code para recibir una donación como parte del programa Write for DOnations.

      Introducción

      El tipo de datos de gran objeto binario (BLOB) es un tipo de datos de MySQL que puede almacenar datos binarios como los de archivos de imagen, multimedia y PDF.

      Al crear aplicaciones que requieren una base de datos estrechamente acoplada donde las imágenes deben estar sincronizadas con los datos relacionados (por ejemplo, un portal de empleados, una base de datos de estudiantes o una aplicación financiera), puede resultarle conveniente almacenar imágenes como las de fotos y firmas de pasaportes de estudiantes en una base de datos de MySQL junto con otra información relacionada.

      Aquí es donde entra el tipo de datos BLOB de MySQL. Este enfoque de programación elimina la necesidad de crear un sistema de archivos independiente para almacenar imágenes. El esquema también centraliza la base de datos, haciéndola más portátil y segura porque los datos están aislados del sistema de archivos. Crear copias de seguridad también es más sencillo, ya que que puede crear un solo archivo MySQL dump que contenga todos sus datos.

      La recuperación de datos es más rápida y, al crear registros, podrá estar seguro de que las reglas de validación de datos y la integridad referencial se preserven, en especial al utilizar transacciones en MySQL.

      En este tutorial, utilizará el tipo de datos BLOB de MySQL para almacenar imágenes con PHP en Ubuntu 18.04.

      Requisitos previos

      Para completar esta guía, necesitará lo siguiente:

      Paso 1: Crear una base de datos

      Comenzará creando una base de datos de ejemplo para su proyecto. Para hacer esto, aplique SSH a su servidor y luego ejecute el siguiente comando para iniciar sesión en su servidor MySQL como root:

      Ingrese la contraseña root de su base de datos de MySQL y presione INTRO para continuar.

      Luego, ejecute el siguiente comando para crear una base de datos. En este tutorial, lo llamaremos test_company:

      • CREATE DATABASE test_company;

      Una vez que cree la base de datos, verá el siguiente resultado:

      Output

      Query OK, 1 row affected (0.01 sec)

      Luego, cree una cuenta test_user en el servidor de MySQL y recuerde reemplazar PASSWORD por una contraseña segura:

      • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

      Verá el siguiente resultado:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Para otorgar a test_user privilegios completos respecto de la base de datos test_company, ejecute lo siguiente:

      • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

      Asegúrese de obtener el siguiente resultado:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Por último, elimine la tabla de privilegios para que MySQL vuelva a cargar los permisos:

      Asegúrese de ver el siguiente resultado:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Ahora que la base de datos test_company y test_user están listos, continúe creando una tabla products para almacenar productos de ejemplo. Más adelante, utilizará esta tabla para insertar y obtener registros a fin de demostrar cómo funciona BLOB de MySQL.

      Cierre sesión en el servidor de MySQL:

      Luego, vuelva a iniciar sesión con las credenciales de test_user que creó:

      Cuando se le solicite, ingrese la contraseña de test_user y presione ENTER para continuar. Luego, posiciónese en la base de datos test_company escribiendo lo siguiente:

      Una vez que seleccione la base de datos test_company, MySQL mostrará lo siguiente:

      Output

      Database changed

      Luego, cree una tabla products ejecutando lo siguiente:

      • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

      Con este comando se crea una tabla llamada products. La tabla tiene cuatro columnas:

      • product_id: esta columna utiliza un tipo de datos BIGINT para admitir una gran lista de productos hasta un máximo de 2⁶³-1 artículos. Se marca la columna como PRIMARY KEY para identificar productos de manera exclusiva. Para que MySQL administre la generación de nuevos identificadores para columnas insertadas, utilizó la palabra clave AUTO_INCREMENT.

      • product_name: esta columna contiene los nombres de los productos. Se utiliza el tipo de datos VARCHAR, ya que este campo generalmente administra alfanuméricos de hasta un máximo de 50 caracteres; el límite de 50 es solo un valor hipotético utilizado para de este tutorial.

      • price: para fines demostrativos, su tabla products contiene la columna price que permite almacenar el precio minorista de los productos. Dado que algunos productos pueden tener valores flotantes (por ejemplo 23.69, 45.36, 102.99), se utiliza el tipo de datos DOUBLE.

      • product_image: en esta columna se utiliza el tipo de datos BLOB para almacenar los datos binarios reales de las imágenes de los productos.

      Se utiliza el ENGINE de almacenamiento InnoDB para que la tabla admita una amplia gama de funciones, incluso transacciones de MySQL. Después de ejecutar esto para crear la tabla products, verá el siguiente resultado:

      Output

      Query OK, 0 rows affected (0.03 sec)

      Cierre la sesión de su servidor de MySQL:

      Verá el siguiente resultado:

      Output

      Bye

      La tabla products ahora está lista para almacenar algunos registros, incluidas las imágenes de los productos y, en el siguiente paso, la completará con algunos productos.

      Paso 2: Crear secuencias de comandos PHP para conectar y completar la base de datos

      En este paso, creará una secuencia de comandos PHP que se conectará a la base de datos MySQL que creó en el paso 1. La secuencia de comandos preparará tres productos de ejemplo y los insertará en la tabla products.

      Para crear el código PHP, abra un nuevo archivo con su editor de texto:

      • sudo nano /var/www/html/config.php

      Luego, ingrese la siguiente información en el archivo y reemplace PASSWORD por la contraseña test_user que creó en el paso 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);
      
      

      Guarde y cierre el archivo.

      En este archivo, utilizó cuatro constantes PHP para conectarse a la base de datos MySQL que creó en el paso 1:

      • DB_NAME : esta constante contiene el nombre de la base de datos test_company.

      • DB_USER : esta variable contiene el nombre de usuario test_user.

      • DB_PASSWORD : esta constante almacena la PASSWORD de MySQL de la cuenta test_user.

      • DB_HOST: esto representa el servidor en el que se ubica la base de datos. En este caso, utilizará el servidor localhost.

      Con la siguiente línea de su archivo se inicia un objeto de datos de PHP (PDO) y se conecta a la base de datos MySQL:

      ...
      $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
      ...
      

      Cerca del final del archivo, configuró algunos atributos PDO:

      • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: este atributo indica a PDO que inicie una excepción que se puede registrar para depuración.
      • ATTR_EMULATE_PREPARES, false: esta opción aumenta la seguridad al indicar al motor de la base de datos MySQL que realice la preparación en lugar de PDO.

      Incluirá el archivo /var/www/html/config.php en dos secuencias de comandos PHP que creará luego para insertar y recuperar registros respectivamente.

      Primero, cree la secuencia de comandos PHP /var/www/html/insert_products.php para insertar registros en la tabla de productos:

      • sudo nano /var/www/html/insert_products.php

      Luego, añada la siguiente información al archivo /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";
      

      Guarde y cierre el archivo.

      En el archivo, incluyó el archivo config.php en la parte superior. Este es el primer archivo que creó para definir las variables de la base de datos y conectarse a la base de datos. El archivo también inicia un objeto PDO y lo almacena en una variable $pdo.

      Luego, creó una matriz de datos de los productos que se insertarán en la base de datos. Aparte de product_name y price, que se preparan como cadenas y valores numéricos respectivamente, la secuencia de comandos utiliza la función file_get_contents integrada de PHP para leer imágenes de una fuente externa y pasarlas como cadenas a la columna product_image.

      Luego, preparó una instrucción SQL y utilizó la instrucción foreach{...} de PHP para insertar cada producto en la base de datos.

      Para ejecutar el archivo /var/www/html/insert_products.php, realice la ejecución en la ventana de su navegador utilizando la siguiente URL. Recuerde reemplazar your-server-IP por la dirección IP pública de su servidor:

      http://your-server-IP/insert_products.php
      

      Después de ejecutar el archivo, verá un mensaje de éxito en su navegador confirmando que los registros se insertaron en la base de datos.

      Mensaje de éxito que indica que los registros se insertaron en la base de datos

      Insertó con éxito tres registros que contienen imágenes de productos en la tabla products. En el siguiente paso, creará una secuencia de comandos PHP para obtener estos registros y mostrarlos en su navegador.

      Paso 3: Mostrar la información de los productos de la base de datos MySQL

      Con la información e imágenes de los productos en la base de datos, ahora debe codificar otra secuencia de comandos PHP que consulta y muestra la información de los productos en una tabla HTML en su navegador.

      Para crear el archivo, escriba lo siguiente:

      • sudo nano /var/www/html/display_products.php

      Luego, ingrese la siguiente información en el archivo:

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

      Guarde los cambios del archivo y ciérrelo.

      Aquí, nuevamente incluyó el archivo config.php para establecer conexión con la base de datos. Luego, preparó y ejecutó una instrucción SQL utilizando PDO para obtener todos los elementos de la tabla products utilizando el comando SELECT * FROM products​​​.

      Luego, creó una tabla HTML y la completó con los datos de los productos utilizando la instrucción PHP while() {...}​​​. La línea $row = $stmt->fetch(PDO::FETCH_ASSOC)​​​ consulta la base de datos y almacena el resultado en la variable $row como matriz multidimensional, que luego se mostró en una columna de la tabla HTML utilizando la sintaxis $row['column_name']​​​.

      Las imágenes de la columna product_image se incluyen en el interior de las etiquetas <img src = "">. Se utilizan los atributos width y height para cambiar el tamaño de las imágenes por uno más pequeño que pueda caber en la columna de la tabla HTML.

      Para convertir los datos contenidos en el tipo de datos BLOB de vuelta en imágenes, se utilizan la función base64_encode de PHP integrada y la siguiente sintaxis para el esquema URI de datos:

      data:media_type;base64, base_64_encoded_data
      

      En este caso, imagen/png es media_type y la cadena codificada Base64 de la columna product_image es base_64_encoded_data.

      Luego, ejecute el archivo display_products.php en un navegador web escribiendo la siguiente dirección:

      http://your-server-IP/display_products.php
      

      Después de ejecutar el archivo display_products.php en su navegador, verá una tabla HTML con una lista de productos e imágenes asociados.

      Lista de productos de la base de datos MySQL

      Esto confirma que la secuencia de comandos de PHP para obtener imágenes de MySQL funciona según lo previsto.

      Conclusión

      A través de esta guía, utilizó el tipo de datos BLOB de MySQL para almacenar y mostrar imágenes con PHP en Ubuntu 18.04. También vio las ventajas básicas de almacenar imágenes en una base de datos respecto de hacerlo en un sistema de archivos. Entre ellas, se incluyen la portabilidad, la seguridad y la facilidad de respaldo. Si compila una aplicación, como un portal de estudiantes o una base de datos de empleados para los cuales se deban almacenar juntas la información y las imágenes relacionadas, esta tecnología puede resultarle muy útil.

      Para obtener más información sobre los tipos de datos compatibles en MySQL, consulte la guía de tipos de datos de MySQL. Si está interesado en más contenido relacionado con MySQL y PHP, consulte los siguientes tutoriales:



      Source link

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


      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:

      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:

      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:

      Em seguida, faça login novamente com as credenciais do test_user que você criou:

      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:

      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:

      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:



      Source link

      Como usar a extensão PHP PDO para realizar transações do MySQL em PHP no Ubuntu 18.04


      O autor selecionou a Open Sourcing Mental Illness para receber uma doação como parte do programa Write for DOnations.

      Introdução

      Uma transação de MySQL consiste em um grupo de comandos em SQL relacionados de maneira lógica e que são executados no banco de dados como uma única unidade. As transações são usadas para aplicar a conformidade com as propriedades ACID (Atomicidade, Consistência, Isolamento e Durabilidade) em um aplicativo. Este é um conjunto de padrões que regem a confiabilidade das operações de processamento em um banco de dados.

      A atomicidade assegura o êxito de transações relacionadas ou um fracasso completo se ocorrer um erro. A consistência garante a validade dos dados enviados ao banco de dados, de acordo com a lógica de negócios definida. O isolamento consiste na execução correta de transações concomitantes, garantindo que os efeitos de diferentes clientes conectados a um banco de dados não afetem uns aos outros. A durabilidade garante que transações logicamente relacionadas permaneçam no banco de dados permanentemente.

      As instruções de SQL emitidas através de uma transação devem ser bem-sucedidas ou falhar completamente. Se alguma das consultas falhar, o MySQL reverte as alterações e elas nunca são confirmadas no banco de dados.

      Um bom exemplo para entender como as transações do MySQL funcionam é um site de e-commerce. Quando um cliente realiza um pedido, o aplicativo insere registros em várias tabelas, como: orders (pedidos) e orders_products (produtos do pedido), dependendo da lógica de negócios. Os registros de múltiplas tabelas relacionadas a um único pedido precisam ser enviados atomicamente ao banco de dados como uma única unidade lógica.

      Outro caso de uso está em um aplicativo bancário. Quando um cliente estiver transferindo dinheiro, algumas transações são enviadas ao banco de dados. A conta do remetente é debitada e a conta do destinatário é creditada. As duas transações devem ser confirmadas simultaneamente. Se uma delas falhar, o banco de dados retornará ao seu estado original e nenhuma alteração deve ser salva no disco.

      Neste tutorial, você usará a extensão PDO do PHP. Ela oferece uma interface para trabalhar com bancos de dados em PHP, possibilitando a realização de transações do MySQL em um servidor Ubuntu 18.04.

      Pré-requisitos

      Antes de começar, você precisará do seguinte:

      Passo 1 — Criando um banco de dados amostrais e tabelas

      Antes de começar a trabalhar com transações do MySQL, primeiro você criará um banco de dados amostrais e adicionará algumas tabelas. Primeiro, faça login no seu servidor do MySQL como root:

      Quando solicitado, digite sua senha de user root do MySQL e clique em ENTER para continuar. Em seguida, crie um banco de dados. Para os fins deste tutorial, chamaremos o banco de dados de sample_store:

      • CREATE DATABASE sample_store;

      Você verá o seguinte resultado:

      Output

      Query OK, 1 row affected (0.00 sec)

      Crie um usuário chamado sample_user para o seu banco de dados. Lembre-se de substituir a PASSWORD por um valor forte:

      • CREATE USER 'sample_user'@'localhost' IDENTIFIED BY 'PASSWORD';

      Emita privilégios completos para o seu usuário no banco de dados sample_store:

      • GRANT ALL PRIVILEGES ON sample_store.* TO 'sample_user'@'localhost';

      Por fim, recarregue os privilégios do MySQL:

      Você verá o seguinte resultado assim que criar seu usuário:

      Output

      Query OK, 0 rows affected (0.01 sec) . . .

      Com o banco de dados e o usuário configurados, agora você pode criar várias tabelas para demonstrar como as transações do MySQL funcionam.

      Faça log-off do servidor MySQL:

      Assim que o sistema desconectar você, verá o seguinte resultado:

      Output

      Bye.

      Em seguida, faça login com as credenciais do sample_user que você acabou de criar:

      • sudo mysql -u sample_user -p

      Digite a senha para o sample_user e clique em ENTER para continuar.

      Vá para o sample_store, fazendo dele banco de dados selecionado no momento:

      Você verá o seguinte resultado assim que ele for selecionado:

      Output

      Database Changed.

      Em seguida, crie uma tabela de products (produtos):

      • CREATE TABLE products (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE) ENGINE = InnoDB;

      Esse comando cria uma tabela products com um campo chamado product_id. Voce usará um tipo de dados chamado BIGINT que consegue acomodar um valor elevado de até 2^63-1. Esse mesmo campo é usado como uma PRIMARY KEY, de modo a identificar exclusivamente produtos. A palavra-chave AUTO_INCREMENT instrui o MySQL a gerar o próximo valor numérico conforme novos produtos vão sendo adicionados.

      O campo product_name é do tipo VARCHAR, que consegue reter um máximo de 50 letras ou números. Para o price (preço) do produto, usa-se um tipo de dados chamado DOUBLE para suprir os formatos com ponto flutuante, em preços com casas decimais.

      Por fim, usa-se o InnoDB como ENGINE, pois ele suporta com facilidade as transações do MySQL, ao contrário de outros mecanismos de armazenamento, como o MyISAM.

      Assim que criar sua tabela de products, você receberá o seguinte resultado:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Em seguida, adicione alguns itens à tabela de products, executando os comandos a seguir:

      • INSERT INTO products(product_name, price) VALUES ('WINTER COAT','25.50');
      • INSERT INTO products(product_name, price) VALUES ('EMBROIDERED SHIRT','13.90');
      • INSERT INTO products(product_name, price) VALUES ('FASHION SHOES','45.30');
      • INSERT INTO products(product_name, price) VALUES ('PROXIMA TROUSER','39.95');

      Após cada operação de INSERT, você verá um resultado parecido com este:

      Output

      Query OK, 1 row affected (0.02 sec) . . .

      Em seguida, verifique se os dados foram adicionados à tabela de produtos:

      Você verá uma lista dos quatro produtos que você inseriu:

      Output

      +------------+-------------------+-------+ | product_id | product_name | price | +------------+-------------------+-------+ | 1 | WINTER COAT | 25.5 | | 2 | EMBROIDERED SHIRT | 13.9 | | 3 | FASHION SHOES | 45.3 | | 4 | PROXIMA TROUSER | 39.95 | +------------+-------------------+-------+ 4 rows in set (0.01 sec)

      Em seguida, você criará uma tabela de customers (clientes) para reter informações básicas sobre os clientes:

      • CREATE TABLE customers (customer_id BIGINT PRIMARY KEY AUTO_INCREMENT, customer_name VARCHAR(50) ) ENGINE = InnoDB;

      Assim como na tabela de products, você usa o tipo de dados BIGINT para o customer_id. Isso garantirá que a tabela possa suportar muitos clientes, indo até 2^63-1 registros. A palavra-chave AUTO_INCREMENT aumenta o valor das colunas assim que você insere um novo cliente.

      Como a coluna customer_name aceita valores alfanuméricos, usa-se o tipo de dados VARCHAR com um limite de 50 caracteres. Novamente, o ENGINE de armazenamento InnoDB é usado para dar suporte às transações.

      Após executar o comando anterior para criar a tabela customers, você verá o seguinte resultado:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Você adicionará três clientes da amostra à tabela. Execute os seguintes comandos:

      • INSERT INTO customers(customer_name) VALUES ('JOHN DOE');
      • INSERT INTO customers(customer_name) VALUES ('ROE MARY');
      • INSERT INTO customers(customer_name) VALUES ('DOE JANE');

      Assim que os clientes tiverem sido adicionados, você verá um resultado parecido com este:

      Output

      Query OK, 1 row affected (0.02 sec) . . .

      Em seguida, verifique os dados na tabela customers:

      Você verá uma lista dos três clientes:

      Output

      +-------------+---------------+ | customer_id | customer_name | +-------------+---------------+ | 1 | JOHN DOE | | 2 | ROE MARY | | 3 | DOE JANE | +-------------+---------------+ 3 rows in set (0.00 sec)

      Em seguida, você criará uma tabela de orders para registrar os pedidos realizados por diferentes clientes. Para criar a tabela de orders, execute o seguinte comando:

      • CREATE TABLE orders (order_id BIGINT AUTO_INCREMENT PRIMARY KEY, order_date DATETIME, customer_id BIGINT, order_total DOUBLE) ENGINE = InnoDB;

      Você usará a coluna order_id como a PRIMARY KEY. O tipo de dados BIGINT permite que você acomode até 2^63-1 pedidos e aumentará automaticamente o valor após cada inserção de pedido. O campo order_date terá a data e hora de quando o pedido foi realizado. Consequentemente, o tipo de dados DATETIME é usado. O customer_id se relaciona à tabela de customers que você criou anteriormente.

      Você verá o seguinte resultado:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Como um único pedido de um cliente pode conter vários itens, você precisa criar uma tabela de orders_products para reter essas informações.

      Para criar a tabela de orders_products, execute o seguinte comando:

      • CREATE TABLE orders_products (ref_id BIGINT PRIMARY KEY AUTO_INCREMENT, order_id BIGINT, product_id BIGINT, price DOUBLE, quantity BIGINT) ENGINE = InnoDB;

      Você deve usar o ref_id como a PRIMARY KEY e isso aumentará o valor automaticamente após cada inserção de registro. A order_id e a product_id se relacionam às tabelas de orders e products, respectivamente. A coluna de price é do tipo de dados DOUBLE, para que possa acomodar valores com pontos flutuantes.

      O mecanismo de armazenamento InnoDB deve corresponder às outras tabelas criadas anteriormente, uma vez que o pedido de um único cliente afetará várias tabelas que usam simultaneamente as transações.

      Seu resultado confirmará a criação da tabela:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Você não adicionará dados às tabelas de orders e orders_products por enquanto. No entanto, você fará isso mais tarde, usando um script PHP que implementa as transações do MySQL.

      Faça log-off do servidor MySQL:

      Agora, seu esquema de banco de dados está completo e você o preencheu com alguns registros. Em seguida, você criará uma classe PHP para lidar com conexões de banco de dados e transações do MySQL.

      Neste passo, você criará uma classe PHP que usará PDO (Objetos de dados do PHP) para lidar com as transações do MySQL. A classe irá se conectar ao seu banco de dados MySQL e inserirá dados atomicamente ao banco de dados.

      Salve o arquivo de classe no diretório raiz do seu servidor Web Apache. Para fazer isso, crie um arquivo DBTransaction.php, usando seu editor de texto:

      • sudo nano /var/www/html/DBTransaction.php

      Depois, adicione o código a seguir ao arquivo: Substitua a PASSWORD pelo valor que você criou no Passo 1:

      /var/www/html/DBTransaction.php

      <?php
      
      class DBTransaction
      {
          protected $pdo;
          public $last_insert_id;
      
          public function __construct()
          {
              define('DB_NAME', 'sample_store');
              define('DB_USER', 'sample_user');
              define('DB_PASSWORD', 'PASSWORD');
              define('DB_HOST', 'localhost');
      
              $this->pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
              $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
          }
      

      No início da classe DBTransaction, o PDO usará as constantes (DB_HOST, DB_NAME, DB_USER e DB_PASSWORD) para inicializar e se conectar ao banco de dados que você criou no passo 1.

      Nota: como estamos demonstrando aqui transações do MySQL em uma escala pequena, declaramos as variáveis do banco de dados na classe DBTransaction. Em um projeto de produção grande, normalmente, você criaria um arquivo de configuração separado e carregaria as constantes do banco de dados desse arquivo usando uma instrução PHP require_once.

      Em seguida, você deve definir dois atributos para a classe PDO:

      • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: este atributo instruirá o PDO a gerar uma exceção se um erro for encontrado. Tais erros podem ser registrados para depuração.
      • ATTR_EMULATE_PREPARES, false: esta opção desabilita a emulação das instruções preparadas e permite que o próprio mecanismo de banco de dados MySQL prepare as instruções.

      Agora, adicione o seguinte código ao seu arquivo para criar os métodos para a sua classe:

      /var/www/html/DBTransaction.php

      . . .
          public function startTransaction()
          {
              $this->pdo->beginTransaction();
          }
      
          public function insertTransaction($sql, $data)
          {
              $stmt = $this->pdo->prepare($sql);
              $stmt->execute($data);
              $this->last_insert_id = $this->pdo->lastInsertId();
          }
      
          public function submitTransaction()
          {
              try {
                  $this->pdo->commit();
              } catch(PDOException $e) {
                  $this->pdo->rollBack();
                  return false;
              }
      
                return true;
          }
      }
      

      Salve e feche o arquivo, pressionando CTRL + X, Y e, depois, ENTER.

      Para trabalhar com as transações do MySQL, criam-se três métodos principais na classe DBTransaction: startTransaction, insertTransaction e submitTransaction.

      • startTransaction: este método instrui o PDO a iniciar uma transação e desliga a confirmação automática até que um comando de confirmação seja emitido.

      • insertTransaction: este método recebe dois argumentos. A variável $sql mantém a instrução SQL a ser executada, enquanto a variável $data é uma matriz dos dados a serem ligados à instrução SQL, uma vez que você está usando instruções preparadas. Os dados são informados como uma matriz ao método insertTransaction.

      • submitTransaction: este método confirma as alterações no banco de dados permanentemente, emitindo um comando de commit(). No entanto, se houver um erro e as transações tiverem um problema, o método chama o método rollBack() para reverter o banco de dados ao seu estado original, caso uma exceção do PDO seja levantada.

      Sua classe DBTransaction inicializa uma transação, prepara os diferentes comandos SQL a serem executados. Por fim, confirma atomicamente as alterações no banco de dados se não houver problemas. Caso contrário, a transação é revertida. Além disso, a classe permite que você recupere o registro order_id que você acabou de criar, acessando a propriedade pública last_insert_id.

      Agora, a classe DBTransaction está pronta para ser chamada e usada por qualquer código PHP, que você criará a seguir.

      Passo 3 — Criando um script PHP para usar a classe DBTransaction

      Você criará um script PHP que implementará a classe DBTransaction e enviará um grupo de comandos SQL ao banco de dados MySQL. Você imitará o fluxo de trabalho de um pedido de cliente em um carrinho de compras on-line.

      Essas consultas SQL afetarão as orders e as tabelas de orders_products. Sua classe DBTransaction deve permitir alterações no banco de dados apenas se todas as consultas forem executadas sem erros. Caso contrário, você receberá um erro e qualquer tentativa de alteração será revertida.

      Você está criando um único pedido para o cliente JOHN DOE, identificado com o customer_id 1. O pedido do cliente possui três itens diferentes com quantidades diferentes na tabela de products. Seu script PHP recebe os dados do pedido do cliente e os envia à classe DBTransaction.

      Crie o arquivo orders.php:

      • sudo nano /var/www/html/orders.php

      Depois, adicione o código a seguir ao arquivo:

      /var/www/html/orders.php

      <?php
      
      require("DBTransaction.php");
      
      $db_host = "database_host";
      $db_name = "database_name";
      $db_user = "database_user";
      $db_password = "PASSWORD";
      
      $customer_id = 2;
      
      $products[] = [
        'product_id' => 1,
        'price' => 25.50,
        'quantity' => 1
      ];
      
      $products[] = [
        'product_id' => 2,
        'price' => 13.90,
        'quantity' => 3
      ];
      
      $products[] = [
        'product_id' => 3,
        'price' => 45.30,
        'quantity' => 2
      ];
      
      $transaction = new DBTransaction($db_host, $db_user, $db_password, $db_name);
      

      Você criou um script PHP que inicializa uma instância da classe DBTransaction que você criou no Passo 2.

      Nesse script, você inclui o arquivo DBTransaction.php e inicializa a classe DBTransaction. Em seguida, prepare uma matriz multidimensional de todos os produtos que o cliente está pedindo da loja. Você também invocará o método startTransaction() para iniciar uma transação.

      Em seguida, adicione o código a seguir para finalizar seu script orders.php:

      /var/www/html/orders.php

      . . .
      $order_query = "insert into orders (order_id, customer_id, order_date, order_total) values(:order_id, :customer_id, :order_date, :order_total)";
      $product_query = "insert into orders_products (order_id, product_id, price, quantity) values(:order_id, :product_id, :price, :quantity)";
      
      $transaction->insertQuery($order_query, [
        'customer_id' => $customer_id,
        'order_date' => "2020-01-11",
        'order_total' => 157.8
      ]);
      
      $order_id = $transaction->last_insert_id;
      
      foreach ($products as $product) {
        $transaction->insertQuery($product_query, [
          'order_id' => $order_id,
          'product_id' => $product['product_id'],
          'price' => $product['price'],
          'quantity' => $product['quantity']
        ]);
      }
      
      $result = $transaction->submit();
      
      if ($result) {
          echo "Records successfully submitted";
      } else {
          echo "There was an error.";
      }
      
      

      Salve e feche o arquivo, pressionando CTRL + X, Y e, depois, ENTER.

      Prepare o comando a ser inserido na tabela de pedidos através do método insertTransaction. Depois, recupere o valor da propriedade pública last_insert_id da classe DBTransaction e o utilize como $order_id.

      Assim que você tiver um $order_id, utilize o ID único para inserir os itens do pedido do cliente na tabela de orders_products.

      Por fim, você chama o método submitTransaction para confirmar todos os detalhes do pedido do cliente no banco de dados se não houver problemas. Caso contrário, o método submitTransaction reverterá as tentativas de alterações.

      Agora, você executará o script orders.php em seu navegador. Substitua o your-server-IP pelo endereço IP público do seu servidor e execute o seguinte:

      http://your-server-IP/orders.php

      Você verá uma confirmação de que os registros foram enviados com sucesso:

      Resultado em PHP da classe MySQL de transações

      Seu script PHP está funcionando conforme o esperado e o pedido – com os produtos do pedido associados – foram enviados atomicamente ao banco de dados.

      Você executou o arquivo orders.php em uma janela do navegador. O script invocou a classe DBTransaction que, por sua vez, enviou os detalhes de orders ao banco de dados. No próximo passo, você verificará se os registros foram salvos nas tabelas do banco de dados relacionadas.

      Passo 4 — Confirmando as entradas em seu banco de dados

      Neste passo, você verificará se a transação iniciada a partir da janela do navegador para o pedido do cliente foi postada nas tabelas do banco de dados, conforme esperado.

      Para fazer isso, faça login no seu banco de dados MySQL novamente:

      • sudo mysql -u sample_user -p

      Digite a senha para o sample_user e tecle ENTER para continuar.

      Vá para o banco de dados sample_store:

      Antes de prosseguir, certifique-se de que o banco de dados foi alterado, confirmando o resultado a seguir:

      Output

      Database Changed.

      Em seguida, emita o seguinte comando para recuperar os registros da tabela orders:

      Isso exibirá o seguinte resultado, detalhando o pedido do cliente:

      Output

      +----------+---------------------+-------------+-------------+ | order_id | order_date | customer_id | order_total | +----------+---------------------+-------------+-------------+ | 1 | 2020-01-11 00:00:00 | 2 | 157.8 | +----------+---------------------+-------------+-------------+ 1 row in set (0.00 sec)

      Em seguida, recupere os registros da tabela orders_products:

      • SELECT * FROM orders_products;

      Você verá um resultado com uma lista de produtos do pedido do cliente, parecido com o seguinte:

      Output

      +--------+----------+------------+-------+----------+ | ref_id | order_id | product_id | price | quantity | +--------+----------+------------+-------+----------+ | 1 | 1 | 1 | 25.5 | 1 | | 2 | 1 | 2 | 13.9 | 3 | | 3 | 1 | 3 | 45.3 | 2 | +--------+----------+------------+-------+----------+ 3 rows in set (0.00 sec)

      O resultado confirma que a transação foi salva no banco de dados e que sua classe DBTransaction auxiliar está funcionando conforme o esperado.

      Conclusão

      Neste guia, você usou o PDO do PHP para trabalhar com as transações do MySQL. Embora este não seja um artigo conclusivo sobre a criação de um software de e-commerce, trata-se de um exemplo de como usar transações do MySQL em seus aplicativos.

      Para aprender mais sobre o modelo ACID do MySQL, consulte o guia InnoDB e o modelo ACID, no site oficial do MySQL. Acesse nossa página de conteúdo do MySQL para obter mais tutoriais, artigos e Q&A relacionados.



      Source link