[PHP/SQL] Remplir un tableau dynamiquement

Fermé
Gyio Messages postés 11 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 20 janvier 2014 - Modifié par Gyio le 5/05/2010 à 15:45
Gyio Messages postés 11 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 20 janvier 2014 - 21 mai 2010 à 10:32
Bonjour / Bonsoir
Dans le cadre d'un site "marchand", je souhaite faire un tableau qui se générerait dynamiquement lorsque quelqu'un uploaderait un nouveau produit (Une nouvelle ligne pour chaque nouveau produit). Mais quelques problèmes se posent à moi.

Tout d'abord, je souhaiterais que mon script renomme une image au moment où elle est uploadée. Voila le script qui receptionne le formulaire d'envoi :

  <?php 

$connexion = mysql_connect("localhost", "xx", "xx"); 
$selection_bd = mysql_select_db("xxx", $connexion); 


if(isset($_POST['nom'])) $nom = $_POST['nom']; else $nom=""; 
if(isset($_POST['appellation'])) $appellation = $_POST['appellation']; else $appellation=""; 
if(isset($_POST['millesime'])) $millesime = $_POST['millesime']; else $millesime=""; 
if(isset($_POST['description'])) $description = $_POST['description']; else $description=""; 
if(isset($_FILES['image'])) $image = $_FILES['image']['name'];  

if (empty($_POST['nom']) ){ 
  echo "Erreur : le nom n'a pas été donné."; 
    }else if (empty($_POST['appellation']) ){ 
      echo "Erreur : l'appellation n'a pas été donnée."; 
        }else if (empty($_POST['millesime']) ){ 
          echo "Erreur : le millésime de ce vin n'a pas été donné."; 
            }else if (empty($_POST['description']) ){ 
              echo "Erreur : la description n'a pas été donnée."; 
                }else if(empty($_FILES['image']['tmp_name'])){ 
                echo "Erreur : Aucune image n'a été choisie."; 
                } 
  
$requete= "INSERT INTO catalogue_cdc VALUES (NULL, '$nom', '$appellation', '$millesime', '$description', '$image')"; 
//LANCEMENT DE LA REQUETE EN TEXTE  
$resultat= mysql_query($requete); 

if (is_uploaded_file($_FILES['image']['tmp_name'])) { 
   
  copy($_FILES['image']['tmp_name'], "./images/catalogue/" . $_FILES['image']['name']); 
  echo "L'envoi a été effectué.<br/> <a href='ajout_vin.php'>Effectuer un autre envoi</a>  <a href='select.php'>Visionnez le catalogue du site</a>"; 
  }  else { echo "L'envoi a échoué <a href='ajout_vin.php'>Réessayer</a>";} 
                                                                         
       
mysql_close($connexion); 

?>


Je souhaiterais donc que les images soient renommées, comme par exemple "img01.jpg","img02.jpg","img03.jpg", etc. afin que je puisse les appeler par ailleurs en incrémentant dans une boucle for
Quelques suggestions ?

A voir également:

4 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
5 mai 2010 à 17:57
Bonjour,

Simplement lire la documentation de la fonction 'copy' et s'apercevoir que le second paramètre est le nom du chemin de destination de la copie.

Changes donc le nom de ce fichier.

Au lieu de :

"./images/catalogue/" . $_FILES['image']['name']


Tu peux changer ce qui est en gras (qui est le nom d'origine du fichier uploadé) par:

"./images/catalogue/pouetpouetTuuttutt.jpg"



Ce n'est pas ton script au départ je suppose.
1
Gyio Messages postés 11 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 20 janvier 2014 2
6 mai 2010 à 16:22
Si si, mais comment incrémenter automatiquement les noms renommés comme l'exemple que j'ai donné ?

J'imagine qu'il faudrait d'abord vérifier la bdd pour vérifier le dernier auto_increment de la table, et en récuperer de cela, le numéro à inclure dans le nom du nouveau fichier à uploader ..

Mais comment faire cela ? Ou avez vous d'autres méthodes ?
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
Modifié par kij_82 le 6/05/2010 à 16:46
Ha d'accord, désolé, j'avais effectivement mal compris ce que tu souhaitais.

Je résume, tu veux donc insérer les références à tes images dans ta base SQL, puis une fois enregistrée, renommée ton image avec le numéro de l'image résultant de son insertion dans la base.

Pour ce faire, il suffit effectivement de mettre un champ 'ID' dans la table d'enregistrer, en auto-increment. Ce champ servira à la fois d'identifiant unique pour ton image enregistrée (au sein de la base de données), mais aussi à renommer de manière unique l'image ainsi uploadée.

Comment faire, facile:

Au moment d'enregistrer ton image via ta requête, ne met rien à la place de ton champ 'ID' puisqu'il est en auto-increment (attention, ce doit être la clé primaire de ta table, sinon ça ne fonctionnera pas !)

Suite à l'exécution de la requête, tu n'as donc plus qu'à récupérer cet identifiant, il existe dans MySQL une instruction pour le récupérer suite à une requête de type INSERT (où du moins ça te retournera la clé primaire du dernier enregistrement créé - attention : c'est n'importe quel enregistrement dans ta base de données qui sera considéré comme dernier enregistrement, il faut donc faire attention à ce qu'il n'y ai pas d'autre script entre temps qui créé d'autres entrées dans ta base de données, auquel cas l'identifiant retourné ne sera pas celui auquel tu t'attends).

Exemple concret:


// --- Code précédent ce passage 
.... 

// --- Exécution de la requête d'insertion / enregistrement de l'image 
// --- Le premier champ étant considéré comme l'ID (clé primaire de la table, 
// --- de type ENTIER en AUTO-INCREMENT 

$requete= "INSERT INTO catalogue_cdc VALUES ('', '$nom', '$appellation', '$millesime', '$description', '$image')";  
//LANCEMENT DE LA REQUETE EN TEXTE   
@mysql_query($requete);  

// --- Retourne l'ID du dernier enregistrement dans la BDD 
$id = mysql_insert_id(); 

// --- Et on renomme l'image avec l'identifiant récupérer (qui est donc 
// --- un numéro auto-incrémenté par MySQL) 
if (is_uploaded_file($_FILES['image']['tmp_name'])) {  
    
  copy($_FILES['image']['tmp_name'], "./images/catalogue/" . $_FILES['image']['name'] .$id );  

} 

// --- Code suivant  le passage 
... 



Est-ce que c'est bien ce que tu souhaitais faire ?



~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~
1
Gyio Messages postés 11 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 20 janvier 2014 2
7 mai 2010 à 11:23
Oui tout à fait, c'est l'idée ! =)

Mais je ne sais pas si c'est du à ce changement la, je me retrouve maintenant avec un parse error ...
J'ai mis des antislashs un peu partout, virer tout les 'liens.php' dans les echo ".." mais rien n'y fait

$requete= "INSERT INTO catalogue_cdc VALUES (NULL, '$nom', '$appellation', '$millesime', '$description', '$image')";
//LANCEMENT DE LA REQUETE EN TEXTE 
mysql_query($requete);


// --- Retourne l'ID du dernier enregistrement dans la BDD
$id = mysql_insert_id();


  //MEGA CONDITION DE CONTRÔLE DU FICHIER
    //VERIF DU POIDS DU FICHIER <800ko (D'ABORD SUR LA MACHINE LOCALE -> 'name')  ("filesize" plus sécurisé que $_FILES['size'])
    if (filesize($_FILES['image']['name'])>800000){
      echo "Le poids de l\'image est supérieure à la limite autorisée (800Ko). Réduisez celle-ci.";}
       // VERIF DU FORMAT DU FICHIER (.GIF OBLIGATOIRE)
         else if(exif_imagetype($_FILES['image']['name']) != IMAGETYPE_GIF){
           echo "Le type d\'image n'est pas valide. Ce script ne tolère que le .gif";}
            else if (is_uploaded_file($_FILES['image']['tmp_name'])== FALSE) {
              echo "Il y a eut un problème lors de l\'upload de l\'image";}
    
               //COPIE DU FICHIER TEMPORAIRE VERS DOSSIER (BDD) .
               else {
                copy($_FILES['image']['tmp_name'], "./images/catalogue/" . $_FILES['image']['name'].$id ); 
                echo "L\'envoi a été effectué.<br/> <a href=#>Effectuer un autre envoi</a>&nbsp;&nbsp;<a href=#>Visionnez le catalogue du site</a>";
                } else {echo "L\'envoi a échoué <a href=#>Réessayer</a>";}
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
7 mai 2010 à 11:30
Peux-tu mettre l'erreur en question, ainsi que me désigner à quelle ligne cela correspond dans ton programme (numéro de ligne, mais surtout regarde à quelle ligne ça correspond vu que je ne peux pas faire cette correspondance sans le source entier)
0
Gyio Messages postés 11 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 20 janvier 2014 2
Modifié par Gyio le 7/05/2010 à 11:45
Oui désolé,
erreur firefox : " Parse error: parse error in C:\wamp\www\Site\envoi_bdd_vin.php on line 58"

ligne 58 : } else {echo "L\'envoi a échoué <a href=#>Réessayer</a>";}

Je ne vois pas ce que ca peut être :-/
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
7 mai 2010 à 11:45
si tu vire tous les commentaires et les echo..., tu as quoi (donne la ligne en erreur si de nouveau une erreur)
0
Gyio Messages postés 11 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 20 janvier 2014 2
Modifié par Gyio le 7/05/2010 à 12:04
ben.. ca affiche toujours une parse error à la ligne 56 mais par rapport au même code
} else { "L\envoi a échoué <a href=>Réessayer</a>";}


et si j'enleve les " " la parse error ne fait que remonter à la premiere ligne dans mon code où j'ai enlevé l'echo
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
7 mai 2010 à 13:40
Non mais quand je dis d'oter les "echo '...' ", c'est toute la ligne, faut évidemment pas laisser du mauvais code trainer.

En gros, vire moi tout ce qui est superflu, c'est à dire les tests pour voir si tel ou tel truc est bien rempli, les affichages de message, etc. Ne laisse que ce qui permet d'uploader / renommer l'image (tu commente tout le reste qui n'est pas fonctionnel par rapport à ça)

Puis s'il n'y a pas d'erreur, tu décommente petit à petit pour trouver la ligne qui fait l'erreur (et qui n'est pas celle affichée par le message d'erreur)
0