Lecture d'un fichier CSV échoue

Eléphanteau du PHP | 41 Messages

06 avr. 2010, 23:18

Bonjour,
Il y a quelques mois, j'avais un problème pour insérer un fichier CSV dans une BDD, qui avait été résolu et le script fonctionnait parfaitement.

J'ai voulu l'utiliser à nouveau aujourd'hui, et il ne fonctionne plus. Je n'ai touché à aucune ligne de code depuis novembre, et je n'ai pas eu à réutiliser le script depuis d'ailleurs. Lorsque je charge le fichier CSV et que je clique sur OK, je reviens sur la même page (ce qui est normal) mais il ne se passe absolument rien, je n'ai ni message de confirmation ni message d'erreur, et la BDD reste inchangée.

D'où pourrait venir le problème ? Y'aurait-il eu des changements de normes, une évolution du code, ou quelque chose dans le genre, depuis l'année dernière ?

Je vous joins l'intégralité du code pour tenter d'y voir plus clair :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="java/connect.css">

<title>Partiels blancs PCEM1/APEMK</title></head><body>
<br><br><br>
<center>
<?
ini_set('auto_detect_line_endings',TRUE);
 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é.<br>";
	}
	
   $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)) 
    { 
       $liste = fgetcsv($fp,4096,";",""); 
    
       $num = $liste[0]; 
       $anat = $liste[1]; 
       $physio = $liste[2]; 
       $bc = $liste[3]; 
       $anat = preg_replace("#,#", '.', $anat);    
       $physio = preg_replace("#,#", '.', $physio);    
       $bc = preg_replace("#,#", '.', $bc);
$anat=round($anat,2);
$physio=round($physio,2);
$bc=round($bc,2);   

       $query = "UPDATE P1 SET anat='$anat', physio='$physio', bc='$bc' 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 "";
     } 
     
     echo "<br><b>Importation Ok !</b>"; 
       
     /* Fermeture */ 
     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"><br>
<input type="submit" name="submit" value="OK !"><input type="hidden" name="action" value="ajouter">  
    </form>
   <? 
   break;  
   }
  ?>
</body> 
</html>
Merci de votre aide #-o

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 avr. 2010, 00:17

Bonjour,

Tu as posté dans le forum "PHP avancé", donc c'est à toi de faire ton debug pour nous dire d'où viens le problème.
Mets des points d'arrêt dans ton script ou si ton éditeur ne te le permet pas des die() pour voir ton script évoluer en vérifiant chaque étape... et dégage ces "@" qui servent justement à masquer les erreurs alors que justement tu pourrais en avoir besoin.
Quand tout le reste a échoué, lisez le mode d'emploi...

Invité
Invité n'ayant pas de compte PHPfrance

07 avr. 2010, 07:48

Merci pour ta réponse.

L'ennui c'est que modifier mon script ne change absolument rien, je n'ai pas l'impression qu'il soit lu, je ne sais pas vraiment ce qu'il se passe quand je valide... #-o

ViPHP
ViPHP | 5462 Messages

07 avr. 2010, 09:57

un petit LOAD_DATA pour le CVS

Mammouth du PHP | 672 Messages

07 avr. 2010, 10:25

Merci pour ta réponse.

L'ennui c'est que modifier mon script ne change absolument rien, je n'ai pas l'impression qu'il soit lu, je ne sais pas vraiment ce qu'il se passe quand je valide... #-o
Bonjour.

1. Ca t'affiche quoi ?

2. Après envoi du formulaire, ça t'affiche quoi ?

3. Mets des echo régulièrement, pour voir à quel endroit ça bogue.

4. Il y a des fichiers de log qui peuvent te donner des indications.

Eléphanteau du PHP | 41 Messages

07 avr. 2010, 10:46

Bonjour, ma page ressemble à ceci :

Image

Lorsque j'envoie le fichier notes.csv, je retombe sur la même chose, sans que le fichier ait été uploadé.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 avr. 2010, 11:58

Je pense que l'on t'a déjà donné les pistes à suivre pour débuguer ton script.
Maintenant c'est à toi de rechercher la cause du problème :
Mets des points d'arrêt dans ton script ou si ton éditeur ne te le permet pas,
mets des die() pour voir ton script évoluer en vérifiant chaque étape...
3. Mets des echo régulièrement, pour voir à quel endroit ça bogue.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 41 Messages

07 avr. 2010, 13:08

Après recherche, il semblerait que le problème vienne du formulaire.

En effet, lorsque j'ajoute $action="ajouter"; en début de script, je ne retombe plus sur le formulaire de départ mais bien sur le script censé ajouter les données. J'obtiens un "Filename cannot be empty" laissant penser qu'il ne trouve pas les données issues du formulaire.

Par contre, je ne vois pas ce qui cloche dans le formulaire.
<form method="post" action="notes_ajouter.php" ENCTYPE="multipart/form-data">
<input type="file" name="fichier" enctype="multipart/form-data"><br>
<input type="hidden" name="MAX_FILE_SIZE" value="10000000"><br>
<input type="submit" name="submit" value="OK !"><input type="hidden" name="action" value="ajouter">  
    </form>

Mammouth du PHP | 672 Messages

07 avr. 2010, 13:17

En effet, lorsque j'ajoute $action="ajouter"; en début de script, je ne retombe plus sur le formulaire de départ mais bien sur le script censé ajouter les données. J'obtiens un "Filename cannot be empty" laissant penser qu'il ne trouve pas les données issues du formulaire.
Tu l'obtiens comment ?
En général, les messages d'erreur PHP indiquent entre autres la ligne concernée...

On en revient toujours à la même chose :
Mets des points d'arrêt dans ton script ou si ton éditeur ne te le permet pas,
mets des die() pour voir ton script évoluer en vérifiant chaque étape...
3. Mets des echo régulièrement, pour voir à quel endroit ça bogue.
Ah, et aussi :
Revoie un peu le fonctionnement de base des formulaires, ainsi que la façon de récupérer les données...
Si tu es obligé de mettre $action="ajouter";, ça devrait te mettre la puce à l'oreille !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 avr. 2010, 13:33

Depuis PHP 4.2.0 (il y a 8 ans déjà), register global est à Off.

Il faut que tu revoies comment utiliser des variables externes.
:arrow: http://phpdebutant.org/article56.php
Quand tout le reste a échoué, lisez le mode d'emploi...