Page 1 sur 2

CSV vers SQL en 1 coup

Posté : 20 déc. 2005, 10:39
par eric269
Hello,
j'ai ici un petit formulaire qui permet d'envoyer un fichier csv sur un table.
Mon problème est que les données s'ajoutent et qu'idéalement elles devraient être remplacées.
En effet, les données ne sont pas toujours du même nombre et il ne faut pas qu'il y ai des répétitions.
Comment, en une seule instruction, on supprime le contenu de la table, puis on la remplit avec les nouvelles données.

Autres détail, la première ligne comporte les intitulés de colonnes (utile pour l'administration côté Excel), mais chiant côté SQL, car elle apparait dans la table.
Comment faire pour la supprimer ?

Voici le code
<html> 
<head> 
<title>Importer un fichier CSV dans la table</title> 
</head> 
<body> 
<h2>Importer un fichier CSV dans la table</h2> 

<?
 switch($action)
 {
  /* LECTURE ET AJOUT DES DONNEES DANS LA TABLE */
   case "ajouter":

 /* Variables */
   $bdd = "cai"; /* Base de données */
   $table= "liste"; /* Table */
   $host= "localhost"; /* Hote */
   $user= "root"; /* Utilisateur */
   $pass= ""; /* Mot de passe */
   
 /* Connexion bdd */
   @mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données"); 
   @mysql_select_db($bdd);
  
 /* On ouvre le fichier à importer en lecture seulement */
 if (file_exists($fichier))
     $fp = fopen("$fichier", "r"); 
 else
     { /* le fichier n'existe pas */
       echo "Fichier introuvable !<br>Importation stoppée.";
       exit();
     }
      
    while (!feof($fp)) /* On importe */
    { /* Tant qu'on n'atteint pas la fin du fichier */ 
       $ligne = fgets($fp,4096); /* On lit une ligne */  

       /* On récupère les champs séparés par ; dans liste*/
       $liste = explode( ";",$ligne);  
    
       /* On assigne les variables */ 
		   $nom = $liste[0]; 
		   $prenom = $liste[1]; 
		   
       /* Ici, il faudrait supprimer le contenu de la table pour éviter les répétitions */ 
	 	   
	       
       /* Pour ensuite ajouter un nouvel enregistrement dans la table */ 
       $query = "INSERT INTO $table VALUES
	   ('','$nom','$prenom')"; 
       $result= MYSQL_QUERY($query); 
  
       if(mysql_error())
        { /* Erreur dans la base de donnees, sûrement la table qu'il faut créer */
           print "Erreur dans la base de données : ".mysql_error();
           print "<br>Importation stoppée.";
           exit();
        } 
       else /* Tout va bien */

		 print "$id, $nom, $prenom <br>";
     } 
     
     echo "<br>Importation terminée, avec succès."; 
       
     /* Fermeture */ 
     fclose($fp); 
     MYSQL_CLOSE(); 
   
   break;
   
 
   /* FORMULAIRE DE CHOIX D'IMPORTATION */  
   
   default: 
   ?>  
   <? echo "<form method=\"post\" action=\"$PHP_SELF\">"; ?>
     Ajouter un CSV 
     <table border="0" cellspacing="0" cellpadding="3">
      <tr>
       <td>Fichier :</td> 
	   <td width="244" align="center"><input type="file" name="fichier" value="fichier"></td> 
      </tr>
      <tr>
        <td></td>  
       <td> <input type="submit" name="submit" value="Envoyer"> </td> 
      </tr>
     </table>
     <input type="hidden" name="action" value="ajouter">  
    </form>
   <? 
   break;
   
   }
  ?>
</body> 
</html>

Posté : 20 déc. 2005, 10:51
par demipoulp
UPDATE ?

desolee pour cette reponse laconique mais il me semble que c'est ce que tu cherche

Posté : 20 déc. 2005, 11:31
par iclo
En effet, il faudra passer par un update, une des solution est de modifier la structure de donnée pour définir les champs comme unique, ensuite, on tente pour chaques lignes une insertion, si elle échoue, on teste l'erreur , si il s'agit d'une erreur de duplication de donnée, on effectue alors un update. Ca demande moins de ressource que de faire à chaques fois avant un select pour voir si les données sont déja présentes.

Posté : 20 déc. 2005, 12:14
par pjl
Si j'ai bien compris, l'update ne suffit pas puisque c'est la table entière qui doit être mis à jour.
Il peut y avoir aussi de l'insertion et de la supression de données à faire.

Si tu veux faire celà avec une commande, je ne vois que les procédures stockées pour faire celà.

Posté : 20 déc. 2005, 12:21
par eric269
Effectivement, l'update ne remplace pas ; je vais quand même réessayer, mais je tenais aussi à préciser que je n'ai pas votre niveau.
C'est pas qh'chui nul, mais bon je débute.
Merci pourvotre aide.

Posté : 22 déc. 2005, 12:17
par eric269
Bon, ça marche toujour pas, si quelqu'un a une idée

Posté : 22 déc. 2005, 12:27
par Min's
Pour la vider completement, utilise DELETE ou TRUNCATE
/* Ici, il faudrait supprimer le contenu de la table pour éviter les répétitions */ 
$query = 'TRUNCATE `nom de la table`';
mysql_query($query);

Posté : 22 déc. 2005, 12:29
par Cyrano
On va résumer :
Pour vider une table :

Code : Tout sélectionner

TRUNCATE TABLE `nom_table`;
Ensuite on peut faire un ajout avec INSERT; Mais ça fait deux requêtes

Autre méthode pour une requête unique par mise à jour:

Code : Tout sélectionner

UPDATE `nom_table` SET `champ_1` = 'valeur_1'[, `champ_2` = 'valeur_2'[, ... `champ_n` = 'valeur_n']]
(Ce qui est entre crochets [] est facultatif bien sûr)

Posté : 22 déc. 2005, 14:30
par eric269
Cool, seulement, je ne peux pas utiliser la mise à jour, car le nombre de ligne dans mes fichiers excel n'est pas toujours le même. Donc si je fais un UPDATE avec un nombre de 10 lignes sur le précédent qui en faisait 12, je me retrouve avec 2 anciennes lignes.

Il y a quelque chose qui m'échappe en essayant TRUNCATE (j'en vois d'ici qui vont hurler, mais bon c'est à ça que ça sert les forums), cela ne supprime pas le contenu de la table

