Comment remplir une base avec un fichier texte?

Comment remplir une base avec un fichier texte? - PHP - Programmation

Marsh Posté le 08-03-2009 à 18:05:59    

Bonjour,
Débutant en PHP et sql je bloque sur un pti voir gros problème.
Voila les données du problème.
J'utilise un logiciel (gestion véhicules CARDIFF) qui me génère un fichier (linsting.txt) avec dedant des informations sur chacun des véhicules.
 
Exemple de 2 lignes de mon fichier listing.txt:
 
 
 
1;40;VO;PEUGEOT;307 SW;SW PACK 2.0 HDI 110;BREAK;5;DIESEL;BVM5;6;107;2002;08/11/2002;103335;GRIS;1;Autoradio CD Laser, Lève Vitres éléctrique;12900;0;6 MOIS;6;velour;
2;15;VO;RENAULT;TWINGO;;BERLINE;3;ESSENCE;0;5;80;2004;30/06/2004;60930;BLEU;0;Autoradio CD Laser, Lève Vitres éléctrique;9900;0;6 MOIS;6;velour;  
 
Il y a en tout 23 données sur chaque ligne séparé par ;
 
Mon but est de rentrer ces données dans ma base "auto" dans laquelle j'ai créeé une table "vehicule" avec dedant 23 champs.
Tout ceci afin de les exploiter sur un site Internet.  
Ce fichier est mis à jour régulièrement, donc quelle est la meilleures solution pour ne pas avoir des doublons (vider ma table à chaque mises a jour?)?
 
 
Voila mon fichier php que j'ai fait, mais qui ne fonctionne pas!!!
Es-ce que je me complique trop la vie?
Y-a t-il plus simple à faire?
Merci
 

Code :
  1. <?php
  2. // ouverture du fichier
  3. $monfichier=fopen("listing.txt","r" );
  4. // recuperation du contenu du fichier
  5. $contenu_fichier = '';
  6. while( $ligne = fgets($monfichier) )
  7. {
  8. $contenu_fichier .= $ligne;
  9. }
  10. fclose($monfichier);
  11. // Declaration de la variable qui reccueillera les VALUES de toutes les voitures
  12. $requete_finale = '';
  13. // premier explode sur le retour chariot pour traiter les voitures unes à unes
  14. $liste_voitures = explode("
  15. ",$contenu_fichier);
  16. foreach($liste_voitures AS $voiture)
  17. {
  18. // Declaration/remise à zéro de la variable qui reccueillera les VALUES de chaque voiture unes à unes
  19. $values = '';
  20. $liste_caracteristiques = explode(";",$voiture);
  21. foreach($liste_caracteristiques AS $valeur_caracteristique)
  22. {
  23.  //test obligatoir pour mettre une virgule entre chaque valeurs mais pas au debut et pas à la fin de VALUES
  24.  IF( $values == '' ) { $values = '"'.addslashes($valeur_caracteristique).'"'; }
  25.  else { $values .= ',"'.addslashes($valeur_caracteristique).'"'; }
  26. }
  27. //test obligatoir pour mettre une virgule entre chaque VALUES mais pas au debut et pas à la fin requete_finale
  28. IF( $requete_finale == '' ) { $requete_finale = '('.$values.')'; }
  29. else { $requete_finale .= ', ('.$values.')'; }
  30. }
  31. // Connexion au serveur et à la BDD
  32. mysql_connect('localhost','root','');
  33. mysql_select_db('vehicules');
  34. //ON vide la TABLE
  35. mysql_query("TRUNCATE TABLE vehicules" );
  36. //ON INSERT les données à jour
  37. mysql_query("INSERT INTO vehicules VALUES".$requete_finale);
  38. echo 'Base de données mise à jour.';
  39. mysql_close(); // Déconnexion de MySQL
  40. ?>

Reply

Marsh Posté le 08-03-2009 à 18:05:59   

Reply

Marsh Posté le 08-03-2009 à 19:31:22    

Voila j'avance petit à petit.
 
J'arrive à remplir ma table "vehicules" en appliquant cette requette dans phpMyAdmin:
 

Code :
  1. LOAD DATA INFILE listing.txt'
  2. INTO TABLE vehicules
  3. FIELDS
  4. TERMINATED BY ';'
  5. ENCLOSED BY '"'
  6. ESCAPED BY '\\'
  7. LINES
  8. STARTING BY ''
  9. TERMINATED BY '\n'
  10. (ID, NVO, TYPE, MARQUE, MODELE, VERSION, CARROSSERIE, NBPORTES, ENERGIE, BOITEVITESSE, PFISCALE, PDIN, MILLESIME, DATEMEC, KMS, COULEUR, PMAIN, OPTIONS, PPUBLIC, PMARCHAND, GARANTIE, DUREEGARANTIE, SELLERIE)


 
 
Mon but étant de faire la même chose avec un fichier PHP. Comment retranscrire cette requette en code php?
Si bien sur la méthode est bonne.
Encore merci
Merci


Message édité par cedkey le 08-03-2009 à 19:32:21
Reply

Marsh Posté le 08-03-2009 à 21:08:41    

http://www.php.net/manual/en/function.fgetcsv.php
 
ensuite t'as plus qu'à faire un bête insert en sql

Reply

Marsh Posté le 09-03-2009 à 08:46:08    

Code :
  1. $query = "LOAD DATA INFILE ....";
  2. mysql_query($query);


---------------

Reply

Marsh Posté le 09-03-2009 à 09:06:12    

Je vous avoue que je suis un peu perdu.
Voila mon dernier code que j'ai réalisé: Pas d'erreur mais ma table "vehicules" reste vide:
 

Code :
  1. <?php
  2. // recuperation du contenu du fichier dans un tableau (une ligne par "case" du tableau)  
  3. $monfichier = file("listing.txt" );
  4. $values = '';
  5. foreach ($monfichier as $vehicule ){
  6. $liste_caracteristiques = explode(";",$vehicule);
  7. $ligne=array();
  8. foreach($liste_caracteristiques AS $carateristique){
  9. $ligne[] = addslashes($valeur_caracteristique);
  10. }
  11. $values .= ",(\"".implode('","',$ligne)."\" )";
  12. }
  13. // suppression de la virgule en trop de values  
  14. $values=substr($values,1);
  15. // Connexion au serveur et à la BDD  
  16. mysql_connect('localhost','root','');
  17. mysql_select_db('auto');
  18. //ON vide la TABLE  
  19. mysql_query("TRUNCATE TABLE vehicules" );
  20. //ON INSERT les données à jour  
  21. mysql_query("INSERT INTO vehicules VALUES".$values);
  22. echo 'Base de données mise à jour.';
  23. mysql_close(); // Déconnexion de MySQL  
  24. ?>


 
Quelle est mon erreur?
La méthode b'est pas bonne?
Encore merci


Message édité par cedkey le 09-03-2009 à 09:06:47
Reply

Marsh Posté le 09-03-2009 à 09:39:25    

hello
 
$req="LOAD DATA INFILE listing.txt'
INTO TABLE vehicules
FIELDS
TERMINATED BY ';'
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES
STARTING BY ''
TERMINATED BY '\n'
(ID, NVO, TYPE, MARQUE, MODELE, VERSION, CARROSSERIE, NBPORTES, ENERGIE, BOITEVITESSE, PFISCALE, PDIN, MILLESIME, DATEMEC, KMS, COULEUR, PMAIN, OPTIONS, PPUBLIC, PMARCHAND, GARANTIE, DUREEGARANTIE, SELLERIE)";
 
mysql_connect('localhost','root','');
mysql_select_db('auto');
mysql_query($req);
 
 
j'ai loupé quelque chose ?


---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 09-03-2009 à 09:40:56    

Autre post pour autre réponse :  

Citation :

Ce fichier est mis à jour régulièrement, donc quelle est la meilleures solution pour ne pas avoir des doublons (vider ma table à chaque mises a jour?)?


 
Je fais ca très souvent (vider plus re-remplir), en général la nuit, avec une crontab. Mais j'ai la chance d'avoir un serveur dédier.
LOAD DATA INFILE est TRES rapide.


Message édité par PierreC le 09-03-2009 à 09:41:41

---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 09-03-2009 à 10:24:57    

Merci pierreC,
désolé pour mon ignorance, mais ce que tu m'as envoyé:
 

Code :
  1. $req="LOAD DATA INFILE listing.txt'
  2. INTO TABLE vehicules
  3. FIELDS
  4. TERMINATED BY ';'
  5. ENCLOSED BY '"'
  6. ESCAPED BY '\\'
  7. LINES
  8. STARTING BY ''
  9. TERMINATED BY '\n'
  10. (ID, NVO, TYPE, MARQUE, MODELE, VERSION, CARROSSERIE, NBPORTES, ENERGIE, BOITEVITESSE, PFISCALE, PDIN, MILLESIME, DATEMEC, KMS, COULEUR, PMAIN, OPTIONS, PPUBLIC, PMARCHAND, GARANTIE, DUREEGARANTIE, SELLERIE)";
  11. mysql_connect('localhost','root','');
  12. mysql_select_db('auto');
  13. mysql_query($req);


 
C'est a mettre dans un fichier PHP je suppose? quel en est le code exact? comment faire pour que ce fichier se lance automatiquement tout les jours ou a chaque mise a jour de celui-ci? enfin si cela est possible...
Encore merci

Reply

Marsh Posté le 09-03-2009 à 10:29:20    

ca dépend :-)
 
Sur quel plateforme est tu :  
Windows, linux ?
sur internet ? Serveur dédier ou mutualisé ?
intranet ? As tu l'access en t'en qu'admin sur le système ?
 


---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 09-03-2009 à 10:43:59    

Donc en fait voila je viens de voir un truc assez important!!!
En effet c'est un logiciel (CARDIFF) qui génère le fichier listing.txt, mais je viens de voir que le logiciel est possible d'effectuer le lancement d'une page spécifique en paramétrant son URL apès avoir mis a jour et envoyé sur mon serveur ftp le fichier listing.txt.
Donc mon problème est réglé pour le lancement automatique du fichier.
Par contre quelle est le meilleur code de mon fichier PHP?
Merci
 
PS: mon site est chez Online.net Offre M (pas de serveur dédier)


Message édité par cedkey le 09-03-2009 à 10:45:16
Reply

Marsh Posté le 09-03-2009 à 10:43:59   

Reply

Marsh Posté le 09-03-2009 à 11:02:29    

le code que je t'ai donnée est opérationnel je pense.
 
J'ai repris ce qui fonctionnait selon tes tests dans phpmyadmin, et l'ai mis dans du code php.


---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 09-03-2009 à 11:14:13    

Oui dans PHPMyAdmin cela fonctionne bien, ma table se remplie, par contre je n'arrive pas a le transformer en code PHP!! :(  
Es-ce que je pourrai avoir le code qui fonctionne?  
Encore merci car je galère vraiement!!

Reply

Marsh Posté le 09-03-2009 à 11:59:58    

c'est le code que je t'ai posté plus haut, rien de plus


---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 09-03-2009 à 12:09:06    

Je vais passer pour un boulet mais voila mon fichier test.php
 

Code :
  1. <?php
  2. $req="LOAD DATA INFILE 'listing.txt'
  3. INTO TABLE vehicules
  4. FIELDS
  5. TERMINATED BY ';'
  6. ENCLOSED BY '"'
  7. ESCAPED BY '\\'
  8. LINES
  9. STARTING BY ''
  10. TERMINATED BY '\n'
  11. (ID, NVO, TYPE, MARQUE, MODELE, VERSION, CARROSSERIE, NBPORTES, ENERGIE, BOITEVITESSE, PFISCALE, PDIN, MILLESIME, DATEMEC, KMS, COULEUR, PMAIN, OPTIONS, PPUBLIC, PMARCHAND, GARANTIE, DUREEGARANTIE, SELLERIE)";
  12. mysql_connect('localhost','root','');
  13. mysql_select_db('auto');
  14. mysql_query($req);
  15. ?>


 
Je pense que la syntaxe n'est pas bonne du tout car j'ai erreur ligne 7!!!

Reply

Marsh Posté le 09-03-2009 à 13:32:26    

ligne 6 tu as un " ... dans une chaine qui commence par un ".
Donc tu dois l'echapper avec un \ pour signifier a php que ce n'est pas la fin de ta chaine mais un charactere normal.
 
$req="LOAD DATA INFILE 'listing.txt'
INTO TABLE vehicules
FIELDS
TERMINATED BY ';'
ENCLOSED BY '\"'
ESCAPED BY '\\'
LINES
STARTING BY \''
TERMINATED BY '\n'
(ID, NVO, TYPE, MARQUE, MODELE, VERSION, CARROSSERIE, NBPORTES, ENERGIE, BOITEVITESSE, PFISCALE, PDIN, MILLESIME, DATEMEC, KMS, COULEUR, PMAIN, OPTIONS, PPUBLIC, PMARCHAND, GARANTIE, DUREEGARANTIE, SELLERIE)";


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 10-03-2009 à 10:54:14    

Voila a quoi je suis arrivé et qui fonctionne!
Bon je vous l'accorde ce n'est peut etre pas joli joli comme code.
Si vous avez des idée (et je pense que oui) pour l'optimisé?!!:?
 

