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

IIwayII -  
IIwayII Messages postés 29 Statut Membre -
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

2 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    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
    1. IIwayII
       
      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
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > IIwayII
         
        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
      2. IIwayII > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
  2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    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
    1. IIwayII Messages postés 29 Statut Membre
       
      Merci beaucoup pour votre patience mais hélas, ça ne fonctionne toujours pas... voici ce que j'obtiens :

      0
    2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > IIwayII Messages postés 29 Statut Membre
       
      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
    3. IIwayII Messages postés 29 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
       
      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
    4. IIwayII Messages postés 29 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
       
      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
    5. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > IIwayII Messages postés 29 Statut Membre
       
      Etrange que ça ne marche pas....

      Pourrais tu nous fournir le résultat du blob
      0