Dans cette vidéo tutorielle, le présentateur explique comment stocker des images (et d’autres fichiers) directement dans une base de données MySQL à l’aide de PHP. Après avoir rappelé la méthode précédente consistant à placer les images dans un répertoire protégé par .htaccess, il expose les deux principaux inconvénients du stockage en base : volume de données qui peut rapidement saturer l’espace dédié aux bases et ralentissement des requêtes SELECT. Il crée ensuite une table `images` (id, name, size, type, bin) en détaillant le type de chaque champ, notamment l’utilisation d’un LONG BLOB pour le champ binaire. Le script d’upload montre comment récupérer les informations du tableau `$FILES`, convertir le fichier en chaîne avec `fileget_contents`, et insérer les valeurs via une requête préparée avec des marqueurs `?`. Après insertion, il montre la taille de l’image stockée. Le présentateur décrit ensuite la récupération des images : une page `test.php` contenant une balise `<img src="export.php?id=1">` et un script `export.php` qui, à partir de l’ID passé en GET, sélectionne le champ `bin` de la table, le renvoie au navigateur avec le bon header. Il démontre l’affichage de plusieurs images en changeant l’ID. Enfin, il rappelle que, bien que le stockage en base soit possible, il recommande la méthode du répertoire sécurisé pour la plupart des cas, et note que la même technique s’applique à d’autres types de fichiers (PDF, DOC, etc.).
Chapters
Bonjour à tous et bienvenue dans cette vidéo où nous allons découvrir une nouvelle astuce. Cette fois, nous allons voir comment stocker les images dans une base de données. Lors de la première vidéo de cette série, nous avons vu comment sécuriser l'accès aux images en les plaçant dans un répertoire. Dans celui-ci, nous avons placé un fichier .htaccess qui interdit tout accès à son contenu depuis le client, et c'est un script PHP qui assure l'exportation de l'image au navigateur. J'ai également mentionné que l'une des méthodes les plus utilisées par les développeurs est le stockage des images dans une base de données, mais j'ai souligné que ce n'est pas toujours la meilleure solution pour les 2 raisons suivantes premièrement, une image est souvent trop volumineuse, ce qui risque de gonfler rapidement l'espace de stockage dédié à la base de données, d'autant plus que de nombreux hébergeurs offrent un espace limité dédié aux bases de données contre un grand espace dédié à l'hébergement des fichiers. Deuxièmement, si la base de données renferme de nombreux fichiers, en l'occurrence des images de grande taille, alors on pourra sentir un ralentissement au moment de l'exécution des requêtes SELECT. Donc, bien que je vais vous expliquer comment appréhender le stockage des images dans une base de données, je vous recommande vivement d'adopter la méthode que nous avons vue lors de la première vidéo et qui consiste à placer les images dans un dossier et leur limiter l'accès. Je vais commencer par créer la table qui va accueillir les images, que j'appellerai images. Qui contiendra 5 champs. Je mets ID, le nom de l'image, sa taille, son type pour dire est-ce que c'est une JPG ou bien PNG ou autre, et bin. Donc là, ça sera l'image elle-même. Pour les types, donc ID, ça sera un entier. Non signée, que je vais déclarer en tant que clé primaire qui va s'incrémenter automatiquement. Pour le nom, ça sera VARCHAR, je mettrai par exemple 100 pour tenir compte des noms qui sont trop longs. La taille, ça va être un entier aussi. Le type, c'est aussi un VARCHAR, je mettrai juste 20. Et pour le bin, donc là ça sera l'image. Bon, pour stocker l'image ou bien n'importe quel fichier dans une base de données, il faut prendre le type BLOB. Ça veut dire les binaires. Dans ce cas, je vais opter pour le type long blob au cas où j'ai des images qui sont trop volumineuses. Et je sauvegarde. Maintenant que ma table est créée, je vais prévoir un code qui va permettre d'uploader les images dans cette table. Alors le code contient juste une input type file et un bouton de type submit. Et maintenant dans le code PHP, je mettrai Si je clique sur le bouton Valider, je vais inclure la chaîne de connexion et ensuite je vais préparer la requête d'insertion. Et je mets 4 marqueurs interrogatifs. Ensuite j'exécute ma requête en lui passant les arguments sous forme de tableau. Alors pour le nom ça sera juste la variable superglobal FILES_NAME. C'est un tableau à 2 dimensions comme on a vu dans la leçon du PHP. La première clé contient le nom de l'input, qui est dans ce cas image, c'est ça. La deuxième clé c'est name pour dire le nom de l'image. Deuxième argument, ça sera la taille, je mettrai size. La troisième entrée c'est le type. Et la quatrième entrée ça sera l'image elle-même. Donc je mettrai temp name. Donc là ça donne juste le chemin vers l'image. Donc moi ce que je vais faire c'est récupérer l'image elle-même et je vais la convertir en chaîne de caractères afin de l'incorporer dans la base de données. Bon je vais donc faire appel à la fonction file get contents. Donc maintenant on va faire un test. Donc je vais inclure cette image. Je me suis trompé du nom de la méthode, c'est execute. Réexécutons. Voilà, donc l'image est bien incluse dans la table avec une taille d'approximativement 373 ko. Donc je vais insérer une autre image. Je vais insérer elle aussi. Maintenant que mes images sont dans la base de données, bon, je vais essayer de les restituer en les affichant sur la page. Pour ça, j'ai prévu une page qui s'appelle test.php. Qui contiendra le code suivant avec la balise img. Et dans la balise img, on va faire exactement comme on a fait pour la première vidéo. Donc en tant que source, je vais nommer une page PHP qui s'appelle export.php. Dans ce cas, je vais quand même lui passer l'attribut id avec par exemple la valeur 1. C'est pour dire que je veux afficher la première image. Si je veux afficher la deuxième, il suffit de mettre id= 2. La page export.php, cette tête qui va interroger la base de données afin de charger l'image et l'envoyer directement à cette page. Donc on va aller sur export.php et le code à mettre c'est include connexion.php. Ensuite on va exécuter la requête de sélection. WHERE id égal au paramètre que l'on va passer après, LIMIT 1, parce qu'il n'y en a qu'un seul enregistrement qui va satisfaire cette condition. Ensuite, on va exécuter la requête en lui passant comme argument le paramètre qui est dans ce cas le ID. C'est ça, je vais le récupérer avec la variable superglobale $_GET, ID comme ça. Ensuite je vais créer un tableau qui contiendra le jeu de données. Et ce qui m'intéresse dans ce tableau c'est surtout le champ bin, c'est-à-dire ce champ. Donc je vais l'afficher en tant que chaîne de caractères. L'index est 0 parce que je n'ai qu'un seul enregistrement dans le jeu de données. Et bin comme ça. Donc exécutons pour voir maintenant ce que ça donne sur la page test.php. Donc voilà, mon image est bien affichée. Maintenant il suffit de changer le ID pour afficher la deuxième image. Je mettrai la valeur 2. J'exécute et ça donne maintenant la deuxième image. Alors comme je l'ai dit au début, maintenant vous avez le choix entre stocker vos images directement dans un dossier en lui sécurisant l'accès en utilisant le fichier .htaccess, bien sûr éventuellement avec un script PHP, ou bien mettre directement vos images dans la base de données. Et notez qu'il n'y a pas que des images que l'on peut stocker dans la base de données mais aussi des fichiers PDF, des fichiers DOC, etc. Alors, ça sera tout pour cette fois. Merci pour votre attention et à la vidéo prochaine.