Voici le code

<html> 
<head> 
<title>Importer un fichier CSV dans la table</title> 
</head> 
<body> 
<h2>Importer un fichier CSV dans la table</h2> 

<? 
switch($action) 
{ 
  /* LECTURE ET AJOUT DES DONNEES DANS LA TABLE */ 
   case "ajouter": 

/* Variables */ 
   $bdd = "cai"; /* Base de données */ 
   $table= "liste"; /* Table */ 
   $host= "localhost"; /* Hote */ 
   $user= "root"; /* Utilisateur */ 
   $pass= ""; /* Mot de passe */ 
    
/* Connexion bdd */ 
   @mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données"); 
   @mysql_select_db($bdd); 

 /* On supprime le contenu de la table */
 if ($truncate_table)
  {
  /* Vidange de la table */
	   $query = "TRUNCATE TABLE `$table`";
  }
  

   
/* On ouvre le fichier à importer en lecture seulement */ 
if (file_exists($fichier)) 
     $fp = fopen("$fichier", "r"); 
else 
     { /* le fichier n'existe pas */ 
       echo "Fichier introuvable !<br>Importation stoppée."; 
       exit(); 
     } 
       
    while (!feof($fp)) /* On importe */ 
    { /* Tant qu'on n'atteint pas la fin du fichier */ 
       $ligne = fgets($fp,4096); /* On lit une ligne */   

       /* On récupère les champs séparés par ; dans liste*/ 
       $liste = explode( ";",$ligne);   
     
       /* On assigne les variables */ 
           $nom = $liste[0]; 
           $prenom = $liste[1]; 
             
            
       /* Pour ensuite ajouter un nouvel enregistrement dans la table */ 
       $query = "INSERT INTO $table VALUES 
       ('','$nom','$prenom')"; 
       $result= MYSQL_QUERY($query); 
   
       if(mysql_error()) 
        { /* Erreur dans la base de donnees, sûrement la table qu'il faut créer */ 
           print "Erreur dans la base de données : ".mysql_error(); 
           print "<br>Importation stoppée."; 
           exit(); 
        } 
       else /* Tout va bien */ 

         print "$id, $nom, $prenom <br>"; 
     } 
      
     echo "<br>Importation terminée, avec succès."; 
        
     /* Fermeture */ 
     fclose($fp); 
     MYSQL_CLOSE(); 
    
   break; 
    

   /* FORMULAIRE DE CHOIX D'IMPORTATION */   
    
   default: 
   ?>   
   <? echo "<form method=\"post\" action=\"$PHP_SELF\">"; ?> 
     Ajouter un CSV 
     <table border="0" cellspacing="0" cellpadding="3"> 
      <tr> 
       <td>Fichier :</td> 
       <td width="244" align="center"><input type="file" name="fichier" value="fichier"></td> 
      </tr>
      <tr>
       <td>Vider table ? :</td> 
       <td> <input type="checkbox" name="truncate_table" checked> </td> 
      </tr> 
      <tr> 
        <td></td>   
       <td> <input type="submit" name="submit" value="Envoyer"> </td> 
      </tr> 
     </table> 
     <input type="hidden" name="action" value="ajouter">   
    </form> 
   <? 
   break; 
    
   } 
  ?> 
</body> 
</html>


Posté : 22 déc. 2005, 20:30
par Cyrano
Je ne vois nulle par l'exécution de ta requête pour vider la table..., tu crées bien la requête, mais tu ne l'exécutes pas, tu n'aurais pas, par le plus malencontreux des hasards bien sûr, oublié de mettre une ligne du genre mysql_query($query) ?? :-"

