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

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Creación de una base de datos
  • Paso 2: Creación de scripts PHP para conectar y completar la base de datos
  • Paso 3: Visualización de la información de los productos desde la base de datos MySQL
  • Conclusión
  • 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 BLOBtipo 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 sudoprivilegios.
    • 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:

    1. sudo mysql -u root -p

    Ingrese la contraseña root de su base de datos MySQL y presione ENTERcontinuar.

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

    1. 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_usercuenta en el servidor MySQL y recuerde reemplazarla PASSWORDpor una contraseña segura:

    1. CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

    Verás el siguiente resultado:

    OutputQuery OK, 0 rows affected (0.01 sec)

    Para otorgar test_userprivilegios completos sobre la test_companybase de datos, ejecute:

    1. 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:

    1. FLUSH PRIVILEGES;

    Asegúrese de ver el siguiente resultado:

    OutputQuery OK, 0 rows affected (0.01 sec)

    Ahora que la test_companybase de datos y los datos test_userestán listos, pasará a crear una productstabla para almacenar productos de muestra. Utilizará esta tabla más adelante para insertar y recuperar registros para demostrar cómo BLOBfunciona MySQL.

    Cerrar sesión en el servidor MySQL:

    1. QUIT;

    Luego, vuelve a iniciar sesión con las credenciales que test_usercreaste:

    1. mysql -u test_user -p

    Cuando se le solicite, ingrese la contraseña test_usery presione ENTERpara continuar. Luego, cambie a la test_companybase de datos escribiendo lo siguiente:

    1. USE test_company;

    Una vez seleccionada la test_companybase de datos, MySQL mostrará:

    OutputDatabase changed

    A continuación, cree una productstabla ejecutando:

    1. 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 un BIGINTtipo de datos para alojar una gran lista de productos hasta un máximo de 2⁶³-1 artículos. Ha marcado la columna para PRIMARY KEYidentificar productos de forma única. Para que MySQL pueda gestionar 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 VARCHARtipo de datos porque este campo generalmente admite caracteres alfanuméricos hasta un máximo de 50caracteres; el límite 50es solo un valor hipotético que se utiliza a los efectos de este tutorial.

    • price:Para fines de demostración, su productstabla contiene la pricecolumna 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 el DOUBLEtipo de datos.

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

    Ha utilizado el InnoDBalmacenamiento ENGINEde la tabla para admitir una amplia gama de funciones, incluidas las transacciones MySQL. Después de ejecutar esto para crear la productstabla, verá el siguiente resultado:

    OutputQuery OK, 0 rows affected (0.03 sec)

    Cierre sesión en su servidor MySQL:

    1. QUIT;

    Obtendrás el siguiente resultado

    OutputBye

    La productstabla 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 productstabla.

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

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

    Luego, ingrese la siguiente información en el archivo y reemplácela PASSWORDcon la test_usercontraseñ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 la test_companybase de datos.

    • DB_USER:Esta variable contiene el test_usernombre de usuario.

    • DB_PASSWORD:Esta constante almacena el MySQL PASSWORDde la test_usercuenta.

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

    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.phparchivo en dos scripts PHP que crearás a continuación para insertar y recuperar registros respectivamente.

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

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

    Luego, agregue la siguiente información al /var/www/html/insert_products.phparchivo:

    /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.phparchivo 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 $pdovariable.

    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_namey price, que se preparan como cadenas y valores numéricos respectivamente, el script utiliza la función incorporada de PHP file_get_contentspara leer imágenes de una fuente externa y pasarlas como cadenas a la product_imagecolumna.

    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.phparchivo, ejecútelo en la ventana de su navegador utilizando la siguiente URL. Recuerde reemplazarla your-server-IPpor 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 productstabla. 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:

    1. 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.phparchivo 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 productstabla utilizando el SELECT * FROM productscomando.

    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 $rowvariable 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_imagecolumna están dentro de las img src = ""etiquetas. Has utilizado los atributos widthy heightpara 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 BLOBtipo de datos nuevamente en imágenes, ha utilizado la función PHP incorporada base64_encodey la siguiente sintaxis para el esquema URI de datos:

    data:media_type;base64, base_64_encoded_data

    En este caso, image/pnges media_typey la Base64cadena codificada de la product_imagecolumna es base_64_encoded_data.

    A continuación, ejecute el display_products.phparchivo en un navegador web escribiendo la siguiente dirección:

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

    Después de ejecutar el display_products.phparchivo 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 BLOBtipo 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
    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion