Renommer une image selon une id produit

Fermé
yvesman - 28 oct. 2021 à 11:21
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 - 3 nov. 2021 à 10:24
Bonjour,

j'ai un script permettant d'importer une image

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <meta name='viewport' content='width=device-width, initial-scale=1'>

    </head>
<body>
    <h2>Ajouter une image</h2>
    <form action='image.php' method='POST' enctype='multipart/form-data'>
    
        <label for='file'>Fichier</label>
        <input type='file' name='file'>

        <button type='submit'>Enregistrer</button>
    </form>
    

    <?php
    
    //insertion de l'image

include("db_connect_BDO.php");

if(isset($_FILES['file'])){
    $tmpName = $_FILES['file']['tmp_name']; echo 'tmpname : ' ; echo  $tmpName ;  echo'<br/>';
    $name = $_FILES['file']['name'];        echo 'name : ' ;    echo  $name ;     echo  '<br/>';
    $size = $_FILES['file']['size'];        echo 'size : ' ;    echo  $size ;     echo'<br/>';
    $error = $_FILES['file']['error'];      echo 'error : ' ;   echo  $error ;    echo '<br/>';

    $tabExtension = explode('.', $name);
    $extension = strtolower(end($tabExtension));

   
    $maxSize = 500000;

   if(in_array($extension, $extensions)  && $error == 0){
/*
 require_once("db_connect_mysqli.php");
 $sql = "SELECT * FROM produits";
 $i='1';
 $extensions = ['jpg', 'png', 'jpeg', 'gif'];
 $result = mysqli_query($conn, $sql);
 $name = $_FILES['file']['name'];  
 $realname= $row['name'] where $id =$i.".".$extension; 
 $i++
 move_uploaded_file($name, './upload/'.$realname);
 */
 
        $uniqueName = uniqid('', true);
        //uniqid génère quelque chose comme ca : 5f586bf96dcd38.73540086
       $file = $uniqueName.".".$extension;
        //$file = 5f586bf96dcd38.73540086.jpg

        move_uploaded_file($tmpName, './upload/'.$realname);
    } // fin in-array
        
    
$data = [
    'name' => $file
];
$sql = "INSERT INTO file (name) VALUES (:name)";
$stmt= $conn->prepare($sql);
$stmt->execute($data);
}else echo 'nada' ; // fin isset
?>

    <h2>Mes images</h2>
    
    <?php 
    
    //sortie de l'image 
    
        $req = $conn->query('SELECT name FROM file');
        while($data = $req->fetch()){
 echo "<img src='./upload/".$data['name']."' width='300px' ><br>";
        }
    ?>
</body>
</html>


un autre insere le contenu d'un fichier csv dans un bdd

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//Connexion à la bdd ( en PDO )
require_once("db_connect_BDO.php");
if (isset($_POST["import"])) {
		var_dump($_POST["import"]);
$filename = $_FILES["file"]["tmp_name"];

//$filename = 'amazon-fours.csv';

// Open the file for reading
if (($h = fopen("{$filename}", "r")) !== FALSE) {
// Each line in the file is converted into an individual array that we call $row
// The items of the array are comma separated

  while (($row = fgetcsv($h, 0, ",")) !== FALSE) {

    //Si l'insert ne fonctionne toujours pas, merci de décommenter les lignes ci-dessous et de nous montrer ce que ça donne
    // echo '<br>';
     //print_r($row);
    
    //données contenues dans la ligne du fichier csv  
    $datas = [
        ':name' => !empty($row[2]) ? $row[2] : "",
       /* ':description' => !empty($row[1]) ? $row[1] : "",*/
        ':price' => !empty($row[3]) ? $row[3] : "",
    ];

    $sql = "INSERT INTO produits (name,price)  VALUES (:name,:price)";
    //Execution de la requete
    
    try {
      $requete = $conn->prepare($sql);
      $requete->execute($datas);
    } catch (Exception $e) {
      // en cas d'erreur :
      echo "<br>Erreur ! " . $e->getMessage();
      echo "<br>Les datas :<br>";
      print_r($datas);
      exit;
    }
  }
}
}
header('Location: insert_sql.php');
 // exit;
?>


le but de votre mission ( si vous l'acceptez) est de renommer l'image au moment de l'upload par les 20 premiers caracteres du nom du produit extrait de la csv ( pour eviter de surcharger la bdd d'infos inutiles car le 'nom du produit' contient en realite toute la description) et afficher l'image qui correspond au nom du produit

Bonne chance !
A voir également:

12 réponses

jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
Modifié le 28 oct. 2021 à 11:49
Ce n'est pas possible...
Tu n'as aucun "lien" entre ton formulaire d'upload et ton csv ....


On va voir le souci autrement....
Il faudrait, dans ce formulaire, pouvoir choisir le produit auquel associer l'image....
Tu pourrais, par exemple, proposer la liste des produits (dans un select ) dans ton formulaire...

Et puis... tu insères déjà le nom de l'image en BDD .. donc il faudrait simplement ajouter un champ à ta table pour y contenir l'id du produit concerné..

PS: prends l'habitude de mettre ton PHP ... AVANT ton html....

Bref..
ça pourrait donner un truc du genre
<?php
require_once("db_connect_BDO.php");

//------------------------------------------------//
//------------ FONCTIONS -----------------//
//------------------------------------------------//

function uploadImg(){
  $extensions = ['jpg', 'jpeg', 'png', 'gif', 'tif', 'bmp'];
  if (isset($_FILES['file'])) {
    $tmpName = $_FILES['file']['tmp_name'];
    $name = $_FILES['file']['name'];
    $size = $_FILES['file']['size'];
    $error = $_FILES['file']['error'];

    $tabExtension = explode('.', $name);
    $extension = strtolower(end($tabExtension));

    $maxSize = 500000;

    if (in_array($extension, $extensions) && $error == 0) {
      $uniqueName = uniqid('', true);
      //uniqid génère quelque chose comme ca : 5f586bf96dcd38.73540086
      $file = $uniqueName . "." . $extension;
      //$file = 5f586bf96dcd38.73540086.jpg

      if (!move_uploaded_file($tmpName, './upload/' . $file)) {
        echo "Erreur lors de l'upload de l'image sur le serveur ..";
        exit;
      }
      return $file;
    } // fin in-array
  }
}

function insertImgBdd($fileName, $product_id) {
  global $conn;

  $sql = "INSERT INTO file (name,product_id) VALUES (:name,:id)";
  $data = [
      ':name' => $fileName
      , ':product_id' => $product_id
  ];

  $stmt = $conn->prepare($sql);
  $stmt->execute($data);
}

/**
 * Retourne la lite des produits
 * @return array
 */
function getProductList(){
  global $conn;
  $sql = "SELECT * FROM produits";
  try {
    $stmt = $conn->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(); // stocke le résultat de la requête dans un array
  } catch (Exception $e) {
    echo "Erreur dans la requête " . $e->getMessage();
  }
}

//------------------------------------------------//
//------------ DEBUT DU TRAITEMNT  -----------------//
//------------------------------------------------//
//liste des produits
$arrProducts = getProductList();

//traitement du formulaire..
if (isset($_POST['produit'])) {

  $product_id = !empty($_POST['produit']) ? $_POST['produit'] : NULL;
  if ($product_id) {
    $img = uploadImg(); //on upload l'image sur le serveur
    insertImgBdd($img, $product_id); // on insere le nom de l'image en BDD et on l'associe au produit selectionné
  }
}
?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <title>Image produit</title>
  </head>
  <body>
    <h2>Ajouter une image</h2>
    <form action='image.php' method='POST' enctype='multipart/form-data'>
      <lable for="produit">Produit</label><!-- comment -->
        <select name="produit" id="produit"><!-- comment -->
          <?php
          foreach ($arrProducts as $P) {
            echo "<option value='" . $P['id'] . "'>" . $P['name'] . "</option>";
          }
          ?>
        </select>
        <br>
        <label for='file'>Fichier</label>
        <input type='file' name='file'>

        <button type='submit'>Enregistrer</button>
    </form>


    <h2>Mes images</h2>

    <?php
//sortie de l'image 
    if ($img) {
      echo "<img src='./upload/" . $img . "' width='300px' ><br>";
    }
    ?>
  </body>
</html>



PS²: je t'invite à prendre connaissance de ce qui est marqué ici
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
Histoire que tes codes soient un peu moins brouillons..



0
l'idée est interessante mais n'y aurait il pas moyen d'automatiser l'action pour pas a avoir enregistrer image par image ( ce qui prendrait un temps monstre)

par contre ton script genere une erreur :

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/......./domains/........../public_html/image2.php:46
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
28 oct. 2021 à 13:23
Ligne 42, le nom de la variable n'est pas le bon.
Ie faut le remplacer par :id

Pour ce qui est de l'automatiser... Il faudrait déjà savoir comment tu accède à ce formulaire.
As-tu un moyen de savoir pour quel produit tu veux uploader la photo ??

Dis voir, as-tu réfléchi à la conception de tes pages avant de te mettre à coder ???
C'est un minimum....
0
j'ai modifie le code :

 
function uploadImg(){
   $extensions = ['jpg', 'jpeg', 'png', 'gif', 'tif', 'bmp'];
   $name = $_FILES['file']['name'];
   $tabExtension = explode('.', $name);
   $extension = strtolower(end($tabExtension));
   $product_id = !empty($_POST['produit']) ? $_POST['produit'] : NULL;
   $file = $product_id . "." . $extension;
   //if (!move_uploaded_file($name,'./upload/'.$file))
   if (!move_uploaded_file($name, './upload/' . $file))
   {
      echo "Erreur lors de l'upload de l'image sur le serveur ..";
      echo '<br/>' ;
      echo 'extension :<br/>' ;
      echo $extension,'<br/>';
      echo 'name :<br/>' ;
      echo $name,'<br/>';
      echo 'product_id :<br/>' ;
      echo $product_id,'<br/>';
      echo 'file :<br/>' ;
      echo $file,'<br/>';
      exit;
    } //fin if move   
} //fin function


pour enregistrer le nom de l'image du meme nom qui sors dans le label
mais quand je lance function uploadImg j'ai le message d'erreur en echo

 echo "Erreur lors de l'upload de l'image sur le serveur ..";

pourtant tout les echos reviennent remplis

EDIT : correction des balises de code ( encore !! ) => Ajout du LANGAGE pour avoir la coloration syntaxique
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
2 nov. 2021 à 17:08
Et la suite du message d'erreur ??
ça serait utile de savoir ce que contiennent les différentes variables...
0
voila ce que j'ai en retour

extension :
jpg
name :
1633470487-117-image.jpg
product_id :
Four encastrable pyrolyse Whirlpool AKZ9629IX - Four pyrolyse Inox - multifonction - Chaleur tournante ou pulsée - 73 litres - Porte froide (4 vitres) - Classe énergétique A+
file :
Four encastrable pyrolyse Whirlpool AKZ9629IX - Four pyrolyse Inox - multifonction - Chaleur tournante ou pulsée - 73 litres - Porte froide (4 vitres) - Classe énergétique A+.jpg
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
2 nov. 2021 à 17:50
heu... tu ne penses pas que pour un id .... Four encastrable pyrolyse Whirlpool AKZ9629IX - Four pyrolyse Inox - multifonction - Chaleur tournante ou pulsée - 73 litres - Porte froide (4 vitres) - Classe énergétique A+ ça ne soit un peu (juste un peu...) trop long ????
Et en plus.. avec des caractères spéciaux, des parenthèses, des "plus" ...

un ID ( id veut dire IDENTIFIANT ) .. faut que ça reste UNIQUE .. mais relativement "court" ...
il me semble, que dans les exemple que je t'avais déjà donné.. j'utilisai le champ " ID " de ta bdd ( champ NUMERIQUE ) et non le "LIBELLE" du produit...

Faut pas oublier non plus que, selon l'OS sur lequel tourne ton site web (le serveur qui héberge tes pages) tu peux avoir des limitations dans le nombre de caractères autorisés pour le chemin complet d'un fichier ... ( sur windows ça doit tourner autour de 256 caractères (du moins sur les anciens windows))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
c'est vrai que c'est long mais c'est necessaire car a l'affichage de l'image je vais aller rechercher le nom du produit et le comparer au nom de l'image pour faire apparaitre l'image correspondant au nom
je n'utilise pas la bdd dans cette partie ormis pour chercher le nom des produits et la mettre dans le label
les noms sont inscrit dans une bdd avec un autre script
j'ai limite le nombre de caractere avec un substr mais ca ne change pas grand chose
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
2 nov. 2021 à 19:00
Tu pourras comparer de la même facon avec l'id du produit...

Et puis.. je ne comprends vraiment pas pourquoi tu te refuses à utiliser la bdd... Surtout que tu stockes déjà le nom de l'image dans la base .
A un moment va falloir arrêter de s'entêter et essayer de revoir un minimum la conception de tes pages...
Sinon tu vas faire une usine à gaz... Inmaintenable...et bourrée de bugs et de.. malfaçons
0
parce que j'extraie les noms directement d'un fichier csv

je vais avoir beaucoup de donnees a traiter c'est pourquoi je prefere cette methode

peut on en revenir a mon probleme stp

je gere les galeres au fur et a mesure
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
2 nov. 2021 à 19:22
Enfin bon.. vu que tu insert les produits en bdd ... tu as donc des ID .... je ne vois donc pas où sont les difficultés.
Pour ma part je m'arrête là ..
Parler à un mur .. ça ne m'intéresse pas.

Bonne continuation.
0
entre le nom et l'id je vois pas la difference et dans tout les cas ca ne resoud pas mon probleme
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
Modifié le 2 nov. 2021 à 20:16
Mais si ça résout ton problème...
L'id sera un chiffre très court...
Tu n'attends pas donc pas la limitation éventuelle dans le nombre de caractères possible pour le chemin du fichier.
Ça évitera également qu'il y a des caractères spéciaux
Enfin bon je vais pas me répéter tu n'as qu'à relire l'ensemble des messages que nous avons déjà échangé pour comprendre.
Je ne peux pas comprendre à ta place il va falloir que tu fasses des efforts
0
j'ai deja resolu ce probleme avec substr
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
2 nov. 2021 à 20:17
Si tu le dis....
En espérant pour toi que tu n'auras pas des produits ayant un nom plus ou moins proche et donc que tu risques d'avoir les même caractère si tu fais du substring...
0
en mettant 45 caracteres ya peu de chances

pour mon probleme tu vois, une soluc concretement ?
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
2 nov. 2021 à 20:49
Ah ben ça des solutions j'en vois ...mais comme tu ne veux pas m'écouter tant pis pour toi ..
En plus, je t'ai posé des questions auxquelles tu n'as jamais répondu...
Bref... Comme je te l'ai dit ....j'arrête là. bonne soirée.
0
a part de parler de l'id desole t'as pas apporte de vrai soluc

quelle question ?
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
2 nov. 2021 à 22:10
Dans ta précédente discussion je t'ai demandé :


Reprenons ...
A quel moment fais tu l'upload de ton image ?
Via un formulaire ?
Ce formulaire contient quels champs ?
Il est appelé dans quel fichier ?
Est-ce que le formulaire est lié à un produit ?


De plus, dans ton code, tu insères déjà le nom de l'image en bdd
$sql = "INSERT INTO file (name) VALUES (:name)";

Je t'ai donc demandé à plusieurs reprises.. pourquoi ne pas insérer en même temps l' ID du produit ....
ça aussi.. tu ne m'as toujours pas répondu...


Donc ...
Commence par nous expliquer en DETAILS ( sans oublier de donner le nom des différents fichiers concernés) le CHEMINEMENT de ton programme...
Voici le début .. je te laisse compléter ( Et répondre à mes précédentes questions)
Etape 1 : Import d'une liste de produit depuis un fichier CSV via le script se trouvant dans le fichier ...... .php
Etape 2 : ... ??
0
A quel moment fais tu l'upload de ton image ?
en 4eme position apres avoir transfere le contenu de la csv sur la bdd
Via un formulaire ?
oui celui que tu as fourni mais sans la partie bdd qui ne sers a rien vu que les donnees sont deja uploadees
je n'ai garde que ce qui concerne la completion du label, le renommage des images et l'upload des images
toutes ce parties marchent correctement ( sauf l'upload ) car j'ai bien toutes les variables necessaires
Ce formulaire contient quels champs ?
celui que tu as cree si dessus
Il est appelé dans quel fichier ?

dans image.php
Est-ce que le formulaire est lié à un produit ?
pas pour le moment mais il le sera plus tard ( il suffira de changer le nom du dossier)
De plus, dans ton code, tu insères déjà le nom de l'image en bdd
non c'est le contenu de la csv qui est telecharge
Je t'ai donc demandé à plusieurs reprises.. pourquoi ne pas insérer en même temps l' ID du produit ....
l'id ne m'est d'aucune utilite il est juste genere par la bdd
la bdd comprend 4 champs :
-id
-name
-prix
lien
Commence par nous expliquer en DETAILS ( sans oublier de donner le nom des différents fichiers concernés) le CHEMINEMENT de ton programme...

1) je telecharge les donnes du site sur un csv avec un script sur le navigateur
2) je telecharge les photos avec le meme script
3) j'envoie les donnes de la csv sur la bdd avec import_csv.php (operationnel )
4) j'uploade les images sur le server avec image.php
5) je fais apparaitre les donnees de la bdd sur ma page article.php
6) je fais apparaitre les images sur la page en verifiant qu ils correspondent aux donnees

resultat final : une page article avec les photos des article et en dessous le nom ( comprenant la description ) et le prix (une par table, 4 table par ligne horizontale sur 8 lignes par pages )

etant donne le grand nombre de donnees j'essaye d'automatiser au max la procedure d'ou la methode choisie

le probleme dans l'immediat est que je ne peux pas upload les images
j'en ai d'autre mais je gere au fur et a mesure

j'espere avoir repondu a ttes tes questions
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670
3 nov. 2021 à 00:13
Alors

De plus, dans ton code, tu insères déjà le nom de l'image en bdd
non c'est le contenu de la csv qui est telecharge

Alors NON .... En plus de la requête que tu utilises pour insérer les données du CSV dans la BDD ... tu as (ou du moins.. avais) une requête pour INSERER le chemin de l'image dans la base.... dans la table "file" ( ce n'est pas moi qui l'invente.. c'est dans le code que tu as donné dans ton premier post )
A croire que ce n'est pas toi qui a écrit ce code... tu ne sais même pas ce qu'il fait...


Je t'ai donc demandé à plusieurs reprises.. pourquoi ne pas insérer en même temps l' ID du produit ....
l'id ne m'est d'aucune utilite il est juste genere par la bdd

Alors là aussi je vais dire non.....
L'ID n'est pas inutile ... bien au contraire... et c'est ce que j'essai de t'expliquer depuis le début...
Dis voir... tu sais ce qu'est une base de données relationnelle et comment c'est sensé fonctionner ?? Je pense que non vu que depuis le début tu m'envoies bouler quand je te parle d'id ...


Tu fais parti des nombreux débutants qui se lancent dans l'écriture d'un code sans connaitre le minimum requis sur le fonctionnement des langages qu'ils utilisent...
C'est bien dommage... et c'est surtout un frein énorme pour réussir à coder correctement quelque chose...
Je ne saurais te conseiller d'aller suivre des tutos sur le fonctionnement de php et de mysql... tu sembles être passé à côté de beaucoup de choses.

Donc cette fois j'abandonne pour de bon.
Du moins.. tant que tu n'auras pas compris l'utilité de ton champ ID et l'avantage de stocker en bdd l'image ET l'id produit qui lui est rattaché..

Tchao..

0
tout ca pour ca
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670 > yvesman
3 nov. 2021 à 10:19
Tiens..
juste pour le souci d'upload...
Vérifie que le répertoire de destination existe et que tu as bien les droit en écriture dessus
pour ça, voici les trois fonctions à utiliser :
https://www.php.net/manual/fr/function.realpath.php
https://www.php.net/manual/fr/function.is-dir.php
https://www.php.net/manual/fr/function.is-writable.php
0
jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024 4 670 > jordane45 Messages postés 38183 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 mai 2024
3 nov. 2021 à 10:24
Ah.. et puis.. c'est le tmp_name et non le name qu'il faut utiliser en premier paramètre de la fonction move_uploaded_file....
0