Comment Utiliser le Type de Données MySQL BLOB pour Stocker des Images avec PHP sur Ubuntu 18.04

L’auteur a sélectionné des Filles qui Codent pour recevoir un don dans le cadre du programme Write for Donations.

Introduction

Un objet binaire volumineux (BLOB) est un type de données MySQL qui peut stocker des données binaires telles que des images, des fichiers multimédias et des fichiers PDF.

Lorsque vous créez des applications qui nécessitent une base de données étroitement couplée où les images doivent être synchronisées avec des données connexes (par exemple, un portail pour employés, une base de données pour étudiants ou une application financière), il peut être pratique de stocker des images telles que les photos de passeport et les signatures des étudiants dans une base de données MySQL à côté d’autres informations connexes.

C’est là que le type de données MySQL BLOB entre en jeu. Cette approche de programmation élimine le besoin de créer un système de fichiers séparé pour stocker des images. Le système centralise également la base de données, la rendant plus portable et sécurisée car les données sont isolées du système de fichiers. La création de sauvegardes est également plus transparente car vous pouvez créer un seul fichier de vidage MySQL contenant toutes vos données.

La récupération des données est plus rapide, et lors de la création d’enregistrements, vous pouvez être sûr que les règles de validation des données et l’intégrité référentielle sont maintenues, en particulier lors de l’utilisation de transactions MySQL.

Dans ce tutoriel, vous utiliserez le type de données MySQL BLOB pour stocker des images avec PHP sur Ubuntu 18.04.

Prérequis

Pour suivre ce guide, vous aurez besoin des éléments suivants:

  • Un serveur Ubuntu 18.04 configuré à l’aide de la configuration initiale du serveur avec Ubuntu 18.04 et un utilisateur non root avec des privilèges sudo.
  • Configuration d’Apache, MySQL et PHP en suivant le guide sur l’installation de la pile Linux, Apache, MySQL, PHP (LAMP) sur Ubuntu 18.04. Pour ce tutoriel, il n’est pas nécessaire de créer des hôtes virtuels, vous pouvez donc ignorer l’étape 4.

Étape 1 – Création d’une base de données

Vous commencerez par créer un exemple de base de données pour votre projet. Pour ce faire, entrez SSH sur votre serveur, puis exécutez la commande suivante pour vous connecter à votre serveur MySQL en tant que root:

  • sudo mysql -u root -p

Entrez le mot de passe root de votre base de données MySQL et appuyez sur ENTER pour continuer.

Ensuite, exécutez la commande suivante pour créer une base de données. Dans ce tutoriel, nous allons le nommer test_company:

  • CREATE DATABASE test_company;

Une fois la base de données créée, vous verrez la sortie suivante:

Output
Query OK, 1 row affected (0.01 sec)

Ensuite, créez un compte test_user sur le serveur MySQL et n’oubliez pas de remplacer PASSWORD par un mot de passe fort:

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

Vous verrez la sortie suivante:

Output
Query OK, 0 rows affected (0.01 sec)

Pour accorder test_user des privilèges complets sur la base de données test_company, exécutez:

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

Assurez-vous d’obtenir la sortie suivante:

Output
Query OK, 0 rows affected (0.01 sec)

Enfin, videz la table des privilèges pour que MySQL recharge les autorisations:

  • FLUSH PRIVILEGES;

Assurez-vous de voir la sortie suivante:

Output
Query OK, 0 rows affected (0.01 sec)

Maintenant que la base de données test_company et test_user sont prêtes, vous passerez à la création d’une table products pour stocker des échantillons de produits. Vous utiliserez ce tableau plus tard pour insérer et récupérer des enregistrements afin de démontrer le fonctionnement de MySQL BLOB.

Déconnectez-vous du serveur MySQL:

  • QUIT;

Ensuite, reconnectez-vous avec les informations d’identification du test_user que vous avez créé:

  • mysql -u test_user -p

Lorsque vous y êtes invité, entrez le mot de passe du test_user et appuyez sur ENTER pour continuer. Ensuite, passez à la base de données test_company en tapant ce qui suit:

  • USE test_company;

Une fois la base de données test_company sélectionnée, MySQL s’affichera:

Output
Database changed

Ensuite, créez une table products en exécutant:

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

Cette commande crée une table nommée products. Le tableau comporte quatre colonnes:

  • product_id: Cette colonne utilise un type de données BIGINT afin d’accueillir une grande liste de produits jusqu’à un maximum de 2 articles ERC3-1. Vous avez marqué la colonne comme PRIMARY KEY pour identifier de manière unique les produits. Pour que MySQL gère la génération de nouveaux identifiants pour les colonnes insérées, vous avez utilisé le mot clé AUTO_INCREMENT.

  • product_name: Cette colonne contient les noms des produits. Vous avez utilisé le type de données VARCHAR car ce champ gérera généralement les caractères alphanumériques jusqu’à un maximum de 50 caractères — la limite de 50 n’est qu’une valeur hypothétique utilisée pour les besoins de ce tutoriel.

  • price: À des fins de démonstration, votre tableau products contient la colonne price pour stocker le prix de détail des produits. Étant donné que certains produits peuvent avoir des valeurs flottantes (par exemple, 23.69, 45.36, 102.99), vous avez utilisé le type de données DOUBLE.

  • product_image: Cette colonne utilise un type de données BLOB pour stocker les données binaires réelles des images des produits.

Vous avez utilisé le stockage InnoDB ENGINE de la table pour prendre en charge un large éventail de fonctionnalités, y compris les transactions MySQL. Après l’avoir exécuté pour créer la table products, vous verrez la sortie suivante:

Output
Query OK, 0 rows affected (0.03 sec)

Déconnectez-vous de votre serveur MySQL:

  • QUIT;

Vous obtiendrez la sortie suivante

Output
Bye

La table products est maintenant prête à stocker certains enregistrements, y compris les images des produits, et vous la remplirez avec certains produits à l’étape suivante.

Étape 2 – Création de scripts PHP pour la connexion et le remplissage de la base de données

Dans cette étape, vous allez créer un script PHP qui se connectera à la base de données MySQL que vous avez créée à l’étape 1. Le script préparera trois exemples de produits et les insérera dans la table products.

Pour créer le code PHP, ouvrez un nouveau fichier avec votre éditeur de texte:

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

Ensuite, entrez les informations suivantes dans le fichier et remplacez PASSWORD par le mot de passe test_user que vous avez créé à l’étape 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);

Enregistre et ferme le fichier.

Dans ce fichier, vous avez utilisé quatre constantes PHP pour vous connecter à la base de données MySQL que vous avez créée à l’étape 1:

  • DB_NAME : Cette constante contient le nom de la base de données test_company.

  • DB_USER : Cette variable contient le nom d’utilisateur test_user.

  • DB_PASSWORD : Cette constante stocke le MySQL PASSWORD du compte test_user.

  • DB_HOST: Cela représente le serveur où réside la base de données. Dans ce cas, vous utilisez le serveur localhost.

La ligne suivante dans votre fichier initie un objet de données PHP (PDO) et se connecte à la base de données MySQL:

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

Vers la fin du fichier, vous avez défini quelques attributs PDO:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: Cet attribut demande à PDO de lancer une exception qui peut être journalisée à des fins de débogage.
  • ATTR_EMULATE_PREPARES, false: Cette option augmente la sécurité en indiquant au moteur de base de données MySQL de faire la préparation au lieu de PDO.

Vous allez inclure le fichier /var/www/html/config.php dans deux scripts PHP que vous allez créer ensuite pour insérer et récupérer des enregistrements respectivement.

Tout d’abord, créez le script PHP /var/www/html/insert_products.php pour insérer des enregistrements dans la table des produits:

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

Ajoutez ensuite les informations suivantes dans le fichier /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";

Enregistre et ferme le fichier.

Dans le fichier, vous avez inclus le fichier config.php en haut. Il s’agit du premier fichier que vous avez créé pour définir les variables de base de données et vous connecter à la base de données. Le fichier initie également un objet PDO et le stocke dans une variable $pdo.

Ensuite, vous avez créé un tableau des données des produits à insérer dans la base de données. En dehors des product_name et price, qui sont préparés respectivement sous forme de chaînes et de valeurs numériques, le script utilise la fonction file_get_contents intégrée à PHP pour lire les images d’une source externe et les transmettre sous forme de chaînes à la colonne product_image.

Ensuite, vous avez préparé une instruction SQL et utilisé l’instruction PHP foreach{...} pour insérer chaque produit dans la base de données.

Pour exécuter le fichier /var/www/html/insert_products.php, exécutez-le dans la fenêtre de votre navigateur en utilisant l’URL suivante. N’oubliez pas de remplacer your-server-IP par l’adresse IP publique de votre serveur:

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

Après avoir exécuté le fichier, vous verrez un message de succès dans votre navigateur confirmant que les enregistrements ont été insérés dans la base de données.

 Un message de réussite indiquant que des enregistrements ont été insérés dans la base de données

Vous avez inséré avec succès trois enregistrements contenant des images de produits dans la table products. Dans l’étape suivante, vous allez créer un script PHP pour récupérer ces enregistrements et les afficher dans votre navigateur.

Étape 3 – Affichage des informations sur les produits À partir de la base de données MySQL

Avec les informations et les images des produits dans la base de données, vous allez maintenant coder un autre script PHP qui interroge et affiche les informations sur les produits dans un tableau HTML sur votre navigateur.

Pour créer le fichier, tapez ce qui suit:

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

Ensuite, entrez les informations suivantes dans le fichier:

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

Enregistre les modifications apportées au fichier et le ferme.

Ici, vous avez de nouveau inclus le fichier config.php afin de vous connecter à la base de données. Ensuite, vous avez préparé et exécuté une instruction SQL à l’aide de PDO pour récupérer tous les éléments de la table products à l’aide de la commande SELECT * FROM products.

Ensuite, vous avez créé une table HTML et l’avez remplie avec les données des produits en utilisant l’instruction PHP while() {...}. La ligne $row = $stmt->fetch(PDO::FETCH_ASSOC) interroge la base de données et stocke le résultat dans la variable $row sous forme de tableau multidimensionnel, que vous avez ensuite affiché dans une colonne de tableau HTML en utilisant la syntaxe $row.

Les images de la colonne product_image sont enfermées dans les balises <img src = "">. Vous avez utilisé les attributs width et height pour redimensionner les images à une taille plus petite pouvant tenir dans la colonne du tableau HTML.

Afin de convertir les données détenues par le type de données BLOB en images, vous avez utilisé la fonction PHP base64_encode intégrée et la syntaxe suivante pour le schéma d’URI de données:

data:media_type;base64, base_64_encoded_data

Dans ce cas, la image/png est la media_type et la chaîne codée Base64 de la colonne product_image est la base_64_encoded_data.

Ensuite, exécutez le fichier display_products.php dans un navigateur Web en tapant l’adresse suivante:

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

Après avoir exécuté le fichier display_products.php dans votre navigateur, vous verrez un tableau HTML avec une liste de produits et des images associées.

 Liste des produits de la base de données MySQL

Cela confirme que le script PHP pour récupérer des images de MySQL fonctionne comme prévu.

Conclusion

Dans ce guide, vous avez utilisé le type de données MySQL BLOB pour stocker et afficher des images avec PHP sur Ubuntu 18.04. Vous avez également vu les avantages de base du stockage d’images dans une base de données plutôt que de les stocker dans un système de fichiers. Ceux-ci incluent la portabilité, la sécurité et la facilité de sauvegarde. Si vous créez une application telle qu’un portail d’étudiants ou une base de données d’employés qui nécessite que des informations et des images associées soient stockées ensemble, cette technologie peut vous être d’une grande utilité.

Pour plus d’informations sur les types de données pris en charge dans MySQL, suivez le guide des types de données MySQL. Si vous êtes intéressé par d’autres contenus relatifs à MySQL et PHP, consultez les tutoriels suivants:

  • Comment Implémenter la Pagination dans MySQL avec PHP sur Ubuntu 18.04
  • Comment Utiliser l’extension PHP PDO pour Effectuer des Transactions MySQL en PHP sur Ubuntu 18.04

Leave a Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.