CSV vers SQL en 1 coup

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 : CSV vers SQL en 1 coup

par zeus » 08 janv. 2006, 18:52

Ecoute, quand on te donnes une solution, tu n'en veux pas ...

Je n'ai pas regardé ton code en détail mais n'y aurais t'il pas un problème de latence de transfert ? Que tu cherches à intérroger un document qui n'est pas entièrement uploadé ?

Du côté de LOAD DATA INFILE, tu peut interroger un fichier à distance, c'est à dire sans avoir besoin de le télécharger

par eric269 » 08 janv. 2006, 01:04

Il n'y a pas moyen de charger un csv en un coup, le code complet montré plus haut le permet en local, mais pas en ligne.
En deux fois ça marche, envoyer le fichier csv dans un dossier, puis executer le script.

par eric269 » 07 janv. 2006, 12:30

Le problème vient définitivement de l'envoi du fichier. En retournant le code dans tout les sens, il doit manquer quelque chose au niveau de l'envoi et de la lecture du fichier csv.

par eric269 » 06 janv. 2006, 23:22

A la base, tout marche bien avec Easyphp.
Ensuite, j'ai tout balancé en ligne et la page me dit que le fichier est introuvable.
En chipotant un peu, je me demande si avec les nouvelles versions, ce n'est pas "fgets, fopen ou encore feof" qui me posent problème.
De plus, en lisant le début de ce sujet, je dois respecter les valeurs de certains champs, type "double(6,0)", supprimer la première ligne qui contient les titres de colone et aussi supprimer les champs vides (sacré Excel !)
Je tiens cependant une attention à ton observation, j'vais essayé...

par zeus » 06 janv. 2006, 22:28

et bah tu sais quoi, en cherchant dans la doc, tu aurais vu l'option REPLACE

par eric269 » 06 janv. 2006, 22:22

J'ai même essayé
$query2 = "LOAD DATA INFILE '$fichier' INTO $table VALUES
	   ('','$nom','$prenom')"; 
       $result = MYSQL_QUERY($query2);
et t'sé pas quoi, hé ben ça marche pas non plus

par zeus » 06 janv. 2006, 16:43

Avec LOAD DATA INFILE, il te transfère toutes les données d'un coup, pas besoin de boucle WHILE

par eric269 » 06 janv. 2006, 15:49

Pour rappel :

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

  /* Variables Local */
   $bdd = "cai"; /* Base de données */
   $table= "engine_bs";
   $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); 

  /* Vidange de la table */
 if ($erase_all_file)
  {
  
	   $query1 = "TRUNCATE TABLE `$table`";
	   $result1= MYSQL_QUERY($query1);
  }
   
 /* 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,6144); /* 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 */ 
       $query2 = "INSERT INTO $table VALUES
	   ('','$nom,'$prenom')"; 
       $result = MYSQL_QUERY($query2); 
  
       /* On supprime la 1ère ligne (celle qui contient les titres de colones) */
  	   $query3 = "DELETE FROM $table WHERE id LIKE '1'"; 
                   $result = MYSQL_QUERY($query3); 
	   
	   /* On supprime les lignes vides (si on a selectionné des cellules vides dans Excel) */
  	   $query4 = "DELETE FROM $table WHERE nom LIKE ''"; 
       $result = MYSQL_QUERY($query4); 
       
	   if(mysql_error())
        { /* Erreur dans la base de donnees */
           print "Erreur dans votre fichier ".mysql_error();
           print "<br>Importation stoppée.";
           exit();
        } 
       else /* Tout va bien */
		 echo "-";
     } 
     
     echo " 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\">"; ?>
     <div align="center"><b>Sélectionnez le fichier CSV</b><br><br>
     <table border="0" cellspacing="0" cellpadding="3">
      <tr>
       <td>Fichier : <input type="file" name="fichier" value="fichier"></td> 
      </tr>
      <tr>
       <td align="center">Supprimer les données existantes <input type="checkbox" name="erase_all_file" checked> </td> 
      </tr>
      <tr>
       <td align="center"> <input type="submit" name="submit" value="Envoyer"> </td> 
      </tr>
     </table>
     <input type="hidden" name="action" value="ajouter">  
    </form>
	</div>
   <? 
   break;
   }
  ?>

Donc à la place de :

INSERT INTO $table VALUES

j'ai essayé :

LOAD DATA INF

en suivant les exemple dans ma ref MySql

bon bizarement ça marche pas en ligne...

par zeus » 06 janv. 2006, 14:56

Tu as essayé quoi avec LOAD DATA INFILE ?

par eric269 » 06 janv. 2006, 14:41

Figures-toi que j'ai essayé, ça ne marche pas non plus...

Re: CSV vers SQL en 1 coup

par drommk » 06 janv. 2006, 13:07

Hello,
j'ai ici un petit formulaire qui permet d'envoyer un fichier csv sur un table.
Mon problème est que les données s'ajoutent et qu'idéalement elles devraient être remplacées.
euh... au risque de paraître stupide, j'ai pas lu tout ton code mais je vois que tu utilises un INSERT.

Pourquoi pas un LOAD DATA INFILE ??

par eric269 » 06 janv. 2006, 12:56

Bon, j'ai essayé le formulaire avant et après le code, la page me renvoi :

Fichier introuvable !
Importation stoppée.

Encore une fois en local ça fonctionne sans problème

Grrrr

par eric269 » 06 janv. 2006, 12:39

Oui tu as raison, le fichier se trouve en fin de page, il apparait dans le formulaire.
Ce que je ne comprend pas, en local, ça marche, mais pas en ligne.
Je vais remonter le formulaire avant le code...

par Cyrano » 06 janv. 2006, 09:56

Si le fichier est introuvable, c'est que le chemin indiqué vers le fichier n'est pas bon... Si je regarde le dernier code que tu as mis, je vois ceci:
if (file_exists($fichier))
Donc logiquement, je remonte dans le code pour voir à quoi correspond cette variable $fichier... et je ne le trouve nulle part... :-k

par eric269 » 06 janv. 2006, 09:39

Bonne Année à tous
Bon j'ai été un peu vite pour mettre résolu : en local, ça marche mais en ligne, ça marche pas.
La page m'indique :

Fichier introuvable ! Importation stoppée.

Je crois que ça viens de (!feof($fp))

Si quelqu'un a une idée ?

Merci à tous