IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Import CSV dans MySQL


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Par défaut Import CSV dans MySQL
    Bonjour,
    j'ai un petit code qui me plait beaucoup et me permet d'importer un fichier CSV dans mysql a partir d'un bouton "Parcourir"
    Le probleme est le code en lui-meme, la logique a l'air bonne mais il ne fonctionne pas

    Pouvez vous me donner quelques elements de reponses pour le modifier simplement ?

    page d'upload :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
      <? echo "<form name='form1' method='post' action=".$_SERVER['PHP_SELF']." enctype='multipart/form-data'>"; ?>
         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="file" name="fichier_u"> </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;
     
       }
     
      ?>

    Page d'appel (meme si elle n'est pas appelé. D'ailleurs j'voulais vos reactions quand a l'utilisation du $_SERVER['PHP_SELF'] pour ce type de tache)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    <?
     switch($action)
     {
      /* LECTURE ET AJOUT DES DONNEES DANS LA TABLE */
       case "ajouter":
     
     /* Variables */
       $bdd = "newsletter"; /* 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( val1 int(4), val2 varchar(4), val3(24), val4 varchar(4) )"; 
      $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,9); /* On lit une ligne */  
     
           /* On récupère les champs séparés par ; dans liste*/
           $liste = explode( ";",$ligne);  
     
           /* On assigne les variables */ 
           $val1 = $liste[0];
           $val2 = $liste[1];
           $val3 = $liste[2];
           $val4 =  $liste[3]; 
     
           /* Ajouter un nouvel enregistrement dans la table */ 
           $query = "INSERT INTO $table VALUES('$val1','$val2','$val3','$val4')"; 
           $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 "$val1 $val2 $val 3 $val4 <br>";
         } 
     
         echo "<br>Importation terminée, avec succès."; 
     
         /* Fermeture */ 
         fclose($fp); 
         MYSQL_CLOSE(); 
     
       break;
     
     
       /* FORMULAIRE DE CHOIX D'IMPORTATION */  
     
       default: 
       ?>

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Salut,

    Tu as quoi comme type d'erreur ?

    Amuse toi à mettre des echos un peu partout pour voir où ton script bloque, et fais nous part de tes résultats. Parce que la on sait pas vraiment quel est le problème.

    Cordialement,

    EDIT : regarde si ton if($creertable) c'est bon, car je ne vois pas à quoi cela sert... la variable n'est pas initialisé avant, donc elle ne doit pas exister. De plus quand on initialise pas la variable... le seul choix c'est un test d'égalité du style if($creertable = jensaisrien){ ... } .

    EDIT2 : Tu récupères pas tes variables avec $_POST[''], essai if($creertable=$_POST['creertable']){...} // Vu que j'EDIT je ne vois pas si mon creertable correspond au tien, mais bon adapte le code ^^.

  3. #3
    Membre confirmé Avatar de Akramweb
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2005
    Messages : 227
    Par défaut
    essai sa :
    formulaire.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <form method="post" action="insert.php" enctype='multipart/form-data'>
         Pour ajouter ton serveur il suffit de remplir ce formulaire 
         <table width="357" border="0" cellpadding="3" cellspacing="0">
           <!--DWLayoutTable-->
          <tr>
           <td height="28">Fichier :</td> 
           <td colspan="2" valign="top"> <input type="file" name="fichier"> </td> 
           </tr>
          <tr>
            <td></td>  
           <td width="144"> <input type="submit" name="submit" value="Charger !"> </td> 
           <td width="109"></td>
          </tr>
         </table>
        </form>
    insert.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <?php
    $base="database";
    $conn= mysql_connect("localhost","root","");
    mysql_select_db($base,$conn);
     
     $fichier=$_FILES['fichier']['name'];
     $fichier=$_FILES['fichier']['tmp_name']; 
     
        $fp = fopen("$fichier","r"); 
     
        while (!feof($fp)){
     
         $separateur=";";
         $ligne = fgets($fp,4096);
         $liste = explode("$separateur", "$ligne");    
     
         $responsable = $liste[0]; 
         $societe = $liste[1]; 
         $nom = $liste[2]; 
         $prenom = $liste[3]; 
         $fonction = $liste[4]; 
         $telephone = $liste[5]; 
         $fax = $liste[6];      
         $portable = $liste[7];            
         $email = $liste[8];              
         $date = date("d-m-Y");
     
    $responsable=str_replace("'","`","$responsable");
    $societe=str_replace("'","`","$societe");
    $nom=str_replace("'","`","$nom");
    $prenom=str_replace("'","`","$prenom");
    $fonction=str_replace("'","`","$fonction");
    $telephone=str_replace("'","`","$telephone");
    $fax=str_replace("'","`","$fax");
    $email=str_replace("'","`","$email");
     
     
    $query = "insert into t_suivi(responsable,societe,nom,prenom,fonction,telephone,fax,portable,email,date) values('$responsable','$societe','$nom','$prenom','$fonction','$telephone','$fax','$portable','$email','$date')"; 
    $result= mysql_query($query); 
     
           if(mysql_error()){ 
               print "Erreur dans la base de données : ".mysql_error();
               print "<br>Importation stoppée.";
               exit();
            } 
           else 
             print "Bien <br>"; 
         } 
         echo "<br>Importation terminée, avec succès.";
       fclose($fp);
    ?>

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    Ceci : "<?" n'est pas bon car cela ne fonctionne pas sur tous les serveurs, et pose des problème en cas d'usage de XML. Utilise "<?php".
    La variable "$table" n'est pas affectée.
    Met chaque tâche de ton code dans une fonction. Le code est plus lisible, et cela facilite le débogage. Lorsque la fonction donne le résultat attendu, tu n'as plus à t'en préoccuper, uniquement à lui passer les paramètres qu'elle attend.

    Exemple, avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    <?php
      function connexion()
      {
        /* Variables */
        $bdd = 'newsletter'; /* Base de données */
        $host= 'localhost'; /* Hote (localhost en principe) */
        $user= 'root'; /* Utilisateur */
        $pass= ''; /* Mot de passe */
     
        /* Connexion bdd */
        $connexion = mysql_connect($host,$user,$pass)
          or die('Impossible de se connecter au serveur');
        mysql_select_db($bdd)
          or die('Impossible de se connecter à la base de données');
     
        return $connexion;
      }
     
      function creeTable($table, $connexion)
      {
        /* On crée la table si elle est inexistante */
        $query = 'CREATE TABLE IF NOT EXISTS ' . $table . '( val1 int(4), val2 varchar(4), val3(24), val4 varchar(4) )';
        return mysql_query($query, $connexion);
      }
     
      function import($fichier, $table, $connexion)
      {
        $fp = fopen('$fichier', 'r');
     
        while (($data = fgetcsv($fp, 1000, ',')) !== FALSE)
        {
          $value = '\'' . implode('\',', $data) . '\'';
          echo $value . '<br>';
          $query = 'INSERT INTO ' . $table . ' VALUES(' . $value . ')';
          $result = mysql_query($query, $connexion)
            or die('problème dans la requête : ' . $query . '<br>' . mysql_error()) . '<br>Importation abandonnée';
        }
        echo '<br>Importation terminée, avec succès.';
        fclose($fp);
      }
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
      if(isset($_POST['action']))
      {
        $action = $_POST['action'];
     
        if(empty($_FILES['fichier_u']))
        {
          echo 'Rien à faire';
          exit;
        }
        else if(!file_exists($_FILES['fichier_u']['tmp_name']))
        {
          echo 'Fichier introuvable !<br>Importation stoppée.';
          exit();
        }
        else
        {
          $fichier = $_FILES['fichier_u']['tmp_name'];
        }
     
        $connexion = connexion();
     
        if(! creeTable($table, $connexion))
        {
          echo 'Echec de création de la table ' . $table;
          exit;
        }
        import($fichier, $table, $connexion);
        exit;
      }
    ?>
    <html>
      <head>
      </head>
      <body>
        <form name="form1" method="post" action="" enctype="multipart/form-data">
          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="file" name="fichier_u"> </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>
      </body>
    </html>
    C'est du vite fait, pas testé. C'est donc sans garantie.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Par défaut
    Merci beaucoup pour vos reponses

    Finalement j'ai "épuré" mon code j'me retrouve donc avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    <?php
     $fichier=$_FILES['fichier']['name'];
     $fichier=$_FILES['fichier']['tmp_name']; 
     
        $fp = fopen("$fichier","r"); 
     
        while (!feof($fp)){
     
         $separateur=";";
         $ligne = fgets($fp,4096);
         $liste = explode("$separateur", "$ligne");    
     
         $mail = $liste[0]; 
         $nom = $liste[1];       // ligne 21
         $prenom = $liste[2];   // ligne 22
     
    $mail=str_replace("'","`","$mail");
    $nom=str_replace("'","`","$nom");
    $prenom=str_replace("'","`","$prenom");
     
     
     
    $query = "insert into vdef(id,mail,nom,prenom) values('','$mail','$nom','$prenom')"; 
    $result= mysql_query($query); 
     
           if(mysql_error()){ 
               print "Erreur dans la base de données : ".mysql_error();
               print "<br>Importation stoppée.";
               exit();
            } 
           else 
             print "Bien <br>"; 
         } 
         echo "<br>Importation terminée, avec succès.";
       fclose($fp);
    ?>
    et ca me fait un peu cabler, j'me retrouve avec cette erreur quand je reinjecte les fichiers (deja injecté auparavant) :

    Erreur dans la base de données : Duplicata du champ 'xxxxx@gmail.com' pour la clef 2
    Importation stoppée.
    et quand j'injecte pour la 1er fois, j'ai l'erreur :
    Bien
    Bien
    Bien

    Notice: Undefined offset: 1 in C:\Program Files\EasyPHP 2.0b1\www\newsletter\vdef\gupload.php on line 21

    Notice: Undefined offset: 2 in C:\Program Files\EasyPHP 2.0b1\www\newsletter\vdef\gupload.php on line 22
    Bien

    Importation terminée, avec succès.
    il n'y a que 3 entrées dans le fichier, et dans mysql il m'en affiche 4 (la derniere etant vide partout sauf en ID auto_inc)


    J'aimerai que les entrées s'ajoutent a la liste et si une entrée existe deja qu'elle soit ignorée (pour ne pas faire de doublons)
    Avez vous une idée ?

    Merci d'avance !

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Salut,

    Pourquoi tu utilises ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $prenom=str_replace("'","`","$prenom");
    Tu peux montrer l'utilité dans un exemple concret ?

    Cordialement,

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Citation Envoyé par ekzouille Voir le message
    Finalement j'ai "épuré" mon code
    Bien, mais peut mieux faire. La même chose en plus épuré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
      if (empty($_FILES['fichier']))
      {
        echo 'Le nom du fichier à uploader n\'est pas renseigné';
        exit;
      }
     
      $fichier = $_FILES['fichier']['tmp_name']; 
     
      $fp = fopen($fichier, 'r'); 
     
      $separateur = ';';
      while (($liste = fgetcsv($fp, 1000, $separateur)) !== FALSE)
      {
        $query = 'INSERT IGNORE INTO vdef(mail, nom, prenom) 
                  VALUES(\'%s\', \'%s\', \'%s\')'; 
        $result = mysql_query(sprintf($query, mysql_real_escape_string($liste[0]), mysql_real_escape_string($liste[1]), mysql_real_escape_string($liste[2])))
          or die('Erreur dans la base de données : ' . mysql_error() . '<br>Importation stoppée.');
     
        echo 'Bien <br>'; 
      }
     
      fclose($fp);
     
      echo '<br>Importation terminée, avec succès.';
    ?>
    Ce qui n'exclut pas les erreurs en cas d'information erronée dans le CSV.

Discussions similaires

  1. importer.csv dans mysql
    Par artichaudd dans le forum Débuter
    Réponses: 1
    Dernier message: 07/12/2011, 23h00
  2. [MySQL] Importation .csv dans mysql
    Par Chipss dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/09/2011, 00h11
  3. [MySQL] import csv dans mysql
    Par caro_tpl dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/10/2007, 14h37
  4. Import CSV dans Mysql
    Par wylls dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/01/2007, 13h47
  5. Importer CSV dans MySQL
    Par The_freeman dans le forum Administration
    Réponses: 6
    Dernier message: 14/02/2006, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo