Forum Clubic

Probleme importer csv dans base de donne

Bonjour j ai un probleme avec ce fichier l importation ne se fait pas dans la base de donne et pas de message d erreur juste une page blanche.
Voici le code.

<?php require_once('configuration.php'); $result = mysql_connect(HOSTNAME, DB_USERNAME, DB_PASSWORD)or die(mysql_error()); mysql_query("SET NAMES 'utf8'")or die(mysql_error()); if ($result && mysql_select_db(DB_NAME)) return $result or die(mysql_error()); $fichier = 'Annonces.csv'; if (file_exists($fichier)) $fp = fopen("$fichier", "r"); else { /* le fichier n'existe pas */ echo "Fichier introuvable !
Importation stoppée."; exit(); } while (!feof($fp)) /* Et Hop on importe */ { /* Tant qu'on n'atteint pas la fin du fichier */ $ligne = fgets($fp,4096); /* On lit une ligne */ /* On récupère les champs séparés par ; dans liste*/ $liste = explode( ';',$ligne ); /* On assigne les variables */ $sql = "INSERT INTO ". PREFIX ."annonces (id_reg, id_dep, id_cat, email, password, code_pos, ville, status, type, nom, tel, titre, ann, prix, etat, date, tel_cache, ip, xml_key) VALUES"; $sql_soc = "INSERT INTO ". PREFIX ."annonces_societe (nom_societe, siret, xml_key) VALUES"; $id_reg = 01; $id_dep = 02; $id_cat = 22; $email = $liste[106]; $password = 'volcane02'; $code_pos = $liste[4]; $ville = $liste[5]; $statut = 2; $societe = $liste[0]; $siret = ''; $type = 1; $nom = $liste[105]; $tel = $liste[119]; $titre = $liste[19]; $texte = $liste[21]; $prix = $liste[10]; $time = time(); $tel_cache = 'N'; $ip = $_SERVER['REMOTE_ADDR']; $xml_key = $liste[174]; $photo1 = (!empty($liste[84])) ? mysql_real_escape_string($liste[84]) : ''; $photo2 = (!empty($liste[85])) ? mysql_real_escape_string($liste[85]) : ''; $photo3 = (!empty($liste[86])) ? mysql_real_escape_string($liste[86]) : ''; $photo4 = (!empty($liste[87])) ? mysql_real_escape_string($liste[87]) : ''; $photo5 = (!empty($liste[88])) ? mysql_real_escape_string($liste[88]) : ''; $photo6 = (!empty($liste[89])) ? mysql_real_escape_string($liste[89]) : ''; $photo7 = (!empty($liste[90])) ? mysql_real_escape_string($liste[90]) : ''; $photo8 = (!empty($liste[91])) ? mysql_real_escape_string($liste[91]) : ''; $photo9 = (!empty($liste[92])) ? mysql_real_escape_string($liste[92]) : ''; $photo10 = (!empty($liste[163])) ? mysql_real_escape_string($liste[163]) : ''; $sql .= ($count == 0) ? '' : ','; $sql .= "('$id_reg', '$id_dep', '$id_cat', '$email', '$password', '$code_pos', '$ville', '$statut', '$type', '$nom', '$tel', '$titre', '$texte', '$prix', '2', '$time', '$tel_cache', '$ip', '$xml_key')"or die(mysql_error()); echo $titre; echo $tel; echo $liste[0]; $sql_soc .= ($count == 0) ? '' : ','or die(mysql_error()); $sql_soc .= "('$societe', '$siret', '$xml_key')"or die(mysql_error()); for($i = 1; $i <= 10; $i++) { $nom =''; if(!empty($photo1) && $i == 1) $nom = $photo1; elseif(!empty($photo2) && $i == 2) $nom = $photo2; elseif(!empty($photo3) && $i == 3) $nom = $photo3; elseif(!empty($photo4) && $i == 4) $nom = $photo4; elseif(!empty($photo5) && $i == 5) $nom = $photo5; elseif(!empty($photo6) && $i == 6) $nom = $photo6; elseif(!empty($photo7) && $i == 7) $nom = $photo7; elseif(!empty($photo8) && $i == 8) $nom = $photo8; elseif(!empty($photo9) && $i == 9) $nom = $photo9; elseif(!empty($photo10) && $i == 10) $nom = $photo10; if(!empty($nom)) { $sql_img = "INSERT INTO ". PREFIX ."annonces_images (nom, xml_key) VALUES ('$nom', '$xml_key')"or die(mysql_error()); mysql_query($sql_img)or die(mysql_error()); } } } ?>

Bonjour,

Mes connaissances PHP/MySQL sont un peu rouillées mais il y a 3 choses qui me surprennent dans ton code dont l’une pourra peut-être t’aider (la syntaxe des “IF”)

  1. la syntaxe des “IF”. Derrière le test d’une condition, tu mets une commande terminée par un point-virgule au lieu d’ouvrir un bloc avec des accolades. Donc OK, ça va exécuter l’instruction si le “IF” a évalué la condition comme vraie… mais il me semble que le point-virgule termine la commande “IF” et empêche de passer ensuite dans les ELSE ou les ELSEIF. En tout cas, c’est ainsi que cela se passerait dans d’autres langages. A vérifier pour ton code PHP!

  2. $fichier = ‘Annonces.csv’; Tu vas passer la variable $fichier dans file_exists mais tu n’as mis que le nom du fichier et pas son chemin d’accès. J’imagine donc que ton if (file_exists($fichier)) va renvoyer “False”… et si j’ai vu juste pour les “IF”, alors tu ne vas jamais rentrer dans les ELSE ni dans les ELSEIF et il serait normal que rien ne se passe

  3. Tu lis un fichier pour l’insérer dans une table MySQL. Sauf que tu fais de la m*rde en utilisant la commande INSERT et en lisant chaque ligne de ton fichier. Au lieu de cela, tu devrais utiliser LOAD DATA INFILE qui sera beaucoup plus rapide et sera beaucoup plus propre dans ton code.

Tu peux faire des echo() derriere tes differentes lignes $sqlxx pour voir si tu as bien a valeur que tu attends

Comment fonctionne ta variable $count ?
et tes die(mysql_error()) qui ne sont pas sur des lignes mysql_query() ?

j ai corriger pour les “if” mais rien ne change
Pour le fichier il est bien lu car avant de donne les instruction sql j avais essayer le fichier avec des echo et cela fonctionnais
Pour la fonctions load data infile je veux bien essayer mais comment je fais si je ne veux pas rentre toute les donne , j ai environ 200 donne par ligne et je veux en recuperer seulement une dizaine.
J ai ce code:
LOAD DATA INFILE ?fichier.csv?
INTO TABLE members
FIELDS
TERMINATED BY ‘;’
ENCLOSED BY ‘"’
ESCAPED BY ‘’
LINES
STARTING BY ‘’
TERMINATED BY ‘n’
(id_membre, login, statut)

j ai fait des echo derriere $sql et d autre variable mais rien ne s affiche alors que quand j ai commence le programme sans les requete sql j obtenais bien mes valeur de variable du fichier csv avec echo.
Edité le 05/07/2013 à 10:37

Dans ce cas, oublie le “load data infile” et on revient à ton problème d’import de données qui ne se fait pas. Tu pourras quand même noter dans un recoin de ta tête, pour plus tard, qu’il y a là un moyen de gagner ENORMEMENT de performance. Par exemple, en créant un 2ème fichier à partir du 1er et qui contiendra uniquement les champs que tu veux. Mais on laisse de coté pour la question actuelle.

La méthode qui fonctionne pour retrouver ton bug, c’est d’intercaler un écho toutes les 2 lignes pour trouver à quel endroit ça pose problème. Comme ça, tu peux donc faire un truc du style :

$sql = "INSERT INTO ". PREFIX ."annonces (id_reg, id_dep, id_cat, email, password, code_pos, ville, status, type, nom, tel, titre, ann, prix, etat, date, tel_cache, ip, xml_key) VALUES";
echo "Step 01: $sql<br>";
 $sql_soc = "INSERT INTO ". PREFIX ."annonces_societe (nom_societe, siret, xml_key) VALUES";
echo "Step 02: $sql_soc<br>";


 $id_reg = 01;
echo "Step 03: $id_reg<br>";
 $id_dep = 02;
echo "Step 04: $id_dep<br>";

Ca te permettra de rapidement isoler la ligne où un truc part en sucette.

Question : En quelques endroits, tu utilises le mot “PREFIX” mais ca ne ressemble pas à une variable car pas précédé d’un “$”. C’est normal ?

Question : En quelques endroits, tu utilises le mot “PREFIX” mais ca ne ressemble pas à une variable car pas précédé d’un “$”. C’est normal ?
[/quote]

oui c est normal c est le prefix des table de donne cela fonctionne bien.
par ailleur j ai trouve la solution car il ne fallais pas que je me connecte a la basse de donne tout en haut mais dans le while

Si ton problème est réglé, tant mieux… Perso, ça me semble louche, ton histoire de se connecter dans le “while” et pas en dehors… ça sent l’effet de bord.

M’enfin… problème réglé. Si tu as du temps libre (parce que je ne sais pas si ton sujet est un sujet de boulot ou personnel, ni si tu traites de gros volumes ou pas), je te recommande de creuser cette histoire de LOAD DATA INFILE. Quand je m’en suis servi il y a 10 ans, ça faisait passer mes temps de chargement de 5-10 minutes à 2 secondes.

Si tu ne charges pas toutes les données de ton fichier, tu peux créer un 2nd fichier qui ne contiendra que les champs à charger. Faire de la lecture/écriture de fichier c’est rapide tandis que lancer des requêtes c’est lent. Donc tu gagneras tout de même en performance… à moins que tes fichiers soient très petits, auquel cas ton code n’est pas bon… car si ton fichier est petit, il serait plus simple et plus lisible de charger ton fichier avec la commande “file”, et il serait plus performant de grouper toutes des insertions dans une seule requete INSERT un peu comme cet exemple :

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

bonne chance pour la suite !

Merci pour vos conseils…:wink: