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

El autor seleccionó a Girls Who Code para recibir una donación como parte del programa Write for DOnations.
Introducción
Un objeto binario grande ( BLOB
) es un tipo de datos MySQL que puede almacenar datos binarios como imágenes, archivos multimedia y PDF.
Al crear aplicaciones que requieren una base de datos estrechamente acoplada donde las imágenes deben estar sincronizadas con datos relacionados (por ejemplo, un portal de empleados, una base de datos de estudiantes o una aplicación financiera), puede resultar conveniente almacenar imágenes como fotos de pasaportes 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 independiente para almacenar imágenes. El esquema también centraliza la base de datos, lo que la hace 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 sencilla, 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 BLOB
tipo de datos MySQL para almacenar imágenes con PHP en Ubuntu 18.04.
Prerrequisitos
Para seguir esta guía, necesitará lo siguiente:
- Un servidor Ubuntu 18.04 configurado utilizando la configuración inicial del servidor con Ubuntu 18.04 y un usuario no root con
sudo
privilegios. - Configuración de Apache, MySQL y PHP siguiendo la guía sobre Cómo instalar la pila Linux, Apache, MySQL y 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 muestra para su proyecto. Para ello, acceda a su servidor mediante SSH y ejecute el siguiente comando para iniciar sesión en su servidor MySQL como raíz:
- sudo mysql -u root -p
Ingrese la contraseña root de su base de datos MySQL y presione ENTER
continuar.
A continuación, ejecute el siguiente comando para crear una base de datos. En este tutorial, le pondremos el nombre test_company
:
- CREATE DATABASE test_company;
Una vez creada la base de datos, verá el siguiente resultado:
OutputQuery OK, 1 row affected (0.01 sec)
A continuación, cree una test_user
cuenta en el servidor MySQL y recuerde reemplazarla PASSWORD
por una contraseña segura:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Verás el siguiente resultado:
OutputQuery OK, 0 rows affected (0.01 sec)
Para otorgar test_user
privilegios completos sobre la test_company
base de datos, ejecute:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
Asegúrese de obtener el siguiente resultado:
OutputQuery OK, 0 rows affected (0.01 sec)
Por último, vacíe la tabla de privilegios para que MySQL vuelva a cargar los permisos:
- FLUSH PRIVILEGES;
Asegúrese de ver el siguiente resultado:
OutputQuery OK, 0 rows affected (0.01 sec)
Ahora que la test_company
base de datos y los datos test_user
están listos, pasará a crear una products
tabla para almacenar productos de muestra. Utilizará esta tabla más adelante para insertar y recuperar registros para demostrar cómo BLOB
funciona MySQL.
Cerrar sesión en el servidor MySQL:
- QUIT;
Luego, vuelve a iniciar sesión con las credenciales que test_user
creaste:
- mysql -u test_user -p
Cuando se le solicite, ingrese la contraseña test_user
y presione ENTER
para continuar. Luego, cambie a la test_company
base de datos escribiendo lo siguiente:
- USE test_company;
Una vez seleccionada la test_company
base de datos, MySQL mostrará:
OutputDatabase changed
A continuación, cree una products
tabla 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 denominada products
. La tabla tiene cuatro columnas:
-
product_id
:Esta columna utiliza unBIGINT
tipo de datos para alojar una gran lista de productos hasta un máximo de 2⁶³-1 artículos. Ha marcado la columna paraPRIMARY KEY
identificar productos de forma única. Para que MySQL pueda gestionar la generación de nuevos identificadores para las columnas insertadas, ha utilizado la palabra claveAUTO_INCREMENT
. -
product_name
:Esta columna contiene los nombres de los productos. Ha utilizado elVARCHAR
tipo de datos porque este campo generalmente admite caracteres alfanuméricos hasta un máximo de50
caracteres; el límite50
es solo un valor hipotético que se utiliza a los efectos de este tutorial. -
price
:Para fines de demostración, suproducts
tabla contiene laprice
columna para almacenar el precio minorista de los productos. Dado que algunos productos pueden tener valores flotantes (por ejemplo, 23,69, 45,36, 102,99), ha utilizado elDOUBLE
tipo de datos. -
product_image
:Esta columna utiliza unBLOB
tipo de datos para almacenar los datos binarios reales de las imágenes de los productos.
Ha utilizado el InnoDB
almacenamiento ENGINE
de la tabla para admitir una amplia gama de funciones, incluidas las transacciones MySQL. Después de ejecutar esto para crear la products
tabla, verá el siguiente resultado:
OutputQuery OK, 0 rows affected (0.03 sec)
Cierre sesión en su servidor MySQL:
- QUIT;
Obtendrás el siguiente resultado
OutputBye
La products
tabla ahora está lista para almacenar algunos registros, incluidas las imágenes de los productos, y la completarás con algunos productos en el siguiente paso.
Paso 2: Creación de scripts PHP para conectar y completar 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 products
tabla.
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 reemplácela PASSWORD
con la test_user
contraseña 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 el Paso 1:
-
DB_NAME
:Esta constante contiene el nombre de latest_company
base de datos. -
DB_USER
:Esta variable contiene eltest_user
nombre de usuario. -
DB_PASSWORD
:Esta constante almacena el MySQLPASSWORD
de latest_user
cuenta. -
DB_HOST
: Representa el servidor donde reside la base de datos. En este caso, estás utilizando ellocalhost
servidor.
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, has establecido un par de atributos PDO:
ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
:Este atributo le indica a PDO que lance una excepción que se puede registrar con fines de depuración.ATTR_EMULATE_PREPARES, false
:Esta opción aumenta la seguridad al indicarle al motor de base de datos MySQL que realice la preparación en lugar de PDO.
Incluirás el /var/www/html/config.php
archivo en dos scripts PHP que crearás a continuación para insertar y recuperar registros respectivamente.
Primero, cree el /var/www/html/insert_products.php
script PHP para insertar registros en la tabla de productos:
- sudo nano /var/www/html/insert_products.php
Luego, agregue la siguiente información al /var/www/html/insert_products.php
archivo:
/var/www/html/insert_products.php
?phprequire_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, has incluido el config.php
archivo que se encuentra en la parte superior. Este es el primer archivo que creaste para definir las variables de la base de datos y conectarte a ella. El archivo también inicia un objeto PDO y lo almacena en una $pdo
variable.
A continuación, ha creado una matriz de datos de los productos que se insertarán en la base de datos. Además de product_name
y price
, que se preparan como cadenas y valores numéricos respectivamente, el script utiliza la función incorporada de PHP file_get_contents
para leer imágenes de una fuente externa y pasarlas como cadenas a la product_image
columna.
A continuación, ha preparado una declaración SQL y ha utilizado la foreach{...}
declaración PHP para insertar cada producto en la base de datos.
Para ejecutar el /var/www/html/insert_products.php
archivo, ejecútelo en la ventana de su navegador utilizando la siguiente URL. Recuerde reemplazarla 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.
Ha insertado correctamente tres registros que contienen imágenes de productos en la products
tabla. En el siguiente paso, creará un script PHP para recuperar estos registros y mostrarlos en su navegador.
Paso 3: Visualización de la información de los productos desde la base de datos MySQL
Con la información y las imágenes de los productos en la base de datos, ahora vas a codificar otro script PHP que consulta y muestra la información de los productos en una tabla HTML en tu 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 titleUsing 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' captionProducts Database/caption tr thProduct Id/th thProduct Name/th thPrice/th thProduct 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 en el archivo y ciérrelo.
Aquí ha incluido nuevamente el config.php
archivo para conectarse a la base de datos. Luego, ha preparado y ejecutado una declaración SQL utilizando PDO para recuperar todos los elementos de la products
tabla utilizando el SELECT * FROM products
comando.
A continuación, ha creado una tabla HTML y la ha rellenado con los datos de los productos mediante la while() {...}
declaración PHP. La línea $row = $stmt-fetch(PDO::FETCH_ASSOC)
consulta la base de datos y almacena el resultado en la $row
variable como una matriz multidimensional, que luego ha mostrado en una columna de la tabla HTML mediante la $row['column_name']
sintaxis.
Las imágenes de la product_image
columna están dentro de las img src = ""
etiquetas. Has 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 la tabla HTML.
Para convertir los datos almacenados por el BLOB
tipo de datos nuevamente en imágenes, ha utilizado la función PHP incorporada base64_encode
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 Base64
cadena codificada de la product_image
columna es base_64_encoded_data
.
A continuación, ejecute el display_products.php
archivo en un navegador web escribiendo la siguiente dirección:
http://your-server-IP/display_products.php
Después de ejecutar el display_products.php
archivo en su navegador, verá una tabla HTML con una lista de productos e imágenes asociadas.
Esto confirma que el script PHP para recuperar imágenes de MySQL está funcionando como se esperaba.
Conclusión
En esta guía, ha utilizado el BLOB
tipo de datos MySQL 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. Estas incluyen portabilidad, seguridad y facilidad de copia de seguridad. Si está creando una aplicación, como un portal para estudiantes o una base de datos para empleados, que requiere que la información y las imágenes relacionadas se almacenen juntas, esta tecnología puede resultarle de gran utilidad.
Para obtener más información sobre los tipos de datos admitidos en MySQL, consulte la guía Tipos de datos de MySQL. Si está interesado en obtener más contenido relacionado con MySQL y PHP, consulte los siguientes tutoriales:
- Cómo implementar paginación en MySQL con PHP en Ubuntu 18.04
- Cómo utilizar la extensión PHP PDO para realizar transacciones MySQL en PHP en Ubuntu 18.04
Deja una respuesta