Importer csv avec php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Importer csv avec php

Re: Importer csv avec php

par pierreC » 19 oct. 2010, 11:54

Fonctions pratique qui pourrait être utilisées :
http://php.net/manual/fr/function.fgetcsv.php

ou encore mieux :
http://dev.mysql.com/doc/refman/5.0/fr/load-data.html

Re: Importer csv avec php

par moogli » 18 oct. 2010, 21:42

Salut,

Pour pouvoir réaliser un upload il faut l'indiquer dans la déclration du formulaire (par exemple): <form action="traitement.php" method="post" enctype="multipart/form-data">

le paramètre en gras est ce qui permet l'upload.

Globalement il y a des "erreurs" de débutant dans ton code :
- ne jamais présumer de l’existence de variables issue d'un formulaire
par exemple pour savoir si l'upload c'est bien réalisé :
if (is_uploaded_file($_FILES['fichier_u'][tmp_name']))
A partir de la tu peut réaliser la lecture du fichier et le traitement particulier.
pour cela j'utiliserais plutôt file et foreach.
Il faut aussi éviter de faire autant de requête insert que de de ligne dans le fichier sur un serveur mutualisé, s'il y a trop de requête a la suite y a des chances que l'hébergeur n'apprécie pas !
Pour cela on peu utiliser la syntaxe suivante : insert into nomdetable (nom, des, champs) values(premier,couple,de valeur), (deuxième,couple, de valeur),(troisème,couple, de valeur), .......

- d'où provient $action ? (1ère ligne de php) si c'est bien du formulaire il faut utiliser $_POST['action']. L'auto déclaration des variables issues de formulaire ou d'url (etc...) n'est plus faites par défaut avec php5. De plus cela permet une meilleur lisibilitée du code (ou sait rapidement d'où vient la variable.
idem pour $creertable, $bbs etc...
les @ devant les fonctions, pourquoi pas dans un script mise en "production" mais la il faut éviter pour débugguer facilement et ainsi avoir des messages d'erreur facilement et les corriger.

- tu a plusieurs case à cocher "creertable" tu ne peut faire la différence entre chaque, si une est décochée impossible de le savoir ! pour cela il faut utiliser un "value".
il pourrait être intéressant de vérifier si la table existe avant de lancer la requête de création et d'avoir un message d'erreur (avec if not exists par exemple).

je modifierais ton code ainsi (non testé).
<html>
<head>
<title>Importer un fichier texte dans une bdd MySQL</title>
</head>
<body>
<h2>Importer un fichier texte dans une bdd MySQL</h2>

<?php
if (isset($_POST['action']) && ($_POST['action']== 'ajouter')) {
  /* LECTURE ET AJOUT DES DONNEES DANS LA TABLE */

/* Variables */
   $bdd = "prévision"; /* 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 (isset($_POST['creertable'])){
// d'où sort $bbs ?
  $query  = "CREATE TABLE if not exists $bss( rtch_attempts varchar(24) NOT NULL,rtch_successfully_seized varchar(24) NOT NULL,rtch_traffic_offered varchar(24) NOT NULL,rtch_erlang_busy_hour varchar(24) NOT NULL,sdcch_attempts varchar(24)NOT NULL, PRIMARY KEY (rtch_attempts))";
  $result = mysql_query($query);
  }
 
if (is_uploaded_file($_FILES['fichier_u']['tmp_name'])) {
     $fp = fopen("$fichier", "r");
}
else{ /* le fichier n'existe pas */
       echo "Fichier introuvable !<br>Importation stoppée.";
       //exit(); <= non non un pbeau message d'erreur et l'affichage de la page complete
     }
    $file = file($_FILES['fichier_u']['tmp_name']);
    foreach ($file as $liste){
       /* On récupère les champs séparés par ; dans liste*/
       $liste = explode( ";",$ligne);
       /* On assigne les variables */
         $rtch_attempts = $liste[0];
         $rtch_successfully_seized = $liste[1];
         $rtch_traffic_offered = $liste[2];
         $rtch_erlang_busy_hour = $liste[3];
         $sdcch_attempts = $liste[4];
       /* Ajouter un nouvel enregistrement dans la table */
       $query = "INSERT INTO $bss VALUES('$rtch_attempts','$rtch_successfully_seized','$rtch_traffic_offered','$rtch_erlang_busy_hour','$sdcch_attempts')";
       $result= mysql_query($query); //en minuscule
       if($result === false)
        { /* Erreur dans la base de donnees, surement la table qu'il faut créer */
           print "Erreur dans la base de données : ".mysql_error().'<br />avec la requete '.$query;
           print "<br>Importation stoppée.";
           //exit();
        }
       else /* Tout va bien */
         print "$rtch_attempts $rtch_successfully_seized $rtch_traffic_offered $rtch_erlang_busy_hour $sdcch_attempts <br>";
     }
     
     echo "<br>Importation terminée, avec succès.";
     mysql_close();
}
   /* FORMULAIRE DE CHOIX D'IMPORTATION */ 
else {  
echo <<<EOT
    <form method="post" action="" enctype="multipart/form-data">
     Cocher les cellules à importer
     <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="file" name="fichier"> </td>
      </tr>
      <tr>
      <tr>
       <td>rtch_attempts :</td>
       <td> <input type="checkbox" name="creertable" checked> </td>
      </tr>
      <tr>
     <tr>
       <td>rtch_successfully_seized:</td>
       <td> <input type="checkbox" name="creertable" checked> </td>
      </tr>
      <tr>
     <tr>
       <td>rtch_traffic_offered</td>
       <td> <input type="checkbox" name="creertable" checked> </td>
      </tr>
      <tr>
     <tr>
       <td>rtch_erlang_busy_hour</td>
       <td> <input type="checkbox" name="creertable" checked> </td>
      </tr>
      <tr>
     <tr>
       <td>sdcch_attempts</td>
       <td> <input type="checkbox" name="creertable" checked> </td>
      </tr>
      <tr>
        <td></td> 
       <td> <input type="submit" name="submit" value="Importer !"> </td>
      </tr>
     </table>
     <input type="hidden" name="action" value="ajouter"> 
    </form>
EOT;
}
?>
</body>
</html>
pour load data infile => http://dev.mysql.com/doc/refman/5.1/fr/load-data.html

@+

Importer csv avec php

par pagnah » 18 oct. 2010, 14:57

salut tout le monde, je suis un débutant en php, et il se fait qu'on me demande de faire un petit programme php permettant de d'enregistrer (faire la mise à jour d'une table) existant ou la creer ds la base de données à partir de fichier csv. Après quelques recherches j'ai fini par faire un code que voici:

Code : Tout sélectionner

<html> <head> <title>Importer un fichier texte dans une bdd MySQL</title> </head> <body> <h2>Importer un fichier texte dans une bdd MySQL</h2> <? switch($action) { /* LECTURE ET AJOUT DES DONNEES DANS LA TABLE */ case "ajouter": /* Variables */ $bdd = "prévision"; /* 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 $bss( rtch_attempts varchar(24) NOT NULL,rtch_successfully_seized varchar(24) NOT NULL,rtch_traffic_offered varchar(24) NOT NULL,rtch_erlang_busy_hour varchar(24) NOT NULL,sdcch_attempts varchar(24)NOT NULL, PRIMARY KEY (rtch_attempts))"; $result= MYSQL_QUERY($query); } /* On ouvre le fichier à importer en lecture seulement */ $fichier = $_FILES['fichier_u']['tmp_name']; 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,2000); /* On lit une ligne */ /* On récupère les champs séparés par ; dans liste*/ $liste = explode( ";",$ligne); /* On assigne les variables */ $rtch_attempts = $liste[0]; $rtch_successfully_seized = $liste[1]; $rtch_traffic_offered = $liste[2]; $rtch_erlang_busy_hour = $liste[3]; $sdcch_attempts = $liste[4]; /* Ajouter un nouvel enregistrement dans la table */ $query = "INSERT INTO $bss VALUES('$rtch_attempts','$rtch_successfully_seized','$rtch_traffic_offered','$rtch_erlang_busy_hour','$sdcch_attempts')"; $result= MYSQL_QUERY($query); if(mysql_error()) { /* Erreur dans la base de donnees, surement 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 "$rtch_attempts $rtch_successfully_seized $rtch_traffic_offered $rtch_erlang_busy_hour $sdcch_attempts <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\">"; ?> Cocher les cellules à importer <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="file" name="fichier"> </td> </tr> <tr> <tr> <td>rtch_attempts :</td> <td> <input type="checkbox" name="creertable" checked> </td> </tr> <tr> <tr> <td>rtch_successfully_seized:</td> <td> <input type="checkbox" name="creertable" checked> </td> </tr> <tr> <tr> <td>rtch_traffic_offered</td> <td> <input type="checkbox" name="creertable" checked> </td> </tr> <tr> <tr> <td>rtch_erlang_busy_hour</td> <td> <input type="checkbox" name="creertable" checked> </td> </tr> <tr> <tr> <td>sdcch_attempts</td> <td> <input type="checkbox" name="creertable" checked> </td> </tr> <tr> <td></td> <td> <input type="submit" name="submit" value="Importer !"> </td> </tr> </table> <input type="hidden" name="action" value="ajouter"> </form> <? break; } ?> </body> </html>
il se fait que quand je compile la page ( si c'est comme çà on le dit :) ) je ne vois que la partie html en fait, or j'ai vu un code sur le forum ou l'on parle du LOAD DATA INFILE, mais il se fait que j'ai un peu de mal à insérer çà dans mon code, :priere: je vous prierais par tout les dieux de me venir en aide afin que je puisse évoluer dans le projet, merci bien à tous.