[PHP]Probleme de tableau aprés un explode

Probleme de tableau aprés un explode [PHP] - PHP - Programmation

Marsh Posté le 19-07-2007 à 11:44:14    

Bonjour j'ai un probleme avec mon code pour alimenter une base de donnée depuis un fichier .csv
 
Je ne vois pas ce qui pause probleme dans ce code d'autant plus que les information sont correctement enregistrées dans la base.
Simplement les ça me genere une notice par rang du tableau de l'expode (sauf le rang0).
 
Voici le code en question :
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>W7</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
   
    <body>
 
<?php
 
mysql_connect("localhost", "root", "" );
mysql_select_db("test_stage" );
 
 $nb_ligne = 0;
 $nb_champs = 0;
 
 $fichier_csv = @fopen("traitement_fichier_csv.csv", "r" );
 if($fichier_csv)
 {
  while (!feof($fichier_csv))
  {
   $curent_ligne = fgets($fichier_csv, 4096);
   $champs = explode(";", $curent_ligne);
   $nb_ligne++;
   mysql_query("INSERT INTO test_csv VALUES('$champs[0]', '$champs[1]', '$champs[2]', '$champs[3]', '$champs[4]', '$champs[5]', '$champs[6]', '$champs[7]', '$champs[8]', '$champs[9]', '$champs[10]', '$champs[11]', '$champs[12]', '$champs[13]', '$champs[14]', '$champs[15]', '$champs[16]')" );
  }
  print($nb_ligne . " lignes ajoutées." );
 }
 fclose($fichier_csv);
mysql_close();
?>
 
 </body>
</html>
 
 
Et l'erreur retournée :
 
Notice: Undefined index: 1 in d:\stage\tests_temp\traitement_fichier_csv.php on line 26
 
Notice: Undefined index: 2 in d:\stage\tests_temp\traitement_fichier_csv.php on line 26
 
Notice: Undefined index: 3 in d:\stage\tests_temp\traitement_fichier_csv.php on line 26
 
Notice: Undefined index: 4 in d:\stage\tests_temp\traitement_fichier_csv.php on line 26
 
Notice: Undefined index: 5 in d:\stage\tests_temp\traitement_fichier_csv.php on line 26
 
(et ainsi de suite jusqu'à 16)

Reply

Marsh Posté le 19-07-2007 à 11:44:14   

Reply

Marsh Posté le 19-07-2007 à 11:50:11    

avant de faire le mysql_query tu devrais faire un print_r($champs) (ou un var dump) pour voir si ton tableau est bien rempli des bonnes valeurs.

Reply

Marsh Posté le 19-07-2007 à 12:15:05    

Et à la première apostrophe dans le fichier, tout pète :(

Reply

Marsh Posté le 19-07-2007 à 12:21:38    

bah oui justement ...

Reply

Marsh Posté le 19-07-2007 à 12:24:19    

Ben apparement le tablea est bien repli, j'obtient Array([0] => "une valeur correcte" [1] "idem etc puiis ça recommence (vu qu 'il y a un while) et à la fin j'ai Array([0] => ).
 
Je pense avoir compris, à la derniere boucle du while il en prend en compte que l'indice 0.
 
Mais pourquoi ?

Reply

Marsh Posté le 19-07-2007 à 12:30:53    

1- Y'a une fonction php (fgetscv) toute fait pour lire les csvs pourquoi réinventer la roue?
2- Tu peux directement loader un csv dans mysql via l'instruction "load data infile"

Reply

Marsh Posté le 19-07-2007 à 12:43:03    

J'ai regardé le détail de la fonction fgetscv apparement elle ne fait rien de plus qu'une explode couplé avec une fgets donc je ne vois pas en quoi ça résoudrait mon probleme.
 
Par contre load data infile est une fonction mysql ?

Reply

Marsh Posté le 19-07-2007 à 14:28:09    

Moriar6 a écrit :

J'ai regardé le détail de la fonction fgetscv apparement elle ne fait rien de plus qu'une explode couplé avec une fgets


Euh nan, elle est un peu plus complexe qu'un simple explode. cf. /ext/standard/file.c. C'est un beau monstre

Reply

Marsh Posté le 19-07-2007 à 15:23:53    

Moriar6 a écrit :

J'ai regardé le détail de la fonction fgetscv apparement elle ne fait rien de plus qu'une explode couplé avec une fgets donc je ne vois pas en quoi ça résoudrait mon probleme.
 
Par contre load data infile est une fonction mysql ?


 
Ca peut résoudre ton pb dans ce sens où elle a été bien codée et testée (au contraire de ta fonction) :o  
Par ex, avant de faire ton mysql_query, ça serait bien que tu vérifies que t'as le bon compte de champ : if (count($champs) == 16)
 

Reply

Marsh Posté le 19-07-2007 à 15:34:57    

D'accord et bien je vais testé comme ça je vous remercie je ne connaissais pas cette fonction (en même temps il y en a tellement qu'on se fait souvent chier à recoder des truc existants).
 
Ce que je crain c'est que ça me genre le même probleme qu'avec mon code étant donné que les lignes que je traite comportent des ' du coup certaines lignes ne sont pas entrées.
 
J'ai résolu ce probleme de mon coté avec un str_replace mais j'ai toujours les notices en fin de code.

Reply

Marsh Posté le 19-07-2007 à 15:34:57   

Reply

Marsh Posté le 19-07-2007 à 15:46:37    

l'étape d'après c'est sprintf + mysql_real_escape ( pour ta requete)


Message édité par anapajari le 19-07-2007 à 15:46:45
Reply

Marsh Posté le 19-07-2007 à 16:23:33    

Probleme résolu avec un simple if($champ[0] = NULL) break;
 
C'est résolu donc :) merci à tous !

Reply

Marsh Posté le 19-07-2007 à 16:31:38    

sauf que tu vérifies toujours pas si t'as bien le bon nb de champs avant de procéder à leur insertion dans ta bd...:/ T'as l'air malin s'il te manque un champ dans l'une des lignes...

Reply

Marsh Posté le 20-07-2007 à 08:28:15    

Ben si il manque un champ ça mettra un champ vide (rien entre les ";" ).
Je vois pas où est le probleme.
 
Mais bon effectivement c'est mieux d'utiliser une fonction déjà codée histoire déviter toutes les erreur auxquelles je ne pense même pas.


Message édité par Moriar6 le 20-07-2007 à 08:34:19
Reply

Marsh Posté le 20-07-2007 à 10:29:43    

c'est pas ce que je voulais dire. Ton script part du principe que le fichier csv est bien formé (i.e., chaque ligne a bien le même nb de colonnes) : c'est dangereux!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed