*L’auteur a sélectionné Girls Who Code pour recevoir un don dans le cadre de l’initiative Écrire pour des donations. *
Un Binary Large Object (BLOB
) est un type de données MySQL qui peut stocker des données binaires telles que des images, du multimédia et des fichiers PDF.
Lors de la création d’applications qui nécessitent une base de données étroitement couplée où les images doivent être synchronisées avec les données connexes (par exemple, un portail d’employés, une base de données d’étudiants ou une application financière), vous pouvez trouver pratique de stocker des images telles que les photos et signatures de passeport des étudiants dans une base de données MySQL avec d’autres informations connexes.
C’est là qu’intervient le type de données MySQL BLOB
. Cette approche de programmation élimine la nécessité de créer un système de fichiers séparé pour le stockage des images. Le système centralise également la base de données, la rendant plus portable et plus sécurisée car les données sont isolées du système de fichiers. La création de sauvegardes est également plus transparente puisque vous pouvez créer un seul fichier MySQL dump qui contient toutes vos données.
La récupération des données est plus rapide, et lors de la création des 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 des transactions MySQL.
Dans ce tutoriel, vous allez utiliser le type de données MySQL BLOB
pour stocker des images avec PHP sur Ubuntu 18.04.
Pour suivre ce guide, vous aurez besoin des éléments suivants :
sudo
.Vous commencerez par créer un exemple de base de données de votre projet. Pour ce faire, connectez-vous en SSH à 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 l’appellerons test_company
:
- CREATE DATABASE test_company;
Une fois la base de données créée, vous verrez le résultat suivant :
OutputQuery 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 :
OutputQuery OK, 0 rows affected (0.01 sec)
Pour accorder des privilèges complets à test_user
sur la base de données test_company
, exécutez :
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
Vérifiez que vous obtenez le résultat suivant :
OutputQuery OK, 0 rows affected (0.01 sec)
Enfin, videz la table des privilèges afin que MySQL recharge les autorisations :
- FLUSH PRIVILEGES;
Assurez-vous de voir le résultat suivant :
OutputQuery OK, 0 rows affected (0.01 sec)
Maintenant que la base de données test_company
et test_user
sont prêts, vous allez passer à la création du tableau products
pour le stockage d’échantillons de produits. Vous utiliserez cette table plus tard pour insérer et récupérer des enregistrements afin de faire la démonstration du 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
Entrez le mot de passe du test_user
et appuyez sur ENTER
(ENTRÉE) 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 affichera :
OutputDatabase changed
Ensuite, créez un tableau 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 un tableau nommé products
. Le tableau contient 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⁶³-1 articles. Vous avez marqué la colonne comme PRIMARY KEY
pour identifier les produits de manière unique. Pour que MySQL puisse gérer la génération de nouveaux identifiants pour des 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ère généralement des 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. Comme 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 moteur
de stockage InnoDB
pour la table afin de prendre en charge un large éventail de fonctionnalités, y compris les transactions MySQL. Après avoir exécuté ceci pour créer le tableau products
, vous verrez le résultat suivant :
OutputQuery OK, 0 rows affected (0.03 sec)
Déconnectez-vous de votre serveur MySQL :
- QUIT;
Vous obtiendrez le résultat suivant
OutputBye
Le tableau products
est maintenant prêt à stocker quelques enregistrements, y compris des images des produits et vous le remplirez avec quelques produits lors de la prochaine étape.
Au cours de cette étape, vous allez créer un script PHP qui se connectera à la base de données MySQL que vous avez créée à l’Etape 1. Le script préparera trois exemples de produits et les insérera dans le tableau products
.
Pour créer le code PHP, ouvrez un nouveau fichier avec l’éditeur de texte :
- sudo nano /var/www/html/config.php
Entrez ensuite dans le fichier et remplacez PASSWORD
avec le mot de passe de test_user
que vous avez créé à l’Étape 1 :
<?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);
Enregistrez et fermez 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 de l’utilisateur test_user
.
DB_PASSWORD
: Cette constante stocke le PASSWORD
MySQL du compte test_user
.
DB_HOST
: Représente le serveur sur lequel réside la base de données. Dans ce cas, vous utilisez le serveur localhost
.
La ligne suivante de votre fichier initie un PHP Data Object (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 indique au PDO de lancer une exception qui peut être enregistrée à des fins de débogage.ATTR_EMULATE_PREPARES, false
: Cette option augmente la sécurité en demandant au moteur de base de données MySQL de faire le préparation au lieu de PDO.Vous allez inclure le fichier /var/www/html/config.php
dans deux scripts PHP que vous créerez ensuite pour insérer et récupérer des enregistrements, respectivement.
Tout d’abord, créez le script /var/www/html/insert_products.php
PHP pour l’insertion des enregistrements dans le tableau products :
- sudo nano /var/www/html/insert_products.php
Ajoutez ensuite les informations suivantes dans le fichier /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";
Enregistrez et fermez le fichier.
Dans le fichier, vous avez inclus le fichier config.php
en haut. C’est le premier fichier que vous avez créé pour définir les variables de la 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. Outre product_name
et price
, qui sont préparés respectivement sous forme de chaînes de caractères et de valeurs numériques, le script utilise la fonction intégrée file_get_contents
de PHP pour lire les images d’une source externe et les transmettre sous forme de chaînes de caractères à la colonne product_image
.
Ensuite, vous avez préparé une instruction SQL et utilisé l’instruction foreach{...}
de PHP 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 l’exécution du fichier, vous verrez un message de confirmation dans votre navigateur confirmant que les enregistrements ont été insérés dans la base de données.
Vous avez correctement inséré trois enregistrements contenant des images de produit 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.
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 des 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
Entrez ensuite les informations suivantes dans le fichier :
<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>
Sauvegardez les modifications du fichier et fermez-le.
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 en utilisant PDO pour récupérer tous les éléments du tableau products
à l’aide de la commande SELECT * FROM products
.
Ensuite, vous avez créé un tableau HTML et l’avez rempli 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 la forme d’un tableau multidimensionnel, que vous avez ensuite affiché dans une colonne du tableau HTML en utilisant la syntaxe $row['column_name']
.
Les images de la colonne product_image
sont jointes dans les balises <img src = "">
. Vous avez utilisé les attributs width
et height
pour redimensionner les images à une taille plus petite qui peut tenir dans la colonne du tableau HTML.
Afin de convertir en images les données détenues par le type de données BLOB
, vous avez utilisé la fonction PHP base64_encode
intégrée et la syntaxe suivante pour le schéma Data URI :
data:media_type;base64, base_64_encoded_data
Dans ce cas, l’image/png
est le media_type
et la chaîne codée en 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 d’images associées.
Cela confirme que le script PHP pour la récupération des images de MySQL fonctionne comme prévu.
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 fondamentaux du stockage des images dans une base de données par rapport au stockage dans un système de fichiers. Il s’agit notamment de la portabilité, de la sécurité et de 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 de stocker ensemble des informations et des images connexes, alors 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 :
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!