Posté : 22 déc. 2005, 22:46
par eric269
Oui cher Cyrano,
J'ai rajouter les requète, et arrive enfin à supprimer tout le contenu de la table, virer la première ligne et aussi virer les champs vides présents malgré eux dans le tableau csv. Donc tout marche !

J'attend vos avis avant de mettre résolu
<html> 
<head> 
<title>Importer un fichier CSV dans la table</title> 
</head> 
<body> 

<?
 switch($action)
 {
  /* LECTURE ET AJOUT DES DONNEES DANS LA TABLE */
   case "ajouter":

 /* Variables */
   $bdd = "cai"; /* Base de données */
   $table= "engine_bs";
   $host= "localhost"; /* Hote (localhost en principe) */
   $user= "root"; /* Utilisateur */
   $pass= ""; /* Mot de passe */
   

 /* Connexion bdd */
   @mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données"); 
   @mysql_select_db($bdd); 

  /* Vidange de la table */
 if ($erase_all_file)
  {
  
	   $query1 = "TRUNCATE TABLE `$table`";
	   $result1= MYSQL_QUERY($query1);
  }
   
 /* On ouvre le fichier à importer en lecture seulement */
 if (file_exists($fichier))
     $fp = fopen("$fichier", "r"); 
 else
     { /* le fichier n'existe pas */
       echo "Fichier introuvable !<br>Importation stoppée.";
       exit();
     }
      
    while (!feof($fp)) /* Et Hop on importe */
    { /* Tant qu'on n'atteint pas la fin du fichier */ 
       $ligne = fgets($fp,4096); /* On lit une ligne */  

       /* On récupère les champs séparés par ; dans liste*/
       $liste = explode( ";",$ligne);  
    
       /* On assigne les variables */ 
       $nom = $liste[0]; 
       $prenom = $liste[1]; 
	   
       /* Ajouter un nouvel enregistrement dans la table */ 
       $query2 = "INSERT INTO $table VALUES
	   ('','$nom','$prenom')"; 
       $result = MYSQL_QUERY($query2); 
  
       /* On supprime la 1ère ligne (celle qui contient les titres de colones) */
  	   $query3 = "DELETE FROM $table WHERE id LIKE '1'"; 
       $result = MYSQL_QUERY($query3); 
	   
	   /* On supprime les lignes vides (si on a selectionné des cellules vides dans Excel) */
  	   $query4 = "DELETE FROM $table WHERE nom LIKE ''"; 
       $result = MYSQL_QUERY($query4); 
       
	   if(mysql_error())
        { /* Erreur dans la base de donnees, sûrement la table qu'il faut créer */
           print "Erreur dans la base de données : ".mysql_error();
           print "<br>Importation stoppée.";
           exit();
        } 
       else /* Tout va bien */

		 print "$nom, $prenom <br>";
     } 
     
     echo "<br>Importation terminée, avec succès."; 
       
     /* Fermeture */ 
     fclose($fp); 
     MYSQL_CLOSE(); 
   
   break;
   
 
   /* FORMULAIRE DE CHOIX D'IMPORTATION */  
   
   default: 
   ?>  
   <? echo "<form method=\"post\" action=\"$PHP_SELF\">"; ?>
     Sélectionnez le fichier CSV 
     <table border="0" cellspacing="0" cellpadding="3">
      <tr>
       <td>Fichier : <input type="file" name="fichier" value="fichier"></td> 
      </tr>
      <tr>
       <td>Supprimer les données existantes <input type="checkbox" name="erase_all_file" checked> </td> 
      </tr>
      <tr>
       <td> <input type="submit" name="submit" value="Envoyer"> </td> 
      </tr>
     </table>
     <input type="hidden" name="action" value="ajouter">  
    </form>
   <? 
   break;
   }
  ?>
</body> 
</html>

Posté : 23 déc. 2005, 01:25
par Cyrano
Ben si ça fonctionne à ta satisfaction, tu peux mettre le [Résolu], tu es le mieux placé pour le savoir ;)

Posté : 23 déc. 2005, 10:03
par eric269
Je ne sais pas si le code est très académique, mais ça fonctionne.
Merci à tous

Posté : 06 janv. 2006, 09:39
par eric269
Bonne Année à tous
Bon j'ai été un peu vite pour mettre résolu : en local, ça marche mais en ligne, ça marche pas.
La page m'indique :

Fichier introuvable ! Importation stoppée.

Je crois que ça viens de (!feof($fp))

Si quelqu'un a une idée ?

Merci à tous

Posté : 06 janv. 2006, 09:56
par Cyrano
Si le fichier est introuvable, c'est que le chemin indiqué vers le fichier n'est pas bon... Si je regarde le dernier code que tu as mis, je vois ceci:
if (file_exists($fichier))
Donc logiquement, je remonte dans le code pour voir à quoi correspond cette variable $fichier... et je ne le trouve nulle part... :-k