TUTORIELS 
Images et MySQL
Présentation de deux méthodes différentes pour consituer une base de données d'images, en utilisant MySQL et PHP.  (23 juillet 2001)
 

Quelle méthode choisir?
Il est possible d'insérer directement des images (et même du code HTML) sous forme binaire dans une base de données relationnelle MySQL, plutôt que d'y faire figurer le lien vers l'image (elle-même stockée quelque part dans le système de fichiers). Est-ce pour autant une bonne solution? Des images directement stockées dans la base de données ne vont pas manquer d'alourdir considérablement cette dernière, ralentissant les accès. On pourrait avancer néanmoins que cela permettrait de sécuriser les images (en empêcher le piratage) si celles-ci doivent l'être. Mais il est aussi possible de stocker les images en dehors de l'arborescence web, et de garder des liens dans la base de données.
Malgré ces réserves, stocker les images sous forme binaire dans un champ de la base de données peut avoir son intérêt. Si par exemple on désire effectuer des recherches sur des formes au sein des images. Cet article a donc deux objectifs: 1) présenter une méthode pour stocker des images via des liens dans la base, et en dehors de l'arborescence web; 2) présenter une méthode pour stocker des images, si besoin est, directement dans la base de données.

Accéder à des images situées en dehors de l'arborescence web
La méthode est très simple: l'appel à une image se fera grâce à un script PHP (appelons-le "afficher_image") de la forme:

<?php
   
header('content-type: image/gif');
   
readfile('/chemin/vers/les/images/image.gif');
?>

que l'on appelle au moyen de l'instruction HTML:

<img src="afficher_image.php">

Il sera bien sûr plus commode de passer en paramètre le type de l'image et le nom du fichier correspondant afin d'automatiser la procédure.

Stocker directement des images avec MySQL
Il nous faut créer une base (nous l'appellerons "essai") et une table (nous l'appellerons "images_binaires") qui comprendra les champs suivants: id (un entier), donnees_binaires (type MySQL LONGBLOB), nom_fichier (une chaîne), taille_fichier (une chaîne), type_fichier (une chaîne), et, éventuellement, un champ description (une chaîne). On n'oubliera pas de préciser "auto_increment" pour l'identifiant. Nous allons insérer les images dans la base à l'aide, par exemple, d'un formulaire HTML. Il ressemblera à:

<form method="post" action="inserer_image.php" enctype="multipart/form-data">
Nom du fichier:&nbsp;<input type="file" name="image" size="40">
<br><input type="submit" name="ok">
</form>


Notre programme inserer_image.php sera alors le suivant:

<?php
    mysql_connect("","root","");
    mysql_select_db("essai");
    $donnees = addslashes(fread(fopen($image, "r"), filesize($image)));
    $result=mysql_query("INSERT INTO images_binaires (donnees_binaires,nom_fichier,taille_fichier,type_fichier) VALUES ('$donnees','$image_name','$image_size','$image_type')");

    $id= mysql_insert_id();
    print "<br>Indentifiant du fichier dans la base:
$id<br>";
    mysql_close
();
?>

Un petit programme php, afficher_image.php, va permettre de récupérer l'image dans la base:

<?php
    @mysql_connect("","root","");
    @mysql_select_db("essai");
    $requete = "SELECT donnees_binaires,type_fichier FROM images_binaires WHERE id=$id";
    $resultat = @mysql_query($requete);
    $donnees = @mysql_result($resultat,images_binaires.donnees_binaires);
    $type = @mysql_result($resultat,0,images_binaires.type_fichier);
    header( "content-type: $type");
    echo $donnees;
?>


On appellera ce programme avec une instruction HTML du type:

<img src="afficher_image.php"?id=identifiant>

où l'on précisera l'identifiant correspondant.

 
[ Jérôme MorlonJDNet
 
Accueil | Haut de page