CSV vers SQL en 1 coup

Eléphanteau du PHP | 30 Messages

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

Eléphanteau du PHP | 30 Messages

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

Petit nouveau ! | 4 Messages

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

Eléphanteau du PHP | 30 Messages

06 janv. 2006, 14:41

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 janv. 2006, 14:56

Tu as essayé quoi avec LOAD DATA INFILE ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 30 Messages

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 30 Messages

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 janv. 2006, 22:28

et bah tu sais quoi, en cherchant dans la doc, tu aurais vu l'option REPLACE
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 30 Messages

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

Eléphanteau du PHP | 30 Messages

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.

Eléphanteau du PHP | 30 Messages

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer