Forum Clubic

Importer un tableau CSV vers une base de données Mysql en php

Bonjoooooooooour à tous !

J’ai une importante question à vous poser.
Un camarade et moi devons, dans le cadre d’un projet, réaliser une importation d’un tableau .csv vers une base de données Mysql à partir d’une page en php.
Le but serait d’avoir un bouton “PARCOURIR” (comme dans bon nombre de sites quoi) et qu’en cliquant sur le bouton “Envoyer” l’importation du fichier se fasse automatiquement sur la BDD Mysql.
On a trouvé bon nombre de réponses traîtant de ce principe, malheureusement on n’a réussi à en faire fonctionner aucune, la table restait désespérément vide.

D’avance merci pour votre réponse,

MoYoX
Edité le 04/06/2009 à 08:56

Salut,

Quel principe avez-vous utilisé et qui ne fonctionne pas ?

Rebonjour et merci pour la réponse rapide !

J’avais vu qu’il était possible d’utiliser la commande suivante je ne sais plus sur quel site:

LOAD DATA INFILE IGNORE ‘data.txt’ INTO TABLE tbl_name
FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘"’
LINES TERMINATED BY ‘\n’;

Nous on voulait juste remplacer le “IGNORE” par “REPLACE”, mais on a jamais réussi à remplir notre table avec cette commande.
On a pourtant bien remplacé le nom du fichier .txt, le nom de la table … on a même mis le chemin complet vers le .txt, rien n’y fait !

Salut,

quand tu importes ton fichier sous PHPMyAdmin, il te sort pas la requête déjà toute faite ???

Enfin je dis ça, j’en suis pas du tout sûr, c’est juste une piste :slight_smile:

En fait il me sort tous les “INSERT INTO” avec les valeurs contenues dans mon tableau, mais pas la requête permettant d’accéder à ces valeurs.
On avait cherché sur cette piste aussi, mais c’est innexploitable !

Je ne vois pas ce que tu veux faire précisément. PHPMyAdmin te donne les requêtes d’insertion, c’est parfait, mais après qu’est ce qui t’empêche de faire des requêtes de sélections (SELECT) ?

De toute façon, si j’ai bien compris, vous devez mettre en place une page php qui te permet de choisir un fichier en local puis insérer les données du csv en base ?

Voilà, c’est exactement ça qu’on cherche à faire !
Notre mini site web ayant pour but d’être exploité par des personnes ne connaissant rien à PHPMyadmin, ou même au php en général, il nous faut une page toute simple, avec le bouton “PARCOURIR” (enfin un truc classique quoi) histoire de pointer vers un fichier (le fameux tableau au format csv) qui sera importé automatiquement vers la base de données Mysql.
On a testé un autre script tout fait avec mon camarade hier après-midi, mais impossible de le mettre en place sans avoir des erreurs au niveau du code PHP (c’est un script de gestion assez complexe tenant sur 3 pages, j’ai oublié le nom de son auteur)

Il faut aussi savoir que mon camarade et moi n’avions jamais eu à importer ce genre de tableau vers la base Mysql avant, ceci peut peut être expliquer les difficultés qu’on a à le mettre en place.
Edité le 03/06/2009 à 06:35

Bon, j’ai essayé le script suivant:

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

 /* Variables */
   $bdd = "test"; /* Base de données */
   $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); 
 
 /* On cree la table */
 if ($creertable)
  {
  $query = "CREATE TABLE $table( nom varchar(24),prenom varchar(24) )";
  $result= MYSQL_QUERY($query);
  }
  
 /* 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 */ 
       $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 "$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\">"; ?>
     Pour ajouter ton serveur il suffit de remplir ce formulaire 
     <table border="0" cellspacing="0" cellpadding="3">
      <tr>
       <td>Table :</td> 
       <td> <input type="text" name="table"> </td> 
      </tr>
      <tr>
       <td>Fichier :</td> 
       <td> <input type="text" name="fichier"> </td> 
      </tr>
      <tr>
       <td>Créer table ? :</td> 
       <td> <input type="checkbox" name="creertable" checked> </td> 
      </tr>
      <tr>
        <td></td>  
       <td> <input type="submit" name="submit" value="Et HoP !"> </td> 
      </tr>
     </table>
     <input type="hidden" name="action" value="ajouter">  
    </form>
   <? 
   break;
   
   }

  ?>

Mais quand je remplie le formulaire et que je l’envoie, rien ne se passe et ma base de données ne se remplie pas !
Alors que j’ai mis mon fichier “Classeur1.csv” dans le même dossier que la page php.

Bonjour,

La commande LOAD DATA INFILE est la commande utilisée pour charger une table dans une base MySql à partir d’un fichier texte (csv ou autre séparateur). C’est de cette manière qu’on recharge des dumps lors des portages de bases. Il s’agit par contre d’une commande système et je doute que les connecteurs php l’implémentent. Le descriptif complet est là : dev.mysql.com…

Une stratégie peut être de charger le fichier à partir d’un formulaire dans un emplacement sur le serveur, puis exécuter LOAD DATA INFILE (avec un exec paramétré correctement).

Bonjour et merci pour la réponse,

Pour nos essais on utilise EasyPHP, ce qui fait qu’on héberge nos fichiers sur le serveur apache local pour les utiliser dans le mini site web, le fichier .csv compris.
Je posterai ici dans la journée la syntaxe exacte de notre page, avec nos noms de fichier à nous et nos chemins, pour voir ce qui cloche.
En tout cas, merci pour votre aide.

Bonjour à tous,
J’ai enfin trouvé après avoir vadrouillé sur le web:

$query = "LOAD DATA INFILE '$fichier' 
INTO TABLE essai
FIELDS TERMINATED BY ';' 
ENCLOSED BY '' ";

Il se trouve que ces quelques lignes résolvent le problème qu’on pensait résoudre en une page complète de code.

C’est fou hein quand on utilise les outils existant :wink:

salut MoYoX
stp jai un peu le meme probleme avec l’import d’un fichier csv vers ma base de données sauf que le LOAD DATA INFILE ca marche pas pour moi non plus… vla ce que j’essaie

 <?php

mysql_connect(“localhost”, “root”, “”);
mysql_select_db(“test”);
$fichier=‘C:\classeur1.csv’;
mysql_query("LOAD DATA INFILE ‘$fichier’ INTO TABLE cssv FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ ") or die (mysql_error());
echo ‘jere’ ;
mysql_close();

?>
et nada je me retrouve avec File ‘C:classeur1.csv’ not found (Errcode: 2) pourtant le lien est impec
Si qlqun peut m’aider s’il vous plait ca fait une semaine que je ss sur ca!!
Merci enormement