Aide pour importer des données dans une table avec LOAD DATA

Eléphanteau du PHP | 23 Messages

11 nov. 2009, 12:51

Bonjour à tous,

Je débute (mais avance bien ;) ) et je dois proposer l'importation d'un fichier dans une table SQL par des utilisateurs lambda. Pas question de leur laisser Phpmyadmin donc...
Je cherche donc à utiliser la fonction qui va bien...

Je commence donc par récupérer un fichier CSV issu d'Excel et qui est sous cette forme :

Code : Tout sélectionner

-;XX;Marque test;Produit 1;Connecteur MDR mâle type 1;100;100;pièce;1;100;2.59;600;2.39;1100;2.19;-;-;-;- -;XX;Marque test;Produit 2;Connecteur MDR mâle type 2;100;100;pièce;14;100;1.85;600;1.71;1100;1.57;-;-;-;- -;XX;Marque test;Produit 3;Connecteur MDR mâle type 3;100;100;pièce;14;100;1.96;600;1.81;1100;1.66;-;-;-;- -;XX;Marque test;Produit 4;Connecteur MDR mâle type 4;100;100;pièce;1;100;2.81;600;2.6;1100;2.38;-;-;-;- -;XX;Marque test;Produit 5;Connecteur MDR mâle type 5;100;100;pièce;14;100;5.93;600;5.48;1100;5.02;-;-;-;-
Je propose l'envoi de ce fichier par un petit formulaire :

Code : Tout sélectionner

<form action="ajouter.php" method="post" enctype="multipart/form-data" name="form1"> <p><input type="file" name="file" /></p> <input type="submit" name="Submit" value="Envoyer"> </form>
Jusque là, tout va bien... Ensuite, je dois exploiter ce fichier... C'est là que je coince depuis des heures !!!

Voici ce que j'ai écris :

Code : Tout sélectionner

if (isset($_FILES['file'])) { $file = $_FILES['file']['tmp_name']; // Petite lecture pour vérifier $handle = fopen($file,'r'); $row = 1; $handle = fopen("$file", "r"); while (($data = fgetcsv($handle, 4096, ";")) !== FALSE) { $num = count($data); echo "<p> $num données trouvés à la ligne $row: <br /></p>\n"; $row++; } // Puis on insère les data dans la table $query= "LOAD DATA INFILE '$file' INTO TABLE $table FIELDS TERMINATED BY ';' ENCLOSED BY '\"' ESCAPED BY '\\' LINES STARTING BY '' TERMINATED BY '\r\n' "; $req = mysql_query($query) or die (mysql_error()); } ...
J'obtient systématiquement "Erreur de syntaxe près de ''' à la ligne 2" !!!
Alors que mon fichier s'importe bien via PhpMyAdmin, avec les mêmes paramètres !

HELP...

ViPHP
ViPHP | 2287 Messages

11 nov. 2009, 14:10

Bonjour,

As-tu tenté d'afficher la requête SQL générée avant son éxécution ?

Par exemple un petit :
echo $query;


Pour voir exactement ce que reçoit ton serveur MySQL. Ainsi tu pourras plus facilement détecter des erreurs dedans :)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphanteau du PHP | 23 Messages

11 nov. 2009, 15:09

Avec cette requête :

Code : Tout sélectionner

$query= "LOAD DATA INFILE '$file' INTO TABLE $table FIELDS TERMINATED BY ';' ENCLOSED BY '\"' ESCAPED BY '\\' LINES STARTING BY '' TERMINATED BY '\r\n' ";
Cela donne :

Code : Tout sélectionner

LOAD DATA INFILE 'C:\Program Files\EasyPHP5.3.0\tmp\php8F8.tmp' INTO TABLE tarifs FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\' LINES STARTING BY '' TERMINATED BY ' '
NB : J'ai essayé d'ajouter des "" autour de mes datas à importer (sachant que de toute manière, Excel ne les ajouter pas dans le CSV), mais ça ne change rien !

ViPHP
ViPHP | 2287 Messages

11 nov. 2009, 16:32

Merci pour le test. J'attire ton attention sur la fin de la requête (LINES STARTING BY ...) :

Code : Tout sélectionner

LOAD DATA INFILE 'C:\Program Files\EasyPHP5.3.0\tmp\php8F8.tmp' INTO TABLE tarifs FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\' LINES STARTING BY '' TERMINATED BY ' '
Comme tu peux le voir le \r\n a été interprété (ce qui est normal dans une chaîne encadrée par des doubles quotes (" ") en PHP. Il faudrait donc remplacer par \\r\\n pour que ça arrive comme tu le souhaites au serveur MySQL.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphanteau du PHP | 23 Messages

11 nov. 2009, 17:13

Je corrige donc de cette manière ?

Code : Tout sélectionner

$query= "LOAD DATA INFILE '$file' INTO TABLE $table FIELDS TERMINATED BY ';' ENCLOSED BY '\"' ESCAPED BY '\\' LINES STARTING BY '' TERMINATED BY '\\r\\n' ";
Mais cela donne :
Erreur de syntaxe près de '\r\n'' à la ligne 1

et $query prend la valeur :

Code : Tout sélectionner

LOAD DATA INFILE 'C:\Program Files\EasyPHP5.3.0\tmp\php91A.tmp' INTO TABLE tarifs FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\' LINES STARTING BY '' TERMINATED BY '\r\n'

Eléphanteau du PHP | 23 Messages

11 nov. 2009, 20:44

Bon voici mon code complet (qui ne marche toujours pas !), cela vous donnera peut-être plus d'idées ?

Code : Tout sélectionner

<?php include("include/dbconnect.php"); if (isset($_FILES['file'])) { $file = $_FILES['file']['tmp_name']; $handle = fopen($file,'r'); $row = 1; $handle = fopen("$file", "r"); while (($data = fgetcsv($handle, 4096, ";")) !== FALSE) { $num = count($data); echo "<p> $num champs de données trouvés à la ligne $row: <br /></p>\n"; $row++; } echo "Nom du fichier : $file <p>"; $query = "LOAD DATA INFILE '$file' INTO TABLE $table FIELDS TERMINATED BY ';' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '' "; echo "Affichage de la requête pour vérification : <br>"; echo $query; echo "<br><br><br>"; $req = mysql_query($query) or die (mysql_error()); } ?>
Et le résultat d'affichage qu'il génère :

Code : Tout sélectionner

19 champs de données trouvés à la ligne 1: 19 champs de données trouvés à la ligne 2: 19 champs de données trouvés à la ligne 3: 19 champs de données trouvés à la ligne 4: 19 champs de données trouvés à la ligne 5: Nom du fichier : C:\Program Files\EasyPHP5.3.0\tmp\php21.tmp Affichage de la requête pour vérification : LOAD DATA INFILE 'C:\Program Files\EasyPHP5.3.0\tmp\php21.tmp' INTO TABLE tarifs FIELDS TERMINATED BY ';' ENCLOSED BY '' ESCAPED BY '\' LINES TERMINATED BY '' Erreur de syntaxe près de ''\' LINES TERMINATED BY ''' à la ligne 1
Vraiment, je suis sec là... Help !

Eléphanteau du PHP | 23 Messages

12 nov. 2009, 08:01

Code : Tout sélectionner

$file = mysql_real_escape_string($file);
Avant la requête a résolu mon problème... Prob d'escape donc mais en amont de la requête, ce qui m'a fait foirer !