LOAD DATA INFILE - Solution non trouvée sur le forum

Petit nouveau ! | 3 Messages

24 nov. 2011, 13:03

BOnjour à tous,

Tout d'abord, j'ai regardé pas mal de posts en rapport avec cette "fonction" sur le forum, et j'ai eu beau tester toutes les solutions présentées, avec différentes mises en page de syntaxes et de codes, rien n'y fait...

Je vous explique le but du truc, puis vous je vous link le code.
Alors, j'ai une base de données avec une liste de mails pour une newsletter. L'utilisateur voudrait pouvoir mettre à jour régulièrement cette table de mail avec un fichier CSV qui ne contient qu'une seule colonne (un mail par ligne).
Donc, ma démarche, c'est :
Créer une table mail_temp (mail varchar(60))
Insérer le contenu de mail.csv à ma table mail_temp (mail)
Supprimer de mail_temp les mails qui sont déjà contenus dans newsletter
Il ne me reste donc que des nouveaux mails dans mail_temp, je les insère donc dans newsletter
Supprimer la table mail_temp.

Mon souci, c'est que dès la première étape, ça merde.
La table mail_temp se créée, mais elle reste vide de chez vide...
Donc forcément, la suite se passe pas bien !

Voilà le code :

Code : Tout sélectionner

$req1= "CREATE TABLE mail_temp (mail varchar(60)) LOAD DATA INFILE 'csv/mails.csv' INTO TABLE mail_temp FIELDS TERMINATED BY ';' ESCAPED BY '\\\\' LINES STARTING BY '' TERMINATED BY '\\n' (mail)"; $exec1 = mysql_query($req1); $req2= "DELETE FROM mail_temp WHERE mail IN (SELECT mail FROM newsletter)"; $exec2 = mysql_query($req2); $req3= "INSERT INTO newsletter(mail, valide) SELECT mail FROM mail_temp"; $exec3 = mysql_query($req3); $req4= "UPDATE newsletter SET valide = 1 WHERE valide IS NULL"; $exec4 = mysql_query($req4); $req5= "DROP TABLE mail_temp"; $exec5 = mysql_query($req5);*/
La requête n°4 met à jour une colonne de la table newsletter qui n'est donc pas remplie pour les entrée qui viennent de mail_temp, rien de bien méchant là dedans.
Pour tester, j'ai tout passé en commentaire, et n'ai gardé que la première requête, d’où le fait que je me rende compte qu'elle ne fonctionne pas, puisqu'en me connectant à phpmyadmin, je constate que la table mail_temp existe, mais qu'elle est vide !

Merci pour votre aide, et désolé de ressortir un énième fois ce problème, mais j'ai essayé plein de solutions que vous fournissez ici sans succès...

Olivier.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 nov. 2011, 15:59

salut,

est tu sur du chemin du fichier (un chemin absolus semble nécessaire pour être certain que mysql le trouve)

a tu testé juste l'insertion des mails depuis phpmyadmin ?

perso je viens de tester
[mysql]
LOAD DATA INFILE 'C:/xampp/htdocs/test/testmail.txt'
INTO TABLE mail_temp
FIELDS
TERMINATED BY ';'
(mail) ;
[/mysql]

sans soucis
avec ta syntaxe le message d'erreur est #1083 - Field separator argument is not what is expected; check the manual

sinon avec
[mysql]
LOAD DATA INFILE 'C:/xampp/htdocs/test/testmail.txt'
INTO TABLE mail_temp
FIELDS TERMINATED BY ';' ESCAPED BY '\\'
LINES STARTING BY '' TERMINATED BY '\\n'
(mail) ;[/mysql]
Il en faut peu pour être heureux ......

Invité
Invité n'ayant pas de compte PHPfrance

24 nov. 2011, 16:56

Bonjour!

merci pour ta réponse rapide.

Ton code est difficilement lisible, mais j'ai réussi à déchiffrer quand même.
J'ai testé ta solution, et rien n'y fait...

J'ai même un autre bug, c'est que ma table ne veux plus se créer...
je vais résoudre ce dernier tout seul, et je reviendrais ici quand ca refonctionnera !

Merci en tout cas !

Invité
Invité n'ayant pas de compte PHPfrance

24 nov. 2011, 17:17

Ok, j'ai compris pourquoi ma table sn'apparaissait plus. En fait, si le LOAD DATA ne fonctionne pas, il ne crée pas la table.

Bon, toujours est-il que j'ai essayé en mettant l'adresse complete du fichier sur mon site, et l'adresse partielle, rien ne fonctionne... :-S
Je comprends vraiement pas, parce que je tape exactement ce que tu as donné, et ça veux pas.
j'ai tenté dans phpMyAdmin directement, en effet, pour voir l'erreur affichée, et tout ce que j'ai c'est :
#1045 - Access denied for user 'nom_de_la_base'@'%' (using password: YES)

