Problème pour insérer un fichier CSV

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 : Problème pour insérer un fichier CSV

Re: Problème pour insérer un fichier CSV

par fab » 08 nov. 2009, 16:47

Le problème ne vient pas de Mac mais tu fais que tu as mis un délimiter de ligne vide en paramètre de ta fonction fgetscsv, c'est le dernier parametre que tu as mis, au passage il est optionnel donc t'es pas obligé de le remplir et php va s'en occuper tout seul :)

Ps Hs : Dédicace Calimero

Re: Problème pour insérer un fichier CSV

par street51 » 07 nov. 2009, 16:51

Ca y est !

Le problème venait du fait que j'étais sous Mac, pour le résoudre il suffit d'ajouter au début du script :
ini_set('auto_detect_line_endings',TRUE);
Merci à ceux qui m'ont aidé. :wink:

Re: Problème pour insérer un fichier CSV

par street51 » 07 nov. 2009, 13:24

J'ai remplacé
$ligne = fgets($fp,4096);
$liste = explode( ";",$ligne);  
par
$liste = fgetcsv($fp,4096,';','');
Mais le problème reste le même, y'a-t-il autre chose à modifier ?

Re: Problème pour insérer un fichier CSV

par fab » 07 nov. 2009, 12:31

Re: Problème pour insérer un fichier CSV

par street51 » 07 nov. 2009, 10:51

Aïe, autre petit souci !

Je crée mon fichier CSV depuis Excel, il ressemble à ceci :
1;12;13;8,5
2;13,4;11;8,3
Quand je lis le fichier, il ne semble pas reconnaître le saut de ligne entre 8,5 et 2.
Dans ma BDD, il ne modifie donc que la valeur n°1, et attribue "8.5 2" (le 2 étant à la ligne dans ma BDD) pour le dernier champ...

Voici mon code, légèrement modifié par rapport à celui ci-dessus :
<?
 switch($action)
 {
   case "ajouter":

if ($fichier == "none")
	{
	print "Spécifier un fichier à envoyer.";
	}

else
	{	
	$dest_file="notes.csv";

	$source_file=stripslashes($fichier);
	
	$res_copy=copy($source_file , $dest_file);
	
	print "Fichier envoyé.";
	}
	
   $bdd = "xxx";
   $host= "xxx";
   $user= "xxx";
   $pass= "xxx";

   @mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données"); 
   @mysql_select_db($bdd); 
   
 if (file_exists($fichier))
     $fp = fopen("$fichier", "r"); 
 else
     { 
       echo "Fichier introuvable !<br>Importation stoppée.";
       exit();
     }
      
    while (!feof($fp)) 
    { 
       $ligne = fgets($fp,4096); 

       $liste = explode( ";",$ligne);  
    
       $num = $liste[0]; 
       $shs = $liste[1]; 
       $physique = $liste[2]; 
       $chimie = $liste[3]; 
       $shs = preg_replace("#,#", '.', $shs);    
       $physique = preg_replace("#,#", '.', $physique);    
       $chimie = preg_replace("#,#", '.', $chimie);
           
       $query = "UPDATE P1 SET shs='$shs', physique='$physique', chimie='$chimie' WHERE num='$num'"; 
       $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 "$num $shs $physique $chimie<br>";
     } 
     
     echo "<br><b>Importation Ok !</b>"; 

     fclose($fp); 
     MYSQL_CLOSE(); 
   
   break;
   
   default: 
   ?>  
   <? echo "<form method=\"post\" action=\"$PHP_SELF\" ENCTYPE=\"multipart/form-data\">"; ?>
<input type="file" name="fichier" enctype="multipart/form-data"><br>
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
<input type="submit" name="submit" value="OK !"><input type="hidden" name="action" value="ajouter">  
    </form>
   <? 
   break;
   
   }

  ?>
Si je rajoute un "," à la fin de chaque ligne de mon fichier CSV, la 1ère ligne est enregistrée correctement, mais il ne se passe toujours rien pour la 2e... :(

Re: Problème pour insérer un fichier CSV

par street51 » 06 nov. 2009, 12:22

Merci, le problème a pu être résolu en remplaçant le INSERT par UPDATE. :wink:

Re: Problème pour insérer un fichier CSV

par Yosh » 06 nov. 2009, 11:56

Met un echo devant ta requête, il doit y avoir un $num qui fait planter la query.

Problème pour insérer un fichier CSV

par street51 » 06 nov. 2009, 11:13

Bonjour,
Je possède une base de données contenant des noms d'étudiants et un numéro d'anonymat qui leur est attribué pour leur examen.
A côté, j'ai leur note (de physique) et leur numéro d'anonymat dans un fichier Excel, que j'ai enregistré au format CSV.

Afin d'insérer les notes dans les base MySQL, chaque note correspondant donc à un numéro, j'utilise ce script :
<?
 switch($action)
 {
   case "ajouter":

   $bdd = "xxx";
   $host= "xxx";
   $user= "xxx";
   $pass= "xxx";

   @mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données"); 
   @mysql_select_db($bdd); 
   

 if (file_exists($fichier))
     $fp = fopen("$fichier", "r"); 
 else
     {
       echo "Fichier introuvable !<br>Importation stoppée.";
       exit();
     }
      
    while (!feof($fp))
    { 
       $ligne = fgets($fp,4096);

       $liste = explode( ";",$ligne);  
    
       $num = $liste[0]; 
       $physique = $liste[1]; 
    
       $query = "INSERT INTO P1 (physique) VALUES('$physique') WHERE num='$num'"; 
       $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 "$num $physique <br>";
     } 
     
     echo "<br>Importation terminée, avec succès."; 
       
     fclose($fp); 
     MYSQL_CLOSE(); 
   
   break;

   
   default: 
   ?>  
   <? echo "<form method=\"post\" action=\"$PHP_SELF\">"; ?>
     <table border="0" cellspacing="0" cellpadding="3">
      <tr>
       <td>Fichier :</td> 
       <td> <input type="text" name="fichier"> </td> 
      </tr>
        <td></td>  
       <td> <input type="submit" name="submit" value="Ajouter !"> </td> 
      </tr>
     </table>
     <input type="hidden" name="action" value="ajouter">  
    </form>
   <? 
   break;
   
   }

  ?>
Dans le champ fichier, j'indique le nom du fichier uploadé (Classeur1.csv) dans le même dossier que mon script.

Seul problème, j'obtiens un message d'erreur, et je ne trouve pas ce qui cloche...
Erreur dans la base de données : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE num='1'' at line 1
Importation stoppée.
Si quelqu'un pouvait m'éclairer, ce serait sympa... :priere: