Probleme import csv dans une base de donnée

Probleme import csv dans une base de donnée - PHP - Programmation

Marsh Posté le 19-08-2013 à 13:52:15    

Bonjour à tous,  
 
J'ai créé une interface php afin de permettre l'import dans une base de données le contenu d'un fichier CSV légèrement modifié
Il semble cenpendant que ca ne marche pas correctement Avec mon code j'ai un bug qui créé des centaines milliers de champs vides dans ma db.
dans les csv, les colonnes sont délimitées par le symbole "|". La raison est que dans les strings que je dois insérer dans la base, il y a beaucoup de caractères spéciaux : "; , /".
 
voici le code que j'ai écris en regardant à droite à gauche sur le net ( je suis complètement débutant autodidacte) :  

Code :
  1. $fichier = fopen("upload/".$_FILES['csv']['name'], "r" );
  2.   //efface toute les données précédentes
  3.    $sql1 ="DELETE FROM personnaldb";
  4.      $req1=mysql_query($sql1)or die (mysql_error());
  5. while (!feof($fichier))
  6. {
  7. // On recupere toute la ligne
  8. $uneLigne = addslashes(fgets($fichier));
  9. //On met dans un tableau les differentes valeurs trouvés (ici séparées par un '|')
  10. $tableauValeurs = explode('|', $uneLigne);
  11.    $sql = "INSERT INTO db (champ1, champ2, champ3, champ4, champ5, champ6, champ7, champ8, champ9)
  12. VALUES
  13. ('".$tableauValeurs[0]."', '".$tableauValeurs[1]."', '".$tableauValeurs[2]."', '".$tableauValeurs[3]."', '".$tableauValeurs[4]."', '".$tableauValeurs[5]."', '".$tableauValeurs[6]."', '".$tableauValeurs[7]."','".$tableauValeurs[8]."')";


 
Je pense que le problème viens d'un boucle tournant à l'infini ( probleme avec la fonction addslashes ?).
 
 
Merci pour votre aide  :jap:


---------------
PSN : Luluberlu
Reply

Marsh Posté le 19-08-2013 à 13:52:15   

Reply

Marsh Posté le 19-08-2013 à 14:09:23    

Voila comment je ferai le feed de ta bd :

 
Code :
  1. $fichier = fopen("upload/".$_FILES['csv']['name'], "r" );
  2.       //efface toute les données précédentes
  3.        $sql1 ="DELETE FROM personnaldb";
  4.          $req1=mysql_query($sql1)or die (mysql_error());
  5.     while (!feof($fichier))
  6.     {
  7.     // On recupere toute la ligne
  8. $tmp = array();
  9. foreach(fgetcsv($fichier,1000,'|') as $key => $value){
  10.       $tmp[$key] =  mysql_real_escape_string($value,$bdd);
  11. }
  12.        $sql = "INSERT INTO db (champ1, champ2, champ3, champ4, champ5, champ6, champ7, champ8, champ9)
  13.     VALUES
  14.     ('".implode("','",$tmp)."')";
 

Voila avec $link ta connexion à la base de données


Message édité par sltpaulo le 19-08-2013 à 14:10:33
Reply

Marsh Posté le 19-08-2013 à 14:17:21    

Merci pour la réponse, je teste ca dès que possible.

 

Par contre penses tu savoir d où viens le problème (histoire que je comprenne ) :)

 

Et d où viens le 1000 dans le fgetcsv ?


Message édité par VSV-M le 19-08-2013 à 14:23:17

---------------
PSN : Luluberlu
Reply

Marsh Posté le 19-08-2013 à 14:40:27    

Pour le 1000, c'est arbitraire, lit la desc sur le man mais le à 0 si tu veux mais c'est pour la perf.
 
Ton erreur vient d'un mauvais "encodage" de tes caractères. Tu devrais également vérifier le charset de ta bdd, perso je prends utf8 - general-ci (du moins je pense que faire le addslash sur toute la ligne n'est pas une bonne idée mais plutot de le faire sur chaque valeur, après je ne code pas comme ça pour les fichiers csv donc :s je peux pas t'aider plus)


Message édité par sltpaulo le 19-08-2013 à 14:42:28
Reply

Marsh Posté le 19-08-2013 à 14:49:45    

Merci !
 
Pour le moment, j'ai bêtement remplacé mon code par le tiens, et ca ne marche pas... je n'ai probablement pas compris ce que tu as voulu dire par $link.
Je suis bien en UTF8-ci dans la base de donné.
 
Je continu de chercher !  :)


---------------
PSN : Luluberlu
Reply

Marsh Posté le 19-08-2013 à 15:09:12    

par exemple :

Code :
  1. $link = mysql_connect($db_array["host"], $db_array["base"], $db_array["pwd"]) or die(mysql_error());
 

je te conseille aussi d'écrire tes exécutions sql comme ça :

Code :
  1. $req1=mysql_query($sql1,$link)or die (mysql_error());



Message édité par sltpaulo le 19-08-2013 à 15:10:13
Reply

Marsh Posté le 19-08-2013 à 15:20:50    

OK, je comprends... en fait je me connecte autrement à la base de donnée, mais merci du conseil...
 
Par contre impossible de faire marcher ton code :/. Ca me renvoie une page inexistante, comme si le fichier php était non interprétable.
je pense que ca viens du  

Code :
  1. ysql_real_escape_string($value,$bdd);

où $bdd n'est pas définis avant.
 je fouille :)


---------------
PSN : Luluberlu
Reply

Marsh Posté le 19-08-2013 à 15:24:42    

Hmmm, regarde la doc des fonctions qui te pose problème, la $bdd = $link,
 
le lien de connexion que tu crées avec mysql_connect

Reply

Marsh Posté le 19-08-2013 à 15:29:59    

c'est ce que je fais, merci !


---------------
PSN : Luluberlu
Reply

Sujets relatifs:

Leave a Replay

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