Problème pour insérer un fichier CSV

Eléphanteau du PHP | 41 Messages

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:

Mammouth du PHP | 568 Messages

06 nov. 2009, 11:56

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

Eléphanteau du PHP | 41 Messages

06 nov. 2009, 12:22

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

Eléphanteau du PHP | 41 Messages

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

ViPHP
fab
ViPHP | 2657 Messages

07 nov. 2009, 12:31

Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 41 Messages

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 ?

Eléphanteau du PHP | 41 Messages

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:

ViPHP
fab
ViPHP | 2657 Messages

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
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }