Stocker des images dans une BDD

Pascal-Jr -  
 Pascal-Jr -
Bonjour,
Je voudrais stocké des images dans une base de données MySQL.

En fait ça serait pour un système d'annonce :
j'ai une liste de moto à vendre sous forme de tableau (comme sur le bon coin).
Des personnes m'ont aidé à achever mes scripts, d'ailleurs je les en remercies encore,
mon système fonctionne.

Mon problème :
Je voudrais afficher des photos pour chacune des moto :
- une photo visible de la liste des motos
- et 3 photos visible de la fiche de la moto choisi par l'utilisateur.
En cherchant, j'ai entendu parlé de BLOB ou de stocker seulement le chemin de l'image.

Merci d'avance à tous pour votre implication.

7 réponses

  1. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Bonsoir,
    Me revoilà x), mais je pense je vais te résoudre ton problème dès la première réponse !
    Le but c'est de les appeler par un nom et de les mettre dans un dossier.
    Exemple :
    <img src="motos/<?php echo $_SESSION['image']; ?>.png" title="<?php echo $_SESSION['image']; ?>" width="100" height="100"/>
    Dans ta base de donnée ta moto s'appelle par exemple corsaro, et dans ton dossier ton image s'appelle corsaro.png
    En gros sa affichera <img src="motos/corsaro.png" title="corsaro" width="100" height="100"/>
    Voilà j'espère que mon aide t'aura été utile.
    1
    1. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
       
      PS : je pense pas que c'est dans une $_SESSION mais à toi de changer sa après.
      Exemple : <img src="motos/<?php echo $donnees['image']; ?>.png" title="<?php echo $donnees['image']; ?>" width="100" height="100"/>
      0
    2. Profil bloqué
       
      C'est mieux, et ne met surtout pas tes photos directement dans la base de donnée. (oui déjà vu ça, et après ça demande pourquoi les accès bases sont lents :) )
      0
    3. Pascal-Jr
       
      Mais par rapport à la structure de la table quel type je mets à "images" ?
      C'est inutile de mettre BLOB, vu que je vais stocké du texte, n'est-ce pas ?
      0
  2. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Ben regardes bien.
    <img src="motos/<?php echo $donnees['image']; ?>.png" j'ai mis PNG après tu peux changé en mettant JEPG, GIF etc
    Mais il faut que toute tes images soit au même format pour pas endurcir la chose.
    Sinon tu peux mettre en base de donnée :
    BMW.png et mettre ceci en codage HTML/PHP :
    <img src="motos/<?php echo $donnees['image']; ?>" title="<?php echo $donnees['image']; ?>" width="100" height="100"/>

    0
    1. Pascal-Jr
       
      Oui mais concernant la table SQL, je ne vais pas mettre INT à "image" dans la table, ni BLOB vu que je vais l'enregistrer dans un dossier et me servir de la base de données pour l'afficher.
      Je me trompes ?
      0
    2. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
       
      Tes images vont être dans un dossier dans ton site.
      Donc tu mets juste une colonne image en text ou varchar par exemple
      0
    3. Pascal-Jr
       
      Ok c'est ce que je me disais.
      Et pardon pour le commentaire déplacé (si tu l'as vu) c'est mon collègue qui aime bien faire des ... blagues ... En même temps, il n'a pas totalement tord. :)
      0
    4. Pascal-Jr
       
      Par contre, comment combiné un script d'upload et l'envoi du nom de l'image sur la base de données ?
      0
    5. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
       
      Si dans ta base de donnée c'est BMW.png

      Le serveur te retournera :
      <img src="motos/BMW.png" title="BMW.png" width="100" height="100"/>
      0
  3. idrissess Messages postés 108 Statut Membre 12
     
    Bonjour;
    Avec MySQL vous n'avez qu'a ajouter pour un table une colonne de type LONGBLOB (DATATYPE) et parcourir l'image pour la stocker.
    0
    1. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
       
      A quoi sa sert ?
      A rien du tout en plus sa ralenti ta base de donnée.
      Mon idée est plus simple et moins compliqué.
      0
    2. Pascal-Jr
       
      Ca serait plus simple pour moi vu que je suis un débutant.
      Mais je me disais que si je n'avais qu'une dizaine de modèle en vente, peut-être que je pourrais utilisé la manière simple.
      0
    3. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
       
      Non pascal c'est pas plus simple tu sais quand tu affiche ton modèle, et ben tu affiche ton image !
      0
    4. Pascal-Jr
       
      Erf ... Je suis totalement paumé ...
      Par contre je me disais que je pouvais me servir de la supervariable $_FILES['photo']['name'] pour récupérer le nom de l'image à l'upload
      0
  4. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Envoi ton code PHP ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Pascal-Jr
     
    Avec plaisir :

    // Code de traitement pour la base de données
    <?php
    try
    {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=annonces' , 'root', '', $pdo_options);

    $req = $bdd->prepare('INSERT INTO article(modele, photo, cylindree, km, annee, prix, description) VALUES(:modele, :photo, :cylindree, :km, :annee, :prix, :description)');
    $req->execute(array(
    'modele' => $_POST['modele'],
    'photo' => $_POST['photo'],
    'cylindree' => $_POST['cyl'],
    'km' => $_POST['km'],
    'annee' => $_POST['annee'],
    'prix' => $_POST['prix'],
    'description' => $_POST['description'],
    ));
    echo "L'annonce a bien été publiée";
    }
    catch(Exception $e)
    {
    die('Erreur : '.$e->getMessage());
    }
    ?>

    //Code de traitement de l'image
    <?php
    if (isset($_FILES['photo']) AND $_FILES['photo']['error'] = 0)
    {
    if ($_FILES['photo']['size'] <= 3000000)
    {
    $infosfichier = pathinfo($_FILES['photo']['name']);
    $extension_upload = $infosfichier['extension'];
    $extension_autorisees = array('jpg', 'jpeg', 'JPEG', 'JPG' 'gif', 'GIF', 'png', 'PNG');
    if (in_array($extension_upload, $extension_autorisees))
    {
    move_upload_files($_FILES['photo']['tmp_name'], 'images/occasions/' . basename($_FILES['photo']['name']));
    echo "<p>L'envoie de la photo a bien était effectué</p>";
    }
    }
    }
    ?>
    0
  7. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Celui qui montre l'annonce plutôt, je te ferais voir comment faire pour envoyer tes images.
    0
    1. Pascal-Jr
       
      Sous forme de tableau ou la fiche descriptive du véhicule ?
      Dans le doute je mets les deux.

      <?php
      // Code de pour l'affichage des annonces
      try
      {
      $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
      $bdd = new PDO('mysql:host=localhost;dbname=annonces' , 'root', '', $pdo_options);

      $req = $bdd->query('SELECT * FROM article');

      while ($donnees = $req->fetch())
      {
      ?>
      <tr>
      <td><img src="images/occasions/<?php echo $donnees['photo']; ?>.jpg" title="<?php echo $donnees['photo']; ?>" width="150px" height="113px" /></td>
      <td><a href="fiche.php?id=<?php echo $donnees['id']; ?>" action="fiche.php?id=<?php echo $donnees['id']?>"; title="Consulter la fiche"><?php echo $donnees['modele']; ?></a></td>
      <td><?php echo $donnees['cylindree']; ?>cc</td>
      <td><?php echo $donnees['km']; ?></td>
      <td><?php echo $donnees['annee']; ?></td>
      <td><?php echo $donnees['prix']; ?></td>
      </tr>
      <?php
      }
      $req->closeCursor();
      }
      catch(Exception $e)
      {
      die('Erreur : '.$e->getMessage());
      }
      ?>

      // Code d'affichage du modèle choisi
      <?php
      try
      {
      $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
      $bdd = new PDO('mysql:host=localhost;dbname=annonces', 'root', '', $pdo_options);

      $req = $bdd->prepare('SELECT * FROM article WHERE id = ?');
      $req->execute(array($_GET['id']));

      while ($donnees = $req->fetch())
      {
      ?>
      <ul>
      <li><img src="images/occasions/<?php echo $donnees['photo']; ?>.jpg" title="<?php echo $donnees['photo']; ?>" width="500px" height="376px" /></a>
      <li>Marque/Modèle : <?php echo $donnees['modele']; ?></li>
      <li>Cylindrée : <?php echo $donnees['cylindree']; ?></li>
      <li>Km : <?php echo $donnees['km']; ?></li>
      <li>Année : <?php echo $donnees['annee']; ?></li>
      <li>Prix : <?php echo $donnees['prix']; ?></li>
      <li>Description : <?php echo $donnees['description']; ?></li>
      </ul>
      <?php
      }
      $req->closeCursor();
      }
      catch(Exception $e)
      {
      die('Erreur : '.$e->getMessage());
      }
      ?>
      0
  8. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Ben tu mets toutes tes images dans : images/occasions/ du formats .jpg.
    Dans artice sur la colonne photo tu met un nombre par exemple.
    Et dans tes images/occasions/ tu mets l'image qui correspond au nombre. C'est aussi simple que ça !
    0
    1. Pascal-Jr
       
      o_O Si tu le dis ...
      Pour le nombre, je mets l'auto-incrémentation ?
      0
    2. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
       
      Comme tu veux x)
      0
    3. Pascal-Jr
       
      Ne pouvant pas utiliser l'auto-incrémentation pour ma colonne photo (en plus de la colonne 'id')
      j'ai mit :
      <td><img src="images/occasions/<?php echo $donnees['id']; ?>.jpg" title="<?php echo $donnees['modele']; ?>" width="150px" height="113px" /></td>
      Ca revient au même (de mon point de vue).
      Maintenant ce que j'aimerais c'est que l'upload soit synchro avec l'annonce que je poste.
      Par exemple, si je poste mon annonce qui utilisera l'"id" n° 4, l'image se renomme à l'upload 4.jpg.
      0
    4. Pascal-Jr
       
      J'ai essayé de me servir de l'auto-incrémentation et de rajouté un à chaque fois à la dernière entrée, ce qui ma donné ce script :
      <?php
      try
      {
      $pdo_options[PDO::ERRMODE] = PDO::ERRMODE_EXCEPTION ;
      $bdd = new PDO('mysql:host=localhost;dbname=annonces', 'root', '', $pdo_options);

      $req = $bdd->query('SELECT * FROM article ORDER BY id DESC LIMIT 0,1');

      if (isset($_FILES['photo']) AND $_FILES['photo']['error'] == 0)
      {
      if ($_FILES['photo']['size'] <= 5000000)
      {
      $infosfichier = pathinfo($_FILES['photo']['name']);
      $extension_upload = $infosfichier['extension'];
      $extensions_autorisees = array('jpg', 'jpeg', 'JPG', 'JPEG', 'gif', 'GIF', 'png', 'PNG');
      if (in_array($extension_upload, $extensions_autorisees))
      {
      // C'est ici que je me suis servi de l'A-I pour rajouté "+1"
      move_uploaded_file($_FILES['photo']['tmp_name'], 'images/occasion/'. echo $donnees['id']+1;'.png');
      }
      }
      }
      }
      catch (Exception $e)
      {
      die('Erreur : '.$e->getMessage());
      }
      ?>
      Le principe étant que je rajoute "1" à l'id a chaque fois que je rajoute une entrée je fais la même chose à l'upload de l'image.
      Etant donné que si je veux mettre l'annonce n°6 et que j'en suis à la 5 je rajoute 1 à l'id pour avoir un id égal a 6 et un numéro à l'image égal à 6.
      Mais ça ne marche pas -_-'.
      Une idée ?
      J'ai une erreur unexpected T_ECHO au niveau de move_uploaded_file(...)
      0
    5. Pascal-Jr
       
      Une erreur de débutant (que je suis), il fallait faire :
      move_uploaded_file($_FILES['photo']['tmp_name'], 'images/occasions/' . $donnees['id'] + 1 . '.jpg');
      0