Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2645 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Comment remplir une base avec un fichier texte?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment remplir une base avec un fichier texte?

n°1859028
cedkey
Posté le 08-03-2009 à 18:05:59  profilanswer
 

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. ?>

mood
Publicité
Posté le 08-03-2009 à 18:05:59  profilanswer
 

n°1859048
cedkey
Posté le 08-03-2009 à 19:31:22  profilanswer
 

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
n°1859067
PunkRod
Digital Mohawk
Posté le 08-03-2009 à 21:08:41  profilanswer
 

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

n°1859135
flo850
moi je
Posté le 09-03-2009 à 08:46:08  profilanswer
 

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


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

n°1859144
cedkey
Posté le 09-03-2009 à 09:06:12  profilanswer
 

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
n°1859154
PierreC
Posté le 09-03-2009 à 09:39:25  profilanswer
 

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
n°1859156
PierreC
Posté le 09-03-2009 à 09:40:56  profilanswer
 

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
n°1859189
cedkey
Posté le 09-03-2009 à 10:24:57  profilanswer
 

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

n°1859190
PierreC
Posté le 09-03-2009 à 10:29:20  profilanswer
 

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
n°1859196
cedkey
Posté le 09-03-2009 à 10:43:59  profilanswer
 

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
mood
Publicité
Posté le 09-03-2009 à 10:43:59  profilanswer
 

n°1859204
PierreC
Posté le 09-03-2009 à 11:02:29  profilanswer
 

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
n°1859212
cedkey
Posté le 09-03-2009 à 11:14:13  profilanswer
 

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!!

n°1859245
PierreC
Posté le 09-03-2009 à 11:59:58  profilanswer
 

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


---------------
Du tofu en Alsace : www.tofuhong.com
n°1859252
cedkey
Posté le 09-03-2009 à 12:09:06  profilanswer
 

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!!!

n°1859279
fluminis
Posté le 09-03-2009 à 13:32:26  profilanswer
 

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
n°1859687
cedkey
Posté le 10-03-2009 à 10:54:14  profilanswer
 

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
n°1859700
PierreC
Posté le 10-03-2009 à 11:18:07  profilanswer
 

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
n°1865627
cedkey
Posté le 25-03-2009 à 11:52:33  profilanswer
 

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
 
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Comment remplir une base avec un fichier texte?

 

Sujets relatifs
Remplir un fichier pdf, avec des données xml, via phpRemplir une Table non liee a une database
Problème de structure de base de donnéeCSS vs JavaScript & Reduire/Agrandir texte
Affichage conditionnel - Problème d'affichagelire un fichier .txt sur une page HTML
plusieurs fichier xsd[AJAX]modifier le texte d'un div a la volée
Afficher un Fichier Postscript.PS 
Plus de sujets relatifs à : Comment remplir une base avec un fichier texte?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR