Cómo Usar el Tipo de Datos MySQL BLOB para Almacenar Imágenes con PHP en Ubuntu 18.04

El autor seleccionó Chicas Que Codifican para recibir una donación como parte del programa Escribir para Donaciones.

Introducción

Un objeto binario grande (BLOB) es un tipo de datos MySQL que puede almacenar datos binarios como imágenes, archivos multimedia y archivos 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 para empleados, una base de datos para estudiantes o una aplicación financiera), es posible que le resulte conveniente almacenar imágenes como fotos de pasaporte y firmas de estudiantes en una base de datos MySQL junto con otra información relacionada.

Aquí es donde entra en juego el tipo de datos MySQL BLOB. Este enfoque de programación elimina la necesidad de crear un sistema de archivos separado 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. La creación de copias de seguridad también es más fluida, ya que puede crear un único archivo de volcado MySQL que contenga todos sus datos.

La recuperación de datos es más rápida y, al crear registros, puede estar seguro de que se mantienen las reglas de validación de datos y la integridad referencial, especialmente cuando se utilizan transacciones MySQL.

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

Requisitos previos

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

  • Un servidor Ubuntu 18.04 configurado usando la Configuración Inicial del Servidor con Ubuntu 18.04 y un usuario no root con privilegios sudo.
  • Configuración de Apache, MySQL y PHP siguiendo la guía sobre Cómo Instalar la pila Linux, Apache, MySQL, PHP (LAMP) en Ubuntu 18.04. Para este tutorial, no es necesario crear hosts virtuales, por lo que puede omitir el paso 4.

Paso 1-Creación de una base de datos

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

  • sudo mysql -u root -p

Introduzca la contraseña raíz de su base de datos MySQL y pulse ENTER para continuar.

A continuación, ejecute el siguiente comando para crear una base de datos. En este tutorial lo nombraremos test_company:

  • CREATE DATABASE test_company;

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

Output
Query OK, 1 row affected (0.01 sec)

A continuación, cree una cuenta test_user en el servidor MySQL y recuerde reemplazar PASSWORD con una contraseña segura:

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

Verá la siguiente salida:

Output
Query OK, 0 rows affected (0.01 sec)

Para otorgar privilegios completos a test_user en la base de datos test_company, ejecute:

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

Asegúrese de obtener la siguiente salida:

Output
Query OK, 0 rows affected (0.01 sec)

Finalmente, limpie la tabla de privilegios para que MySQL vuelva a cargar los permisos:

  • FLUSH PRIVILEGES;

Asegúrese de ver la siguiente salida:

Output
Query OK, 0 rows affected (0.01 sec)

Ahora que la base de datos test_company y test_user están listas, pasará a crear una tabla products para almacenar productos de muestra. Usará esta tabla más adelante para insertar y recuperar registros y demostrar cómo funciona MySQL BLOB.

Cerrar sesión en el servidor MySQL:

  • QUIT;

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

  • mysql -u test_user -p

Cuando se le solicite, ingrese la contraseña para test_user y presione ENTER para continuar. A continuación, cambie a la base de datos test_company escribiendo lo siguiente:

  • USE test_company;

Una vez seleccionada la base de datos test_company, MySQL se mostrará:

Output
Database changed

A continuación, cree una tabla products ejecutando:

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

Este comando crea una tabla llamada products. La tabla tiene cuatro columnas:

  • product_id: Esta columna utiliza un tipo de datos BIGINT para acomodar una gran lista de productos hasta un máximo de 2 items3-1 artículos. Ha marcado la columna como PRIMARY KEY para identificar productos de forma única. Para que MySQL maneje la generación de nuevos identificadores para las columnas insertadas, ha utilizado la palabra clave AUTO_INCREMENT.

  • product_name: Esta columna contiene los nombres de los productos. Ha utilizado el tipo de datos VARCHAR ya que este campo generalmente manejará alfanuméricos hasta un máximo de 50 caracteres; el límite de 50 es solo un valor hipotético utilizado para el propósito de este tutorial.

  • price: Para fines de demostración, su tabla products contiene la columna price para almacenar el precio de venta de los productos. Dado que algunos productos pueden tener valores flotantes (por ejemplo, 23.69, 45.36, 102.99), ha utilizado el tipo de datos DOUBLE.

  • product_image: Esta columna utiliza un tipo de datos BLOB para almacenar los datos binarios reales de las imágenes de los productos.

Ha utilizado el almacenamiento InnoDB ENGINE para que la tabla admita una amplia gama de funciones, incluidas las 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 sesión en su servidor MySQL:

  • QUIT;

Obtendrá la siguiente salida

Output
Bye

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

Paso 2-Creación de scripts PHP para Conectar y rellenar la Base de datos

En este paso, creará un script PHP que se conectará a la base de datos MySQL que creó en el Paso 1. El script preparará tres productos de muestra 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
<?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);

Guarde y cierre el archivo.

En este archivo, ha utilizado cuatro constantes PHP para conectarse a la base de datos MySQL que creó en Step 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 el MySQL PASSWORD de la cuenta test_user.

  • DB_HOST: Representa el servidor donde reside la base de datos. En este caso, está utilizando el servidor localhost.

La siguiente línea en su archivo inicia un Objeto de datos 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);...

Hacia el final del archivo, ha establecido un par de atributos PDO:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: Este atributo indica a PDO que lance una excepción que se pueda registrar con fines de depuración.
  • ATTR_EMULATE_PREPARES, false: Esta opción aumenta la seguridad al decirle al motor de base de datos MySQL que haga la preparación en lugar de la DOP.

Incluirá el archivo /var/www/html/config.php en dos scripts PHP que creará a continuación para insertar y recuperar registros respectivamente.

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

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

A continuación, agregue la siguiente información al archivo /var/www/html/insert_products.php:

/var/www/html/insert_products.php
<?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";

Guarde y cierre el archivo.

En el archivo, ha incluido 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.

A continuación, ha creado una matriz de los datos de los productos para insertarlos en la base de datos. Aparte de product_name y price, que se preparan como cadenas y valores numéricos respectivamente, el script utiliza la función file_get_contents incorporada de PHP para leer imágenes de una fuente externa y pasarlas como cadenas a la columna product_image.

A continuación, ha preparado una instrucción SQL y ha utilizado la instrucción PHP foreach{...} para insertar cada producto en la base de datos.

Para ejecutar el archivo /var/www/html/insert_products.php, ejecútelo 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 se insertaron registros en la base de datos.

 Un mensaje de éxito que muestra que los registros se insertaron en la base de datos

Ha insertado correctamente tres registros que contienen imágenes de productos en la tabla products. En el siguiente paso, creará un script PHP para recuperar 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 y las imágenes de los productos en la base de datos, ahora va a codificar otro script 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

A continuación, introduzca 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 . '</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>

Guarde los cambios en el archivo y ciérrelo.

Aquí ha incluido de nuevo el archivo config.php para conectarse a la base de datos. A continuación, ha preparado y ejecutado una instrucción SQL utilizando PDO para recuperar todos los elementos de la tabla products utilizando el comando SELECT * FROM products.

A continuación, ha creado una tabla HTML y la ha rellenado 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 una matriz multidimensional, que luego se muestra en una columna de tabla HTML utilizando la sintaxis $row.

Las imágenes de la columna product_image están encerradas dentro de las etiquetas <img src = "">. Ha utilizado los atributos width y height para cambiar el tamaño de las imágenes a un tamaño más pequeño que pueda caber en la columna de tabla HTML.

Para volver a convertir los datos del tipo de datos BLOB en imágenes, ha utilizado la función PHP base64_encode incorporada y la siguiente sintaxis para el esquema URI de datos:

data:media_type;base64, base_64_encoded_data

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

A continuación, 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 asociadas.

 Lista de productos de la base de datos MySQL

Esto confirma que el script PHP para recuperar imágenes de MySQL funciona como se esperaba.

Conclusión

En esta guía, utilizó el tipo de datos MySQL BLOB para almacenar y mostrar imágenes con PHP en Ubuntu 18.04. También ha visto las ventajas básicas de almacenar imágenes en una base de datos en lugar de almacenarlas en un sistema de archivos. Estos incluyen portabilidad, seguridad y facilidad de copia de seguridad. Si está creando una aplicación, como un portal de estudiantes o una base de datos de empleados, que requiere que la información y las imágenes relacionadas se almacenen juntas, esta tecnología puede ser de gran utilidad para usted.

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

  • Cómo Implementar la Paginación en MySQL con PHP en Ubuntu 18.04
  • Cómo Usar la extensión PDO PHP para Realizar Transacciones MySQL en PHP en Ubuntu 18.04

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada.