Importer images dans BDD

Résolu/Fermé
lucanne212274 Messages postés 9 Date d'inscription samedi 30 octobre 2021 Statut Membre Dernière intervention 27 juin 2022 - 25 juin 2022 à 17:28
lucanne212274 Messages postés 9 Date d'inscription samedi 30 octobre 2021 Statut Membre Dernière intervention 27 juin 2022 - 27 juin 2022 à 20:13
Bonjour à tous,


Voilà 2 semaines que je bloque pour importer des images dans ma base de données.
Lorsqu'avec un code similaire je souhaite importer une seule image, cela fonctionne.
Cependant dès que je mets le 'INSERT INTO' dans la boucle foreach, cela ne fonctionne pas.


Voici le code que j'ai, sachant que les fonctions postImagesToDimensions() et postThumbToDimensions() sont deux fonctions me permettant d'importer l'image sur le serveur, de les redimentionner, les compresser et les renommer en 001.jpg, 002.jpg etc... De plus elles me retournent le chemin du fichier image, chemin qui est sensé lui aussi s'importer dans l'une des colonnes de ma BDD.

            <form method="post" id="form-ajout" enctype="multipart/form-data">
                <div>
                    <label for="nom_album">Nom de l'album</label><br>
                    <input type="text" name="nom_album" id="nom_album"><br>
                    <label for="date_photos"><strong>Date des photos</strong></label><br>
                    <input type="date" name="date_photos" id="date_photos"><br>
                    <label for="photos_album">Choisir des images</label><br>
                    <input type="file" name="photos_album[]" multiple accept="image/png, image/jpeg"><br>
                </div>
                <div class="ajouter_button">
                    <input type="submit" name="ajouter_album" id="ajouter_album" value="Ajouter">
                </div>
            </form>


<?php
if(!empty($_POST['ajouter_album'])){
    if(isset($_POST['nom_album'], $_POST['date_photos']) && !empty($_POST['nom_album']) && !empty($_POST['date_photos'])){
        foreach($_FILES['photos_album']['tmp_name'] as $key=>$tmp_name){
            $nom_album = htmlspecialchars(strip_tags($_POST['nom_album']));            
            $date_album_sql = $_POST['date_photos'];
            $date_album = date('Y.m.d', strtotime($_POST['date_photos']));
            $path = 'img/galeries/'.$date_album.'/';
            $path_min = $path.'min/';
            if(!is_dir($path)) mkdir($path);   
            if(!is_dir($path_min)) mkdir($path_min);
            postImagesToDimensions('photos_album', str_pad($key, 3, 0, STR_PAD_LEFT).'.jpg', $path, '1920', '1280', $key);
            postThumbToDimensions('photos_album', 'min_'.str_pad($key, 3, 0, STR_PAD_LEFT).'.jpg', $path_min, '300', '200', $key);
            $photo = postImagesToDimensions('photos_album', str_pad($key, 3, 0, STR_PAD_LEFT).'.jpg', $path, '1980', '1280', $key);
            $photo_min = postThumbToDimensions('photos_album', 'min_'.str_pad($key, 3, 0, STR_PAD_LEFT).'.jpg', $path_min, '300', '200', $key);
            $sql_photos = "INSERT INTO `photos` (`album`, `date_album`, `photo`, `photo_min`)
                           VALUES (:album, :date_album, :photo, :photo_min)";
            $query_photo = $db->prepare($sql_photo);
            $query_photo->bindValue(":album", $nom_album, PDO::PARAM_STR);
            $query_photo->bindValue(":date_album", $date_album_sql, PDO::PARAM_STR);
            $query_photo->bindValue(":photo", $photo, PDO::PARAM_STR);
            $query_photo->bindValue(":photo_min", $photo_min, PDO::PARAM_STR);
        }
        if(!$query_photo->execute()){
            echo '<script language="javascript">';
            echo 'alert("Erreur d\'insertion dans la base de données !")';
            echo '</script>';
        } else{
            echo '<script language="javascript">';
            echo 'alert("Album photos ajouté !")';
            echo '</script>';
        }
    
    } else {
        echo '<script language="javascript">';
        echo 'alert("Le formulaire est incomplet !")';
        echo '</script>';
    }
}
?>




Je vous remercie beaucoup par avance pour vos lumières !!

Si besoin, les fonctions précédemment expliquées :
function postImagesToDimensions($name_form, $new_name, $path, $new_width, $new_height, $i){ 
    $image_tmp = $_FILES[$name_form]['tmp_name'][$i];
    $image_dest = $path.$new_name;
    copy($image_tmp, $image_dest);
    $save = $image_dest;
    $file = $image_dest;
    list($width, $height) = getimagesize($file);
    $ratio = $width / $height;
    $new_ratio = $new_width/$new_height;
        if($ratio <= $new_ratio){
            $new_height = $new_width/$ratio;
        }else{
            $new_width = $ratio*$new_height;
        }
    $tn = imagecreatetruecolor($new_width, $new_height);
    $info = getimagesize($image_dest);
        if ($info['mime'] == 'image/jpeg'){
        $image = imagecreatefromjpeg($file);
        }elseif ($info['mime'] == 'image/gif'){
        $image = imagecreatefromgif($file);
        }elseif ($info['mime'] == 'image/png'){
        $image = imagecreatefrompng($file);
        }
    imagecopyresampled($tn, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    imagejpeg($tn, $save, 80);
    return $image_dest;
};

function postThumbToDimensions($name_form, $new_name, $path, $new_width, $new_height, $i){ 
    $image_tmp = $_FILES[$name_form]['tmp_name'][$i];
    $image_dest_min = $path.$new_name;
    move_uploaded_file($image_tmp, $image_dest_min);
    $save = $image_dest_min;
    $file = $image_dest_min;
    list($width, $height) = getimagesize($file);
    $ratio = $width / $height;
    $new_ratio = $new_width/$new_height;
        if($ratio <= $new_ratio){
            $new_height = $new_width/$ratio;
        }else{
            $new_width = $ratio*$new_height;
        }
    $tn = imagecreatetruecolor($new_width, $new_height);
    $info = getimagesize($image_dest_min);
        if ($info['mime'] == 'image/jpeg'){
        $image_min = imagecreatefromjpeg($file);
        }elseif ($info['mime'] == 'image/gif'){
        $image_min = imagecreatefromgif($file);
        }elseif ($info['mime'] == 'image/png'){
        $image_min = imagecreatefrompng($file);
        }
    imagecopyresampled($tn, $image_min, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    imagejpeg($tn, $save, 80);
    return $image_dest_min;
};







Configuration: Windows / Chrome 102.0.0.0
A voir également:

4 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
25 juin 2022 à 20:22
Bonjour,

Déjà, il est fortement déconseillé de stocker des images directement en bdd...
A la place, on les stocke dans un dossier du serveur et on ne met en bdd que le chemin vers le fichier.

(pourquoi ? parce qu'en général, la taille d'une bdd est beaucoup plus limitée que celle du "disque dur" et que cela risque d'impacter le fonctionnement de la bdd en l'alourdissant inutilement..)

Ensuite...
ça ne marche pas... c'est à dire ? tu as ton message d'erreur qui s'affiche ?

Les images s'uploadent bien sur le serveur ? ( tu as vérifié ? )
et puis.. Il faudrait activer l'affichage des erreurs PDO au cas où ça serait un souci de requête
( pour ça, il faut activer cette gestion des erreurs dans la connexion à la bdd ET mettre CHAQUE requête dans un bloc TRY/CATCH : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs)



1
lucanne212274 Messages postés 9 Date d'inscription samedi 30 octobre 2021 Statut Membre Dernière intervention 27 juin 2022
27 juin 2022 à 16:28
Bonjour Jordane,


Tout d'abord merci pour ta réponse.
En effet il était évident que je n'importais pas directement les images dans la base de données mais uniquement les chemins. La colonne "photo" de la BDD contiendra les chemins de l'image, et la colonne "photo_min" contiendra le chemin de la miniature.

Les images s'uploadent correctement sur le serveur (image grandes et miniatures) sans aucun soucis, elles apparaissent bien dans les bons formats dans les dossiers prévus.

Le problème vient pour l'insertion dans la base de données.

L'erreur PDO qui s'affiche est la suivante :

"undefined variable: sql_photos at line 18"
(j'ai adapté le n° de ligne en fonction du code plus haut, dans le deuxième bloc de code).
$query_photo = $db->prepare($sql_photo);


Pourtant j'ai vérifié plusieurs fois les données dans INSERT INTO, les noms semblent être les bons.

une idée ? Merci beaucoup
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
27 juin 2022 à 16:46
normal .. regarde le nom de ta variable à la ligne d'avant .... il te manque un S
1
lucanne212274 Messages postés 9 Date d'inscription samedi 30 octobre 2021 Statut Membre Dernière intervention 27 juin 2022
27 juin 2022 à 19:31
Que la honte soit sur moi !!
En effet c'est bien ça. Merci beaucoup !
Parfois on cherche des erreurs tellement partout que l'on ne voit pas celle qui est grosse comme le nez au milieu de la figure.
J'ai donc bien rajouté le "s" et je n'ai plus d'erreur PDO.

Par contre, cela m'amène à un nouveau souci, seule la dernière image est insérée dans la base de donnés, les autres n'apparaissent pas sur PhpmyAdmin. Malgré le fait que le INSERT INTO soit dans la boucle foreach.
Alors que toutes sont bien créées sur le serveur.

Si jamais je peux abuser une dernière fois de vos lumières... Encore mille mercis !

0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
27 juin 2022 à 20:01
Tu ne fais l'eecute qu'une seule fois en dehors de ta boucle... donc il ne prend que la dernière..

Voici le code revu et corrigé
<?php

if (!empty($_POST['ajouter_album'])) {
  //récupération PROPRE des variables AVANT de les utiliser
  $nom_album = !empty($_POST['nom_album']) ? htmlspecialchars(strip_tags(trim($_POST['nom_album']))) : null;
  $date_photos = !empty($_POST['date_photos']) ? trim($_POST['date_photos']) : null;
  $photos_album = !empty($_FILES['photos_album']) ? $_FILES['photos_album'] : null;

  if ($nom_album && $date_photos) {
    // Pas besoin de mettre ça dans la boucle...

    $date_album = date('Y.m.d', strtotime($date_photos));
    $path = 'img/galeries/' . $date_album . '/';
    $path_min = $path . 'min/';
    if (!is_dir($path))
      mkdir($path);
    if (!is_dir($path_min))
      mkdir($path_min);



    foreach ($photos_album['tmp_name'] as $key => $tmp_name) {

      postImagesToDimensions('photos_album', str_pad($key, 3, 0, STR_PAD_LEFT) . '.jpg', $path, '1920', '1280', $key);
      postThumbToDimensions('photos_album', 'min_' . str_pad($key, 3, 0, STR_PAD_LEFT) . '.jpg', $path_min, '300', '200', $key);
      $photo = postImagesToDimensions('photos_album', str_pad($key, 3, 0, STR_PAD_LEFT) . '.jpg', $path, '1980', '1280', $key);
      $photo_min = postThumbToDimensions('photos_album', 'min_' . str_pad($key, 3, 0, STR_PAD_LEFT) . '.jpg', $path_min, '300', '200', $key);

      try {
        $sql = "INSERT INTO `photos` 
                      (`album`, `date_album`, `photo`, `photo_min`)
                       VALUES (:album, :date_album, :photo, :photo_min)";
        $query_photo = $db->prepare($sql);
        $query_photo->bindValue(":album", $nom_album, PDO::PARAM_STR);
        $query_photo->bindValue(":date_album", $date_album_sql, PDO::PARAM_STR);
        $query_photo->bindValue(":photo", $photo, PDO::PARAM_STR);
        $query_photo->bindValue(":photo_min", $photo_min, PDO::PARAM_STR);
        $query_photo->execute();
      } catch (Exception $e) {
        // echo "Erreur : " . $e->getMessage(); // Pour savoir quelle est l'erreur...
        echo '<script language="javascript">';
        echo 'alert("Erreur d\'insertion dans la base de données !")';
        echo '</script>';
        exit;
      }
    }

    echo '<script language="javascript">';
    echo 'alert("Album photos ajouté !")';
    echo '</script>';
    
  } else {
    echo '<script language="javascript">';
    echo 'alert("Le formulaire est incomplet !")';
    echo '</script>';
  }
}
?>
0
lucanne212274 Messages postés 9 Date d'inscription samedi 30 octobre 2021 Statut Membre Dernière intervention 27 juin 2022
27 juin 2022 à 20:13
Un immense merci,

Cela fonctionne désormais !

Merci de votre précieuse aide et de votre précieux temps !
0