Afficher une image contenu au format blob dans ma base de donnée

Fermé
IIwayII - 20 mars 2021 à 16:00
IIwayII Messages postés 28 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 23 juin 2021 - 22 mars 2021 à 12:55
Bonjour,

J'aimerais pouvoir insérer des images se trouvant dans ma base de donnée au format blob sur ma page web, mais je n'y arrive pas, je suis pas hyper habitué à mettre autre chose que du texte dans mes bases de données, et la plupart des choses que j'ai trouvé sur internet utilise soit la fonction mysql_query() qui ne semble plus marcher car à chaque fois que je l'utilise j'obtiens un message d'erreur indiquant que cette fonction est indéfini et ces pages web étaient assez anciennes, ou soit le code est très compliqué alors que, afficher une image ne devrait pas l'être tant que ça si ?

Enfin bref je ne sais pas si c'est très clair, mais avec quoi je pourrais afficher une image contenu au format blob ?

Configuration: Windows / Chrome 89.0.4389.82
A voir également:

2 réponses

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
20 mars 2021 à 17:11
Bonjour,

des images se trouvant dans ma base de donnée au format blob

Petite parenthèse au cas où :.. c'est une mauvaise pratique.
Il est préférable ( pour des raisons de place et de performance) de ne stocker en bdd que le chemin vers l'image.... et de mettre l'image simplement dans un dossier de son site web.

Quoi qu'il en soit,
pour afficher une image stockée en blob ( je suis d'ailleurs étonné que tu n'aies pas trouvé la réponse sur le net .. tellement iil est facile de l'avoir ...) il suffit d'utiliser la syntaxe
echo '<img src="data:image/jpeg;base64,'.base64_encode( $result['image'] ).'"/>';


mysql_query() qui ne semble plus marcher

En effet, pour faire des requêtes dans une bdd, il faut désormais PDO ou mysqli
https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

Mais au final, ta question concerne l'affichage de l'image .... ou le fait de réaliser des requêtes dans ta bdd ?
Personnellement, j'ai une grosse préférence pour PDO
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

0
Bonjour,

Merci beaucoup pour votre réponse, j'essaierai et reviendrai ici.

Oui j'ai cru comprendre que ce n'était pas une bonne pratique mais je ne vois pas comment faire d'autre pour récupérer les images que déposeront mes utilisateurs sur mon site... si vous avez des solutions pas trop compliqué je suis preneur :))

Encore merci, bonne soirée ????
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649 > IIwayII
20 mars 2021 à 17:46
Comme je te l'ai indiqué, au lieu de mettre l'image dans la bdd, il suffit de la laisser dans un répertoire de ton site web et de ne mettre en bdd que le chemin vers cette image.
0
IIwayII > jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024
Modifié le 20 mars 2021 à 19:49
Re, j'ai essayé et ça n'a pas fonctionné... voici mon code :

<?php
$id=$_GET["id"];
if ($id) {
 try{
                $bdd =new PDO('mysql:host=localhost;dbname=bdp;charset=utf8', 'root', 'root');
                    // Activation des erreurs PDO
                 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                } catch(PDOException $e) {
                    die('Erreur : ' . $e->getMessage());
                }
    $result = $bdd->prepare('SELECT img_id, img_nom, img_type, img_blob FROM images WHERE img_id = :id ');
 $result->execute(array('id' => $id));
 while($terme_trouve = $result->fetch())
{
echo '<img src="data:image/jpeg;base64,'.base64_encode( $terme_trouve['img_blob'] ).'"/>';
}
}
?>


Je n'obtiens pas de message d'erreur mais mon image ne s'affiche pas...Quant à votre propositions de mettre les images dans un répertoire, pourquoi pas mais comment dois-je m'y prendre ?
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
20 mars 2021 à 19:55
Dis moi ce que ça donne
<?php
//Affichage des erreurs php
error_reporting(E_ALL | E_WARNING | E_NOTICE);
ini_set('display_errors', TRUE);

// connexion à la bdd ( moi je le mettrai dans un fichier à part que j'incluerai lorsque j'en ai besoin...
  try{
    $bdd =new PDO('mysql:host=localhost;dbname=bdp;charset=utf8', 'root', 'root');
    // Activation des erreurs PDO
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
    $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  } catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
  }
  

//récupération PROPRE des variables AVANT de les utiliser
$id = isset($_GET["id"]) ? trim($_GET["id"]) : NULL;

if ($id) {
  // préparation de la requête
  $sql = 'SELECT img_id, img_nom, img_type, img_blob 
          FROM images 
          WHERE img_id = :id ';
  $datas = array(':id' => $id);

  try{
    $result = $bdd->prepare($sql);
    $result->execute($datas);
    $terme_trouve = $result->fetch();
  } catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());

    
  if(!empty($terme_trouve)){
    echo '<img src="data:image/jpeg;base64,'.base64_encode( $terme_trouve['img_blob'] ).'"/>';
    //pour débuguer au cas où ça ne marche toujours pas :
      echo "<pre>";
      print_r($terme_trouve);
      echo "</pre>";
    // fin du debug.
  }else{
    echo "Aucun résultat trouvé pour l'id : " . $id;
  }
}
?>



PS: J'ai corrigé ton message pour préciser le langage dans les balises de code.
Merci d'y penser à l'avenir
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

0
IIwayII Messages postés 28 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 23 juin 2021
20 mars 2021 à 22:43
Merci beaucoup pour votre patience mais hélas, ça ne fonctionne toujours pas... voici ce que j'obtiens :

0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649 > IIwayII Messages postés 28 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 23 juin 2021
20 mars 2021 à 22:46
Déjà, il serait pas mal que tu nous donnes le contenu du blob pour qu'on puisse vérifier qu'il est valide.

ensuite, il serait pas mal de nous montrer comment tu sauvegardes dans ta bdd... ne ferais tu pas déjà un base_64 encode avant de le mettre en bdd ?
0
IIwayII Messages postés 28 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 23 juin 2021 > jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024
Modifié le 20 mars 2021 à 23:13
J'ai éteint mon ordi mais je m'étais documenté sur internet et un site mavais conseiller de construire ma base ainsi :



Et je ne sais plus si je fais déjà un base_64 encode, je cous donnerai mes autres script demain...
L'image actuelle est une image jpg toute simple de très petite taille.

Encore merci pour votre patience...

Bonne nuit
0
IIwayII Messages postés 28 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 23 juin 2021 > jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024
21 mars 2021 à 11:03
Bonjour,

Voici mes autres script :
- Voici Index.php :
<html>
   <head>
      <title>Index</title>
   </head>
   <body>
      <?php
         include ("transfert.php");
         if ( isset($_FILES['fic']) )
         {
             transfert();
         }
      ?>
      <h3>Envoi image :</h3>
      <form enctype="multipart/form-data" action="#" method="post">
         <input type="hidden" name="MAX_FILE_SIZE" value="250000" />
         <input type="file" name="fic" size=50 />
         <input type="submit" value="Envoyer" />
      </form>
   </body>
</html>


- et voici transfert.php :

<?php
    function transfert(){
        $ret = false;
        $img_blob = '';
        $img_taille = 0;
        $img_type = '';
        $img_nom = '';
        $taille_max = 250000;
        $ret = is_uploaded_file($_FILES['fic']['tmp_name']);
        
        if (!$ret) {
            echo "Problème de transfert";
            return false;
        } 
        else {
            // Le fichier a bien été reçu
            $img_taille = $_FILES['fic']['size'];
            
            if ($img_taille > $taille_max) {
                echo "Trop gros !";
                return false;
            }

            $img_type = $_FILES['fic']['type'];
            $img_nom  = $_FILES['fic']['name'];
            $img_desc  = $_FILES['fic']['name'];
            try{
                $bdd =new PDO('mysql:host=localhost;dbname=bdp;charset=utf8', 'root', 'root');
                    // Activation des erreurs PDO
                 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                } catch(PDOException $e) {
                    die('Erreur : ' . $e->getMessage());
                }
            $img_blob = file_get_contents ($_FILES['fic']['tmp_name']);
            $req = $bdd->prepare('INSERT INTO images(img_nom, img_taille, img_type, img_desc, img_blob) VALUES(:img_nom, :img_taille, :img_type, :img_desc, :img_blob)');
            $req->execute(array(
                'img_nom' => $img_nom,
                'img_taille' => $img_taille,
                'img_type' => $img_type,
                'img_desc' => $img_desc,
                'img_blob' => addslashes($img_blob)));
            return true;
        }
    }
?>
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649 > IIwayII Messages postés 28 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 23 juin 2021
21 mars 2021 à 13:41
Etrange que ça ne marche pas....

Pourrais tu nous fournir le résultat du blob
0