je continue mes recherches, j'en viens à me dire que c'est mon fichier csv qui pose probleme, pourtant, c'est un bete fichier fait avec OpenOfficeCalc...

Invité
Invité n'ayant pas de compte PHPfrance

24 nov. 2011, 19:04

Ok,

Evolution a grand pas.

Alors maintenant, la table se créée nikel.
Le code pour l'ajout du csv fonctionne niquel, et toute la suite aussi.
Le souci, c'est que c'est soit l'un, soit l'autre :D

En gros, j'ai complètement changé mon code :

Code : Tout sélectionner

if($mysql_link) { $req1= "CREATE TABLE mail_temp (mail varchar(60))"; $exec1= mysql_query($req1); $handle = fopen("./csv/mails.csv", "r"); $ligne = 1; while (($data = fgetcsv($handle, 5000, ";")) !== FALSE) { $num = count($data); for ($i=0; $i < $num; $i++) { $req = "INSERT INTO mail_temp (mail) VALUES ("; $req .= "'".mysql_real_escape_string($data[$i])."')"; mysql_query($req); } if (mysql_error()) { echo mysql_error() ."<br>\n"; $erreur = true; } } fclose($handle); $req2= "DELETE FROM mail_temp WHERE mail IN (SELECT mail FROM newsletter)"; $exec2= mysql_query($req2); $req3= "INSERT INTO newsletter(mail, valide) SELECT mail FROM mail_temp"; $exec3= mysql_query($req3); $req4= "UPDATE newsletter SET valide = 1 WHERE valide IS NULL"; $exec4= mysql_query($req4); $req5= "DROP TABLE mail_temp"; $exec5= mysql_query($req5); }
Et donc, maintenant, si je passe tout en commentaire sauf REQ1 et EXEC1, alors ma table apparait.
Si je passe REQ1 et EXEC1 en commentaire, alors le fichier est lu, et les mails sont ajoutés.

Mais si je ne mets aucun commentaires, ca ne fonctionne pas. la table n'apparait pas, et donc forcément, la suite ne peut pas fonctionner...

Invité
Invité n'ayant pas de compte PHPfrance

24 nov. 2011, 19:23

Bon,

Ca y est, tout fonctionne.

En fait, vu que le CREATE TABLE voulait pas fonctionner, je me suis dit que la table pouvait rester en l'état sans que ça gêne personne.
Du coup, je la DROP plus à la fin, mais je fais un DELETE FROM mail_temp; au tout début. Comme ça, je suis sûr que la table est vide avant d'y inséerer tous les mails de mon fichier.

Voilà !
Je link mon code, si jamais quelqu'un passe pas là et cherche une solution :

Code : Tout sélectionner

if($mysql_link) { //il faut au préalable avoir créée une table nommé "mail_temp" via phpMyAdmin par exemple, avec une colonne appelée mail (varchar(60)) //Je nettoie mail_temp pour qu'elle soit vierge $req1= "DELETE FROM mail_temp"; $exec1= mysql_query($req1); //on ouvre le fichier CSV contenant la liste de mails $handle = fopen("./csv/mails.csv", "r"); $ligne = 1; //On place le contenu du fichier dans une variable "data" (veillez à ce que le CSV ai bien un ";" comme séparateur de données while (($data = fgetcsv($handle, 5000, ";")) !== FALSE) { //on compte le nombre de ligne de "data" $num = count($data); // pour chaque ligne, on crée et exécute une requête pour ajouter le mail à la table "mail_temp" for ($i=0; $i < $num; $i++) { $req = "INSERT INTO mail_temp (mail) VALUES ("; $req .= "'".mysql_real_escape_string($data[$i])."')"; mysql_query($req); } if (mysql_error()) { echo mysql_error() ."<br>\n"; $erreur = true; } } //on ferme le flot du fichier dont on a plus besoin fclose($handle); //On supprime de "mail_temp" les mails que la table "newsletter" connait déjà $req2= "DELETE FROM mail_temp WHERE mail IN (SELECT mail FROM newsletter)"; $exec2= mysql_query($req2); //Il ne reste donc plus que des mails inconnus dans "mail_temp", donc on les insère dans "newsletter" $req3= "INSERT INTO newsletter(mail) SELECT mail FROM mail_temp"; $exec3= mysql_query($req3); //la table "newsletter" contient un champ à 0 ou 1 pour savoir si la personne est oui ou non abonné à la newsletter // et par défaut, tous les nouveaux mails sont positionnés sur 1. $req4= "UPDATE newsletter SET valide = 1 WHERE valide IS NULL"; $exec4= mysql_query($req4); }
Et voilà !

Ce ne fut pas de tout repos, mais ça fonctionne !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 nov. 2011, 20:23

Content de t'avoir aidé ;)

Par contre la plus part des messages que tu indique après mon intervention sont due à des erreurs (mauvais mot de passe ou utilisateur) problèmes de logique etc etc ;)

Bon courage pour la suite. ;)

@+
Il en faut peu pour être heureux ......