Code :
  1. <?php
  2. /* Connexion bdd */
  3. mysql_connect('localhost','root','');
  4. mysql_select_db('auto');
  5. //On vide la table
  6. mysql_query("TRUNCATE TABLE vehicules" );
  7.  
  8. /* On ouvre le fichier à importer en lecture seulement */
  9.      $fp=fopen("listing.txt","r" );
  10.    
  11.     while (!feof($fp)) /* on importe */
  12.     { /* Tant qu'on n'atteint pas la fin du fichier */
  13.        $ligne = fgets($fp,4096); /* On lit une ligne */ 
  14.        /* On récupère les champs séparés par ; dans liste*/
  15.        $liste = explode( ";",$ligne); 
  16.    
  17.        /* On assigne les variables */
  18.    $ID = $liste[0];
  19.    $NVO = $liste[1];
  20.    $TYPE = $liste[2];
  21.    $MARQUE = $liste[3];
  22.    $MODELE = $liste[4];
  23.    $VERSION = $liste[5];
  24.    $CARROSSERIE = $liste[6];
  25.    $NBPORTES = $liste[7];
  26.    $ENERGIE = $liste[8];
  27.    $BOITEVITESSE = $liste[9];
  28.    $PFISCALE = $liste[10];
  29.    $PDIN = $liste[11];
  30.    $MILLESIME = $liste[12];
  31.    $DATEMEC = $liste[13];
  32.    $KMS = $liste[14];
  33.    $COULEUR = $liste[15];
  34.    $PMAIN = $liste[16];
  35.    $OPTIONS = $liste[17];
  36.    $PPUBLIC = $liste[18];
  37.    $PMARCHAND = $liste[19];
  38.    $GARANTIE = $liste[20];
  39.    $DUREEGARANTIE = $liste[21];
  40.    $SELLERIE = $liste[22];
  41.  
  42.  
  43.        /* Ajouter un nouvel enregistrement dans la table */
  44.        $query = "INSERT INTO vehicules VALUES('$ID','$NVO','$TYPE','$MARQUE','$MODELE','$VERSION','$CARROSSERIE','$NBPORTES','$ENERGIE','$BOITEVITESSE','$PFISCALE',
  45. '$PDIN','$MILLESIME','$DATEMEC','$KMS','$COULEUR','$PMAIN','$OPTIONS','$PPUBLIC','$PMARCHAND','$GARANTIE','$DUREEGARANTIE','$SELLERIE')";
  46.        $result= MYSQL_QUERY($query);
  47.  
  48.        if(mysql_error())
  49.         { /* Erreur dans la base de donnees, sûrement la table qu'il faut créer */
  50.            print "Erreur dans la base de données : ".mysql_error();
  51.            print "<br>Importation stoppée.";
  52.            exit();
  53.         }
  54.        else /* ça fonctionneen */
  55.          print "Base mise a jour<br>";
  56.      }
  57.    
  58.      echo "<br>Importation terminée, avec succès.";
  59.      
  60.      /* Fermeture */
  61.      fclose($fp);
  62.      MYSQL_CLOSE();
  63.     ?>


 
Avec cette méthode je suis obliqué d'avoir le même nombre de champs dans ma table que dans mon fichier listing.txt. Est-il possible d'avoir plus de champs dans ma table que dans mon txt?
Encore merci a tous pour vos aides..


Message édité par cedkey le 10-03-2009 à 10:55:08
Reply

Marsh Posté le 10-03-2009 à 11:18:07    

pourquoi n'a tu pas utilisé un LOAD DATA INFILE. Le but d'utiliser un LOAD DATA INFILE est justement fait pour importé des csv. si tu as 10000 lignes alors cela fera 10000 INSERT !
 
Mais si ton code fonctionne, et qu'il te convient ...
 
Sinon bug potentiel, si un champ contient une apostrophe ca plante (voir mysql_escape_string)


---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 25-03-2009 à 11:52:33    

Bonjour,
Je reviens avec une question au sujet de mon remplissage de base.
 
Comme écrit plus haut mon fichier texte est composé comme ceci:
 
1;40;VO;PEUGEOT;307 SW;SW PACK 2.0 HDI 110;BREAK;5;DIESEL;BVM5;6;107;2002;08/11/2002;103335;GRIS;1;Autoradio CD Laser, Lève Vitres éléctrique;12900;0;6 MOIS;6;velour;
2;15;VO;RENAULT;TWINGO;;BERLINE;3;ESSENCE;0;5;80;2004;30/06/2004;60930;BLEU;0;Autoradio CD Laser, Lève Vitres éléctrique;9900;0;6 MOIS;6;velour;
 
Grace a mon fichier PHP( et votre aide) tout rentre parfaitement dans ma bas et au bon endroit. Mais voila je souhaite savoir si une modif est possible:
 
En effet pour VO;PEUGEOT;307SW je souhaiterai rentrer dans ma base des chiffres plustôt que ces données:
 
ex: pour VO:
Si dans mon fichier texte il y a VO, il faudrait que dans ma base il y est un 1
Si dans mon fichier texte il y a VN, il faudrait que dans ma base il y est un 0
 
Pareil pour les marques:
 
Si dans mon fichier texte il y a CITROEN, il faudrait que dans ma base il y est un 8
Si dans mon fichier texte il y a PEUGEOT, il faudrait que dans ma base il y est un 10
 
Et don pareil pour les modèles de véhicule.
 
 
Voila, je ne sais pas si je me suis bien fait comprendre et si cela est possible a faire...
 
Encore Merci
 
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed