Probleme de tableau aprés un explode [PHP] - PHP - Programmation
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.
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 ?
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"
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 ?
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
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. |
Ca peut résoudre ton pb dans ce sens où elle a été bien codée et testée (au contraire de ta fonction)
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)
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.
Marsh Posté le 19-07-2007 à 15:46:37
l'étape d'après c'est sprintf + mysql_real_escape ( pour ta requete)
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 !
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...
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.
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!
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)