Problème d'insertion en db de fichiers renommés

Fermé
Select - 28 sept. 2020 à 18:56
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 29 sept. 2020 à 23:21
Bonjour,


Voici mon code :


$product_id = mysqli_stmt_insert_id($stmt);   
							       
$select = $con->prepare("SELECT product_images FROM products WHERE product_id = ?");
$select->bind_param('i', $product_id);
$select->execute();
$result = $select->get_result();  
                                
$row = $result->fetch_array();
$old_file_names =  $row['product_images']; 								   
$exploded = explode(", ",$old_file_names);								   

foreach ($exploded as $v)
{									   
	 $current_filename1 = str_replace(","," ", $v);// On vire les virgules qui séparent chaque fichier
	 $current_filename = trim($current_filename1); 
	 $without_extension = pathinfo($current_filename, PATHINFO_FILENAME);   // titre de l'image, sans path
	 $ext = substr($current_filename, strrpos($current_filename, '.')+1); 
	 $path = "product_images/";
	 $new_filename = $path.$without_extension.'_ref_'.$product_id.'.'.$ext;
									   
	 rename($current_filename,$new_filename);	
     $new=""; 
	 $new .= $new_filename.', ';				
     echo $new; 			

   // + update de la base de données, sur le nouveau nom des fichiers	 									 
}  


En faisant ceci, mes 2 fichiers uploadés simultanément sont correctement renommés et aussi renommés en base, sauf qu' 1 faux fichier inexistant est rajouté dans la base, comme ceci :
product_images/n1_ref_140.jpg, // Yes ok
product_images/n2_ref_140.jpg, // Yes ok
product_images/_ref_140., // Grrrrr mais pourquoi ?!!!!!!

Ce qui me génère un Warning: rename(,product_images/_ref_140.): Paramètre incorrect. (code: 87)


Comment corriger cela SVP ? Merci bcp.
A voir également:

11 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 28 sept. 2020 à 19:08
bonjour, je suppose que tu as affiché la valeur de $old_file_names: peux-tu la partager avec nous?

EDIT: je suppose que, de même, tu as affiché la valeur de $exploded.
0
Bonsoir :)

Oui bien sûr, je les ai affichées, puisqu'ensuite j'ai rajouté des trim et des str_replace sur les virgules de $old_file_names. Je ne les ai pas incluses parce que justement mes fichiers sont renommés correctement.
Mais les voici :

$old_file_names = product_images/n1.jpg, product_images/n2.jpg,
$exploded = Array
$new = product_images/n1_ref_141.jpg, product_images/n2_ref_141.jpg, product_images/_ref_141.,

Sur exploded, j'ai un array to string conversion. Mais avant de faire un explode, j'avais marqué if (is_array($row['product_images'])) {}else { } et ça allait directement dans else. Donc je ne sais plus comment faire.
J'ai testé je ne sais pas combien de solutions, mais 1 a du m'échapper...

Merci
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Select
28 sept. 2020 à 20:10
j'ai l'impression que tu ne nous montres pas la réponse complète de
print_r($exploded);
0
Select > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
28 sept. 2020 à 23:37
"j'ai l'impression que tu ne nous montres pas la réponse complète de print_r($exploded);"

:D mdr... si t'es sérieux ou sérieuse.... J'ai fait un echo de $exploded, et ça m'a donné ce que j'ai indiqué. si si, et je montre tout, promis. lol en quoi tricher m'aiderait ? // Mon but est d'avancer le + vite possible, pas de perdre du temps bêtement...
Je repasse demain matin avec un print_r... Ca fait plusieurs années que j'avais pas spécialement codé donc j'ai perdu quelques réflexes, mais......
Bon à demain, si vous le voulez bien :)
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Select
29 sept. 2020 à 00:51
testes le code que je t'ai donné ICI
des var_dump nous seront plus utiles qu'un print_r ou des echos....
ça devrait, à minima nous donner les informations nécessaires pour t'aider... au mieux, ça résoudra ton souci.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Select
29 sept. 2020 à 09:45
à lire, à faire, avant de faire appel:
https://www.commentcamarche.net/faq/3158-php-methodes-de-debogage
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
28 sept. 2020 à 20:55
Bonjour,

Commence par retirer l'espace que tu as au niveau du delimiter de ton explode.
Et fais nous un vard_dump de tes deux variables et montre nous ce que ça te retourne
$old_file_names =  !empty($row['product_images']) ? $row['product_images'] : null; 								   
var_dump($old_file_names);
$exploded = !empty($old_file_names) && is_string($old_file_names) ? explode("," , $old_file_names) : array();	
var_dump($exploded );

0
Bonjour :)

@Jordane, ok pour la page https://www.commentcamarche.net/faq/3158-php-methodes-de-debogage - Merci :)
Désormais je ne ferais plus que des var_dump. J'avais oublié...

Avec ce tronçon de code,
$old_file_names =  !empty($row['product_images']) ? $row['product_images'] : null; 								   
var_dump($old_file_names);
$exploded = !empty($old_file_names) && is_string($old_file_names) ? explode("," , $old_file_names) : array();	
var_dump($exploded );


j'obtiens :

$old_file_names : F:\bureau\www\Webmaster\ecommerce\admin_area\insert_product.php:598:string 'product_images/n1.jpg, product_images/n2.jpg, ' (length=46)

$exploded :
F:\bureau\www\Webmaster\ecommerce\admin_area\insert_product.php:600:
array (size=3)
0 => string 'product_images/n1.jpg' (length=21)
1 => string ' product_images/n2.jpg' (length=22)
2 => string ' ' (length=1)

$new :
F:\bureau\www\Webmaster\ecommerce\admin_area\insert_product.php:613:string 'product_images/n1_ref_143.jpg, ' (length=31)
F:\bureau\www\Webmaster\ecommerce\admin_area\insert_product.php:613:string 'product_images/n2_ref_143.jpg, ' (length=31)
F:\bureau\www\Webmaster\ecommerce\admin_area\insert_product.php:613:string 'product_images/_ref_143., ' (length=26)
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
29 sept. 2020 à 12:53
comprends-tu maintenant d'où vient ton soucis?
quelle est la première anomalie que tu observes?
0
Select > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
29 sept. 2020 à 13:05
Je vois qu'un espace est interprété en tant que string ou object d'un array. et c'est pour ça que j'avais mis un trim sur $current_filename = trim($current_filename1); pensant que ça allait supprimer les espaces non désirés.

$exploded = explode(",",trim($old_file_names)); Le problème persiste.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 sept. 2020 à 12:57
Comme tu peux le voir, $old_file_names contient une virgule en trop à la fin
Ca te généré donc une valeur supplémentaires dans ton explode...
0
Donc, "l'idée" serait de mettre un trim au moment de l'insertion, pas de l'update, très certainement ? Je pense que ça doit être ça... Vais de ce pas tester...
0

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

Posez votre question
Lors de l'insert des noms de fichiers, je viens de tester avec rtrim et aussi ceci : $product_images .= substr($path.$name.', ', 0, -1); mais résultat identique. ... :/
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 sept. 2020 à 13:22
Comme nous n'avons qu'une partie de ton code nous ne savons pas comment tu as créé ta variable old_names....
Si, comme je le pense, tu l'as fait à l'aide d'une boucle.... Alors je te montrerai un moyen plus simple et plus propre...

Au passage, je ne comprends pas non plus pourquoi tu stocks le chemin absolu de te fichiers... seul, le nom du fichier lui-même, suffirait à être inscrit en base de données.

j'ai également l'impression que la structure de ta base de données n'est pas idéale.
Pourrais-tu nous montrer un dump de ta base de données histoire que l'on puisse voir le nom des tables ainsi que le nom des différentes colonnes que tu y as mis... À mon avis il te manque une table pour stocker l'emplacement des fichiers au lieu de tous les mettre dans un seul champ de ta table comme le ferait n'importe quel débutant...
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
29 sept. 2020 à 13:28
au lieu de chipoter ainsi pour supprimer la virgule en trop, il me semble plus clair de ne pas insérer de virgule après chaque élément de la liste.
si la liste est vide, liste=element
sinon, liste = liste + "," + element
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
29 sept. 2020 à 13:34
Il y a encore plus propre.....
J'attends qu'il nous montre son code pour donner la méthode..
0
Select > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
29 sept. 2020 à 13:46
Il ? Non : Elle :)
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
29 sept. 2020 à 14:28
avec implode?
0
Voici mon code de traitement de l'upload & insert des fichiers :


 $fileCount = count($_FILES["product_images"]['name']);
 for ( $i=0; $i < $fileCount; $i++ )
 {
   $path = "product_images/";
   $name = strtolower($_FILES['product_images']['name'][$i]);  
 }   
 
    $product_images ="";
    $valid_formats = array("jpg", "png", "jpeg", "webp");
    $max_file_size = 358400; 
    $path = "product_images/"; // Upload directory
    $count = 0;

     foreach ($_FILES['product_images']['name'] as $f => $name) 
 {     
        if ($_FILES['product_images']['error'][$f] == 4) 
  {
            continue; 
        }          
        if ($_FILES['product_images']['error'][$f] == 0) 
  {              
            if ($_FILES['product_images']['size'][$f] > $max_file_size) 
   {
                $message[] = "$name is too large!.";
                continue; 
            }
            elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) )
   {
                $message[] = "$name is not a valid format";
                continue;  
            }
            else{        
     
                if(move_uploaded_file($_FILES["product_images"]["tmp_name"][$f], $path.$name))
    
               $product_images .= $path.$name.', ';
    //  var_dump($product_images);
      $count++; // Number of successfully uploaded file      
            }
        }



Pour ce qui est du chemin absolu, non il n'est pas stocké en base. En base, j'enregistre uniquement le path relatif : product_images/nom-du-produit_ref_150.jpg

Et dans chaque référence produit, j'ai 1 colonne "product_images", laquelle contient product_images/robe_devant_ref_150.jpg, product_images/robe_derriere_ref_150.jpg, product_images/robe_gros-plan_ref_150.jpg,

Pourquoi cette méthode te semble inappropriée ?
0
Pourquoi cette méthode te semble inappropriée ? de stocker les images produits dans la ref qui lui correspond ?

Par contre, si la robe est déclinée en bleu, en rose, en rouge, là bien sûr, je créé une nouvelle table pour chaque déclinaison.
C'est pas bon ? Moi ça me semblait bien ... :/
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 sept. 2020 à 14:20
Il semble que tu ne maitrise pas vraiment le fonctionnement d'une BDD relationnelle.
Déjà.. on évite de créer des tables supplémentaires une fois le site "terminé".....

A la place, je ferai une table product_media ( #id, id_ref, imagepath )..


Mais bon, si tu veux rester avec ton modèle actuel de bdd ... , voila ton code actuel "amélioré"
<?php

//Initialisation/déclaration des variables/constantes :
$valid_formats = array("jpg", "png", "jpeg", "webp");
$max_file_size = 358400;
$path = "product_images/"; // Upload directory
$arrFilesNames = array();
$message = array();

$phpFileUploadErrors = array(
    0 => 'There is no error, the file uploaded with success',
    1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
    2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3 => 'The uploaded file was only partially uploaded',
    4 => 'No file was uploaded',
    6 => 'Missing a temporary folder',
    7 => 'Failed to write file to disk.',
    8 => 'A PHP extension stopped the file upload.',
);

//récupération propre des variables AVANT de les utiliser :
$file_product_images = !empty($_FILES["product_images"]) ? $_FILES["product_images"] : NULL;
$file_product_images_names = !empty($file_product_images['name']) ? $file_product_images['name'] : NULL;

//On boucle sur les fichiers
if(!empty($file_product_images_names)){
  foreach ($file_product_images_names as $f => $name) {
    $fileError = $file_product_images['error'][$f];
    if(!$fileError){
      $fileSize = $file_product_images['size'][$f];
      if($fileSize > $max_file_size){
        $message[] = "$name is too large!.";
      } else{
        if(!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ) {
          $message[] = "$name is not a valid format";
        }else{
          $tmp_name = $file_product_images["tmp_name"][$f];
          if( move_uploaded_file($tmp_name, $path . strtolower($name))) {
            $arrFilesNames[] = $name; // ou $path.$name  si tu veux absolument stocker le path avec le nom de ton image
          } else {
            $message[] = "$name : Upload error";
          }       
        }
      }
    } else {
      $message[] = !empty($phpFileUploadErrors[$fileError]) ? $phpFileUploadErrors[$fileError] : " Unknown error !";
    }
  }

  // on reconstruit ta chaine en faisant un join sur l'array
  $product_images = !empty($arrFilesNames) ? join(',',$arrFilesNames) : "";
}




Perso... je partirai quand même sur la solution d'une table supplémentaire dans ta bdd pour stocker les images de tes produits...
Une ligne par image/produit dans cette table....
De cette manière.. tu n'auras pas à toucher à la structure de ta bdd en cours de route...
0
Ok. Ce code enregistre dans la base product_images/orange_1.jpgorange_2_ref_185.webp, -
A partir de là, pour splitter les urls avant de renommer les fichiers, il faut... euhhhhhhh

Dans ma base, j'ai des tables qui identifient les différents types de caractéristiques des produits, donc si, je comprends le fonctionnement d'un bdd relationnelle, et chaque déclinaison sera inscrite dans une table "declinaisons", mais pour les images produit, ça ne me semblait pas être une mauvaise pratique. Ceci dit, je vais regarder ça de plus près.
lol de plus, je ne suis pas allée à l'école - j'ai tout appris, à l'arrache peut-être ? grâce à Google. ce qui fait que je peux encore avoir des lacunes, je ne prétends pas le contraire.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 sept. 2020 à 16:50

Ok. Ce code enregistre dans la base product_images/orange_1.jpgorange_2_ref_185.webp, -

Ce n'est pas normal....
Peux tu montrer l'entièreté de ton code ( sans chercher à le découper dans des balises de code..... tout dans une seule balise.... sauf si ce sont dans des fichiers différents... auquel cas tu placeras le contenu de chaque fichier dans des balises distinctes en précisant, pour chaque fichier, le nom de celui-ci )

Et tu peux, remettre un
var_dump($product_images);

et nous montrer ce que ça te retourne.
0
Contemplatrice Messages postés 28 Date d'inscription samedi 16 janvier 2010 Statut Membre Dernière intervention 29 septembre 2020 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
Modifié le 29 sept. 2020 à 21:40
Je disais, avant que mon post ne disparaisse dans le triangle des Bermudes......... que
var_dump($priduct_images); me retourne ce que j'avais indiqué...... soit : 'product_images/pink_3.webppink_4_ref_186.webp, ' .


Tout mon code ? hum..... " " .... ok.
 <div class="form-group" style="margin-top: 50px">                     
                      <label class="col-md-3 control-label"> Product Images </label>                       
                      <div class="col-md-6">                         
                          <input name="product_images[]" type="file"   id="gallery-photo-add" class="form-control"    multiple>   
                          <div id="gallery_uploads"></div>                      
                      </div>                       
                   </div> 
<?php


if(isset($_POST['submit']))
{
  
    $product_variation_colors = "";
 if (!empty ( $_POST['product_variation_colors']))
 $product_variation_colors = implode(",", $_POST['product_variation_colors']);  
 
 $product_attributes = "";
 if (!empty ( $_POST['product_attributes']))
 { $product_attributes = implode(",", $_POST['product_attributes']);
 }
 
 $product_occasions = "";
 if (!empty ( $_POST['product_occasions']))
 $product_occasions = implode(",", $_POST['product_occasions']);
 
 $product_materials = "";
 if (!empty ( $_POST['product_materials']))
 $product_materials = implode(",", $_POST['product_materials']);
  
 
 $created_by =  $_SESSION['admin_name'];
 date_default_timezone_set("Europe/Paris");
    $date = date('Y-m-d h:i:s');
  
   
 
 /*$fileCount = count($_FILES["product_images"]['name']);
 for ( $i=0; $i < $fileCount; $i++ )
 {
   $path = "product_images/";
   $name = strtolower($_FILES['product_images']['name'][$i]);
  
 }   
 
    $product_images ="";
    $valid_formats = array("jpg", "png", "jpeg", "webp");
    $max_file_size = 358400; 
    $path = "product_images/"; // Upload directory
    $count = 0;

     foreach ($_FILES['product_images']['name'] as $f => $name) 
 {     
        if ($_FILES['product_images']['error'][$f] == 4) 
  {
            continue; // Skip file if any error found
        }          
        if ($_FILES['product_images']['error'][$f] == 0) 
  {              
            if ($_FILES['product_images']['size'][$f] > $max_file_size) 
   {
                $message[] = "$name is too large!.";
                continue; // Skip large files
            }
            elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) )
   {
                $message[] = "$name is not a valid format";
                continue; // Skip invalid file formats
            }
            else{ // No error found! Move uploaded files 
       
     
                if(move_uploaded_file($_FILES["product_images"]["tmp_name"][$f], $path.$name))
    
               $product_images .= $path.$name.', ';
    //  var_dump($product_images);
      $count++; // Number of successfully uploaded file      
            }
        }
    }  */ 
 
 
 //Initialisation/déclaration des variables/constantes :
$valid_formats = array("jpg", "png", "jpeg", "webp");
$max_file_size = 358400;
$path = "product_images/"; // Upload directory
$arrFilesNames = array();
$message = array();

$phpFileUploadErrors = array(
    0 => 'There is no error, the file uploaded with success',
    1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
    2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3 => 'The uploaded file was only partially uploaded',
    4 => 'No file was uploaded',
    6 => 'Missing a temporary folder',
    7 => 'Failed to write file to disk.',
    8 => 'A PHP extension stopped the file upload.',
);

//récupération propre des variables AVANT de les utiliser :
$file_product_images = !empty($_FILES["product_images"]) ? $_FILES["product_images"] : NULL;
$file_product_images_names = !empty($file_product_images['name']) ? $file_product_images['name'] : NULL;

//On boucle sur les fichiers
if(!empty($file_product_images_names)){
  foreach ($file_product_images_names as $f => $name) {
    $fileError = $file_product_images['error'][$f];
    if(!$fileError){
      $fileSize = $file_product_images['size'][$f];
      if($fileSize > $max_file_size){
        $message[] = "$name is too large!.";
      } else{
        if(!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ) {
          $message[] = "$name is not a valid format";
        }else{
          $tmp_name = $file_product_images["tmp_name"][$f];
          if( move_uploaded_file($tmp_name, $path . strtolower($name))) {
            $arrFilesNames[] = $name; // ou $path.$name  si tu veux absolument stocker le path avec le nom de ton image
          } else {
            $message[] = "$name : Upload error";
          }       
        }
      }
    } else {
      $message[] = !empty($phpFileUploadErrors[$fileError]) ? $phpFileUploadErrors[$fileError] : " Unknown error !";
    }
  }

  // on reconstruit ta chaine en faisant un join sur l'array
  $product_images = !empty($arrFilesNames) ? join(',',$arrFilesNames) : "";
  var_dump($product_images);
}

 
    $stmt = $con->prepare("INSERT  into products ( 
      product_title, 
      customer_profile_id, 
      p_cat_id, 
      product_subcat_id,  
      product_length, 
      product_main_color, 
      product_pattern, 
      product_attributes,
      product_occasions,
      product_material,
      product_brand,
      product_price, 
      product_keywords, 
      product_description, 
      product_images, 
      product_variation_colors, 
      purchased_stock_34, purchased_stock_36, purchased_stock_38, purchased_stock_40, purchased_stock_42, purchased_stock_44,  
      created_by, created_on, last_modified_by, last_modified_on 
      ) VALUES (?, ?, ?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?, ?, ?, ?, ?)");

     $stmt->bind_param("siiisiiiiiidssssiiiiiissss", 
     $_POST['product_title'], 
     $_POST['customer_profile_id'], 
     $_POST['product_cat'], 
     $_POST['product_subcat'], 
     $_POST['product_length'], 
     $_POST['product_main_color'], 
     $_POST['product_pattern'],
     $product_attributes,
     $product_occasions,
     $product_materials,
     $_POST['product_brand'], 
     $_POST['product_price'], 
     $_POST['product_keywords'], 
     $_POST['product_description'],
     $product_images,
     $product_variation_colors, 
     $_POST['purchased_stock_34'], 
     $_POST['purchased_stock_36'], 
     $_POST['purchased_stock_38'], 
     $_POST['purchased_stock_40'], 
     $_POST['purchased_stock_42'], 
     $_POST['purchased_stock_44'], 
     $created_by, $date, $created_by, $date
     );
     if(!$stmt->execute()){trigger_error("there was an error....".$con->error, E_USER_WARNING); $stmt->close();
        }
     else 
      {      $product_id = mysqli_stmt_insert_id($stmt);   

          $select = $con->prepare("SELECT product_images FROM products WHERE product_id = ?");
          $select->bind_param('i', $product_id);
          $select->execute();
          $result = $select->get_result();  

          $row = $result->fetch_array();
          $old_file_names =  $row['product_images']; 
          
          $ext = substr($current_filename, strrpos($current_filename, '.')+1); 
          $exploded = explode(", ",$old_file_names); 

        // $exploded =  explode(',',trim($old_file_names,','));

       /*   $old_file_names =  !empty($row['product_images']) ? $row['product_images'] : null;            
          var_dump($old_file_names);
          $exploded = !empty($old_file_names) && is_string($old_file_names) ? explode(',',trim($old_file_names,',')) : array(); 
        var_dump($exploded );  */

        foreach ($exploded as $v)
        {           
           $current_filename1 = str_replace(",","", $v);// On vire les virgules qui séparent chaque fichier
           $current_filename = trim($current_filename1); 
           $without_extension = pathinfo($current_filename, PATHINFO_FILENAME);   // titre de l'image, sans path
           $ext = substr($current_filename, strrpos($current_filename, '.')+1); 
           $path = "product_images/";
           $new_filename = $path.$without_extension.'_ref_'.$product_id.'.'.$ext;

         rename($current_filename,$new_filename); 
         $new="";  
        // $new .= substr($new_filename.', ', 0, -1);
       //  $new .= trim($new_filename,',');
         $new .= $new_filename.', '; 
        // var_dump($current_filename);
          var_dump($new); 
        }  
           $q = $con->prepare(" update products set product_images=? WHERE product_id=? ");
           $q->bind_param('si', $new, $product_id);
           $q->execute();

         if ($q->error) 
          { echo "FAILURE!!! " . $q->error;
          }
           else { // echo "<script>alert('Product has been inserted sucessfully')</script>";
          }

          $q->close();
          
          }
        

 
      
 /* if ($stmt) 
 { echo "<script>alert('Product has been inserted sucessfully')</script>";}
 echo "<script>window.open('index.php?view_products','_self')</script>";
 else { echo "<script>alert('Problem')</script>";}
  
*/ 

   
    
}
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Contemplatrice Messages postés 28 Date d'inscription samedi 16 janvier 2010 Statut Membre Dernière intervention 29 septembre 2020
Modifié le 29 sept. 2020 à 19:06
Je me demande si tu as appliqué la suggestion en #4:
"Commence par retirer l'espace que tu as au niveau du delimiter de ton explode."
Je vois encore un espace superflu en ligne 187.

EDIT:
que fais-tu en ligne 206, pourquoi?
en ligne 209, ne devrais-tu pas appliquer la même technique avec le join?
0
Select > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
29 sept. 2020 à 20:04
J'allais te dire, avant que je ne sois déconnectée du réseau................................................... grrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr



La solution en 4 ; Oui je l'ai testée, aussi bien lors de l'upload + insert que lors du rename + update, et plus rien ne s'enregistrait en base, notamment à cause de mes trim. J'ai testé avec et sans trim, et pffffff.

En ligne 206, j'initialise ma var, = je fais comme j'ai vu sur différents forums, dont Stack. Si je ne le fais pas, rien ne s'enregistre en bdd ou erreur.

En ligne 209 : Je ne sais pas, je ne connaissais pas la méthode join(',',$arrFilesNames).// donc la suite encore un moins... Et c'est pas que je doute, mais comme indiqué précédemment lors de l'insert : var_dump($product_images); me retourne des valeurs tout-attachées, au lieu de séparées, donc.....


Là je veux répondre, et le site m'en empêche en disant undefined.... Tu vois
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 sept. 2020 à 22:48
J'ai galéré à comprendre pourquoi tu faisais tes implodes/explodes pour tes rename ....
En fait.. c'est juste que tu ne traites pas les instructions dans le bon ordre ....

Donc : pour commencer,
un peu de lecture avant l'écriture de tes prochains codes :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Ce qui donne, une fois réécrit un peu plus proprement ( en ayant découpé en fonctions et réorganisé ton code plus intelligemment ... )

A noter qu'on place le code php ... AVANT TOUT CODE HTML. ( donc au tout début de ton fichier... avant la balise <html> )

<?php
//Affichage des erreurs PHP ( A PLACER AU DEBUT DE TON SCRIPT.... )
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

date_default_timezone_set("Europe/Paris");


// Include de ton fichier de connexion à la bdd :
// ... ??? 
// require_once 'ton_fichier_de_connexion_a_ta_bdd.php'


// FONCTIONS
function getPOST($varName,$default = NULL ){
  return !empty($_POST[$varName]) ? $_POST[$varName] : $default;
}

function insertBdd(){
	global $con;
	
	// Récupérationb PROPRE DES VARIABLES AVANT DE LES UTILISER
	$product_title = getPOST('product_title'); 
	$customer_profile_id = getPOST('customer_profile_id');
	$product_cat = getPOST('product_cat');
	$product_subcat = getPOST('product_subcat');
	$product_length = getPOST('product_length');
	$product_main_color = getPOST('product_main_color');
	$product_pattern = getPOST('product_pattern');
	$product_brand = getPOST('product_brand');
	$product_price = getPOST('product_price');
	$product_keywords = getPOST('product_keywords');
	$product_description = getPOST('product_description');
	$purchased_stock_34 = getPOST('purchased_stock_34');
	$purchased_stock_36 = getPOST('purchased_stock_36');
	$purchased_stock_38 = getPOST('purchased_stock_38');
	$purchased_stock_40 = getPOST('purchased_stock_40');
	$purchased_stock_42 = getPOST('purchased_stock_42');
	$purchased_stock_44 = getPOST('purchased_stock_44');
	$product_variation_colors =  implode(",", getPOST('product_variation_colors'));
	$product_attributes =  implode(",", getPOST('product_attributes')); 
	$product_occasions =  implode(",", getPOST('product_occasions')); 
	$product_materials =  implode(",", getPOST('product_materials')); 
	
	$date = date('Y-m-d h:i:s');	
	$created_by =  !empty($_SESSION['admin_name']) ? $_SESSION['admin_name']: NULL;

	$product_images = uploadFiles();

 
    $stmt = $con->prepare("INSERT  into products ( 
		product_title, 
		customer_profile_id, 
		p_cat_id, 
		product_subcat_id,  
		product_length, 
		product_main_color, 
		product_pattern, 
		product_attributes,
		product_occasions,
		product_material,
		product_brand,
		product_price, 
		product_keywords, 
		product_description, 
		product_images, 
		product_variation_colors, 
		purchased_stock_34, 
		purchased_stock_36, 
		purchased_stock_38, 
		purchased_stock_40, 
		purchased_stock_42, 
		purchased_stock_44,  
		created_by, 
		created_on, 
		last_modified_by, 
		last_modified_on  ) 
		VALUES (?, ?, ?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?,?, ?, ?, ?, ?, ?)");
		
	$stmt->bind_param("siiisiiiiiidssssiiiiiissss", 
		 $product_title, 
		 $customer_profile_id, 
		 $product_cat, 
		 $product_subcat, 
		 $product_length, 
		 $product_main_color, 
		 $product_pattern,
		 $product_attributes,
		 $product_occasions,
		 $product_materials,
		 $product_brand, 
		 $product_price, 
		 $product_keywords, 
		 $product_description,
		 "", //$product_images
		 $product_variation_colors, 
		 $purchased_stock_34, 
		 $purchased_stock_36, 
		 $purchased_stock_38, 
		 $purchased_stock_40, 
		 $purchased_stock_42, 
		 $purchased_stock_44, 
		 $created_by, 
		 $date, 
		 $created_by, 
		 $date
    );

	if(!$stmt->execute()) {
		trigger_error("there was an error....".$con->error, E_USER_WARNING); 
		$stmt->close();
		return false;
    }
	
	$product_id = mysqli_stmt_insert_id($stmt);   

	return $product_id;
}

function uploadFiles($product_id){
	//Initialisation/déclaration des variables/constantes :

	$valid_formats = array("jpg", "png", "jpeg", "webp");
	$max_file_size = 358400;
	$path = "product_images/"; // Upload directory
	$arrFilesNames = array();
	$message = array();

	$phpFileUploadErrors = array(
		0 => 'There is no error, the file uploaded with success',
		1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
		2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
		3 => 'The uploaded file was only partially uploaded',
		4 => 'No file was uploaded',
		6 => 'Missing a temporary folder',
		7 => 'Failed to write file to disk.',
		8 => 'A PHP extension stopped the file upload.',
	);

	//récupération propre des variables AVANT de les utiliser :
	$file_product_images = !empty($_FILES["product_images"]) ? $_FILES["product_images"] : NULL;
	$file_product_images_names = !empty($file_product_images['name']) ? $file_product_images['name'] : NULL;

	//On boucle sur les fichiers
	if(!empty($file_product_images_names)){
	  foreach ($file_product_images_names as $f => $name) {
		$fileError = $file_product_images['error'][$f];
		if(!$fileError){
		  $fileSize = $file_product_images['size'][$f];
		  if($fileSize > $max_file_size){
			$message[] = "$name is too large!.";
		  } else{
			if(!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ) {
			  $message[] = "$name is not a valid format";
			}else{
			  $tmp_name = $file_product_images["tmp_name"][$f];
			  $without_extension = pathinfo($name, PATHINFO_FILENAME); 
        $ext = pathinfo($name, PATHINFO_EXTENSION ); 
			  $new_filename = $path.$without_extension.'_ref_'.$product_id.'.'.$ext;
			  if( move_uploaded_file($tmp_name, strtolower($new_filename))) {
           $arrFilesNames[] = $new_filename; 
			  } else {
			    $message[] = "$name : Upload error";
			  }       
			}
		  }
		} else {
		  $message[] = !empty($phpFileUploadErrors[$fileError]) ? $phpFileUploadErrors[$fileError] : " Unknown error !";
		}
	  }
  
	}
  
  if(!empty($message)){
    trigger_error("there was an error...." . print_r($message,true), E_USER_WARNING); 
    return false;
  }
  
	// on reconstruit ta chaine en faisant un join sur l'array
	$product_images = !empty($arrFilesNames) ? join("," , $arrFilesNames) : ""; // join. (PHP 4, PHP 5, PHP 7). join — Alias de implode().
	var_dump($arrFilesNames);
	var_dump($product_images);
	     
	return $product_images;
}

function updateProductImages($product_id,$product_images){
	global $con;
	$stmt = $con->prepare(" update products set product_images=? WHERE product_id=? ");
	$stmt->bind_param('si', $product_images, $product_id);
	if(!$stmt->execute()) {
		trigger_error("there was an error....".$con->error, E_USER_WARNING); 
		$stmt->close();
		return false;
	}
  
  return true;
}

// Traitement du formulaire

if(isset($_POST['submit'])) {
  
	//ETAPE 1 - On créé le produit en BDD
	$product_id = insertBdd();

	//ETAPE 2 - On UPLOAD les images ET on les renomme directement ...
	$product_images =  uploadFiles($product_id)
	
	//ETAPE 3 - On met à jour le champs product_images du produit
  $updImages = updateProductImages($product_id,$product_images)  

  // Si on a bien un product_id et que l'update des images s'est bien fait :    
  if ($product_id && $updImages) { 
    echo "<script>alert('Product has been inserted sucessfully')</script>";}
    echo "<script>window.open('index.php?view_products','_self')</script>";
  }
     
    
}
?>
<!Doctype html>
<html lang='en'>
 <!-- la suite de ton code html .... -->


Au passage, je suppose que tes champs purchased_stock_* correspondent aux différentes tailles de ton produit ...
ça rejoint encore mon idée que ton modèle de BDD est bancale ( pour rester poli).
Si jamais tu dois ajouter une nouvelle taille..... il faudra que tu modifies la structure de ta table et tout le code d'insert/update qui va avec....
Pour éviter cela, il faudrait une table à part pour gérer tes stocks.....
table purchased_stock (#id, product_id, taille, stockvalue )


et pour répondre à une de tes précédente question... lorsque tu parles de déclinaison ( qu'on appelle en e-commerce les "variantes" ) NON il ne faut pas de nouvelle table.
Une variante .. c'est un produit à part entière... il a donc une référence et tous les autres attributs d'un produit....
Il manquerait donc, dans ta table product ... un champ 'product_id_parent' afin de pouvoir associer une variante avec son produit parent ...

Pour ma part, je vais m'arrêter là.

Je pense que de ton côté, il serait bien de comparer ce que tu essaies de faire avec des "vrais" outils de e-commerce.
Tu pourrais, par exemple, installer un CMS tel que MAGENTO et t'amuser à regarder la structure de la bdd.
D'ailleurs, si ton but est de mettre en place un site de e-commerce... autant partir directement sur un CMS prévu pour ça ( MAGENTO, PRETASHOP, WOOCOMERCE ...)
Tu n'auras pas à coder... juste à faire du paramétrage...
Et en plus ça inclus directement (si besoin...) la gestion des tunels de commande, les tunels de paiement ....


Voila.
Bonne continuation.
0
Je suis au courant des CMS......depuis longtemps .... et si j'avais voulu poser des questions en rapport avec eux je l'aurais fait .......

Maintenant, je ne suis pas là pour discuter CMS mais code dvelop et pas pour perdre mon temps, mais pour avoir des solutions à mes problèmes exposés. Développeurs ou bricoleurs ??????

J'étudierai demain + en profondeur le code que tu as déployé et te dirais si ça marche ou tjrs pas....
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 sept. 2020 à 23:21
Tu n'es peut-être pas là pour perdre ton temps.... mais nous non plus...
Je te proposais l'utilisation d'un cms pour t'éviter de développer une solution bancale (vu comment tu t'y prends) .. et à minima.. de regarder le fonctionnement de ceux-ci pour que ça te donne des pistes pour la conception de ta propre appli.

Mais bon, Je te laisse à tes bricolages......


NB : j'ai écrit le code de tête sans l'avoir testé ( ne disposant pas de ta BDD .... )
Il se peut donc que quelques erreurs se soient glisées dans le code.
A minima, le code que je t'ai fourni te permet de voir comment on organise proprement un code et donc que tu puisses t'en inspirer.

Mais si tu as des erreurs dans le code, tu peux toujours venir nous indiquer les messages d'erreur rencontré et on verra pour essayer de te les corriger.


NB² : Quand je t'ai demandé ton code complet... je voulais dire COMPLET ! tu ne nous as fourni qu'une partie ( il manque la connexion à la bdd, le formulaire html ...... )
Mais bon, je m'en suis passé....
Mais à l'avenir.. si on te demande quelque chose... afin de t'aider au mieux.... et bien.... donne nous ce qu'on te demande.
0