[PHP - SQL] Load data infile

Fermé
dodou - 19 juin 2007 à 14:39
 Arch - 4 mai 2012 à 17:15
Bonjour à vous
J'ai un pb avec la fonction load data infile :(
voila, j'ai un fichier texte sur mon serveur (/file/texte.txt), avec des @ en tant que séparateurs, et je voudrais l'utiliser pour inserer le tout dans ma base de donnée (table : test);
La fonction que j'utilise (et qui ne marche pas donc) :
$query= "LOAD DATA INFILE '/file/texte.txt' INTO TABLE `test` FIELDS TERMINATED BY '@' ENCLOSED BY '\"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' ";
J'ai également essayé en ajoutant LOCAL après DATA, mais ca ne marche pas non plus.

Aucune erreure ne m'est signalé mais ma table ne se remplie pas :(

Merci beaucoup de m'accorder de votre temps pour m'aider :D
A voir également:

16 réponses

remplacer LOAD DATA LOCAL INFILE par LOAD DATA INFILE peut aider
7
Ohm-WorK Messages postés 1464 Date d'inscription mardi 25 octobre 2005 Statut Contributeur Dernière intervention 29 octobre 2019 420
19 juin 2007 à 14:51
Salut

Donc, si j'ai suivi tu fais :
$query= "LOAD DATA INFILE '/file/texte.txt' INTO TABLE `test` FIELDS TERMINATED BY '@' ENCLOSED BY '\"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' ";
et ensuite tu dois surement faire un :
$req = mysql_query($query) or die (mysql_error());

Et tu n'obtient aucune erreur ?

Tchusss
5
$alut Ferrat

Je n'ai malheureusement pas trouvé comment faire pour activer cette option.
Du coup j'ai laché l'affaire et me suis rabattu sur une autre voix

Je fais une lecture du fichier en PHP et je crée une requete d'insertion en BD ( en bouclant tant qu'il y a des lignes dans le fichier )

//Le chemin d'acces a ton fichier sur le serveur
$fichier = fopen("textes/ton_texte.txt", "r"); 

//tant qu'on est pas a la fin du fichier :
while (!feof($fichier)) 
{ 
// On recupere toute la ligne
$uneLigne = fgets($fichier, 1024);
//On met dans un tableau les differentes valeurs trouvés (ici séparées par un '@') 
$tableauValeurs = explode('@', $uneLigne); 
// On  crée la requete pour inserer les donner (ici il y a 7 champs donc de [0] a [6])
$sql="INSERT INTO la_table VALUES ('".$tableauValeurs[0]."', '".$tableauValeurs[1]."', '".$tableauValeurs[2]."', '".$tableauValeurs[3]."', '".$tableauValeurs[4]."', '".$tableauValeurs[5]."', '".$tableauValeurs[6]."')"; 
$req=mysql_query($sql); 
// la ligne est finie donc on passe a la ligne suivante (boucle)
}


Voila c'est tout simple mais peut-être que ca t'aidera ou t'orientera

@ ++
5
Merci Dodou!

Ton script est tout simplement (c'est le cas de le dire) Génial!
moi, ça me sauve la vie depuis que certains serveurs (Free pour ne pas le citer) ont décidé de bloquer le script LOAD DATA LOCAL INFILE
J'ai un programme qui gère des Etablissements scolaires et qui ont besoin de mettre leurs listes d'élèves à jour régulièrement. ils le font en envoyant un fichier .csv ; là c'était la panique tout d'un coup et ton script m'a permis de pallier au problème, ouf, merci :)
Encore Bravo, c'est brillant :)
0
remplacer LOAD DATA LOCAL INFILE per LOAD DATA INFILE
5

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut Ohm-WorK, merci de m'aider.

J'avais oublié de mettre or die(mysql_error()), c'est pour ca que je voyais pas les erreurs.

Alors, quand je fais la requete LOAD DATA LOCAL INFILE j'ai cette erreur :
The used command is not allowed with this MySQL version

Et quand je fais LOAD DATA INFILE j'ai cette erreure :
Access denied for user: 'xxxxxx@localhost' (Using password: YES)

Moi ca ne m'avance pas plus vu que je sais pas ce que ca veut dire, mais peut etre que ca va t'aider a cibler le probleme.

Merci @ tte
3
Ohm-WorK Messages postés 1464 Date d'inscription mardi 25 octobre 2005 Statut Contributeur Dernière intervention 29 octobre 2019 420
20 juin 2007 à 14:41
Salut,

Alors

1) The used command is not allowed with this MySQL version : Commande non autorisé dans ta version de Mysql

2) Access denied for user: 'xxxxxx@localhost' (Using password: YES) : Problème d'authentification lors de l'accès à la base de données.

Ca devrait t'aiguiller :)

Tchuss

Ohm-WorK
3
Lut Ohm-Work

Oki merci;

Mais maintenant la question est : " comment palier a ce probleme ?" lol;

Comment activer cette option (LOAD DATA LOCAL INFILE) dans mon MySQL ???;

Ce n'est pas un pb d'acces a la base (je me connect bien a la base avec acces ALL Privileges, et j'arrive a recuperer toutes les infos de mes tables);

Merci encore @ toi !
3
Bonjour,

J'ai eu exactement le même problème que vous.

Ce genre de problème viens du fait que les autorisations que l'on donne aux utilisateurs lorsque l'on les créée avec des GRANT.

Le problème est résolu depuis hier soir pour moi.

Mon objectif était de créer un utilisateur ayant tous les droits sur son schéma de base, mais pas de droits particuliers sur le reste.

Voici donc ce que j'ai fait:

-- ---------------------------------------------------------------------------------------------------------------------------
-- Suppression de l'utilisateur s'il existe pour localhost
drop user 'USER_LOGIN'@'localhost';

-- Suppression de l'utilisateur s'il existe pour % (Tous les autres hosts)
drop user 'USER_LOGIN';

-- Donne les droits pour accéder à minima sur les schéma standard.
GRANT USAGE, SELECT ON *.* TO 'USER_LOGIN'@'localhost' IDENTIFIED BY 'USER_PASSWORD';

-- Donne tous les droits pour accéder au schéma de l'utilisateur, en localhost avec possibilité de faire des GRANT
-- comme par exemple pour créer des utilisateurs read-only (SELECT only par exemple)

GRANT ALL PRIVILEGES ON USER_SCHEMA.* TO 'USER_LOGIN'@'localhost' IDENTIFIED BY 'USER_PASSWORD' WITH GRANT OPTION;

-- Donne tous les droits pour accéder au schéma de l'utilisateur, depuis tout autre serveur SANS possibilité de faire des GRANT
GRANT ALL PRIVILEGES ON USER_SCHEMA.* TO 'USER_LOGIN'@'%' IDENTIFIED BY 'USER_PASSWORD';

-- Donne les droits pour utiliser les LOAD DATE INFILE.
GRANT FILE ON *.* TO 'USER_LOGIN'@'localhost';

-- Recharge les droits.
FLUSH PRIVILEGES;

-- ---------------------------------------------------------------------------------------------------------------------------

J'utilise ce modèle SQL pour créer les utilisateurs avec un script BASH/SH/CSH pour faire des remplacements des variables:
USER_SCHEMA, USER_LOGIN et USER_PASSWORD
par des valeurs données en argument.

Voilà.

J'espère que cela vous aidera.

Cordialement,
Thierry
3
Ohm-WorK Messages postés 1464 Date d'inscription mardi 25 octobre 2005 Statut Contributeur Dernière intervention 29 octobre 2019 420
20 juin 2007 à 15:11
Re

tu utilise quelle version de mysql ?

Tchusss
1
Je ne sais pas qu'elle est la version, mais apparemment ca a l'air d'etre une des dernieres qui integre la suppression de cette fonctionnalité (par securité).
Mais mon serveur est sur OVH, donc mutualisé. Je sais pas si je peux modifier les options et si oui comment...

J'ai entendu parler de --enable-local-infile, mais où il se trouve et comment y acceder !?!?
Etant sur un serveur mutualisé je sais meme pas si possible.

As tu une idée de comment je pourrai faire pour que ca marche ?

Encore merci pour tes reponses !
0
Ohm-WorK Messages postés 1464 Date d'inscription mardi 25 octobre 2005 Statut Contributeur Dernière intervention 29 octobre 2019 420
20 juin 2007 à 15:40
Salut

Si tu es sur du mutualisé, tu n'aura pas accès aux options de démarrage du serveur, désolé !

Tchuss
0
RE
Je viens de demander a mon bosse, et en faite c'est un serveur dedié.
On a acces au configuration de mysql.
Mais j'ai cherché partout mais rien trouvé correspondant LOAD DATA LOCAL INFILE.

Est ce que tu sais comment redemarrer mysql en activant l'option (--enable-local-infile)
ou est ce que je dois aller et qu'est ce que je dois taper ... ?

Merci
0
bonjour
j'ai exactement le meme probleme avec "LOAD DATA INFILE" et comme il y a plus de 2 mois que ces messages ont été postés, je pense qu'un aurait trouvé une solution, bref
si vous avez une idée je vous attends.
merci d'avance.
0
Pardon si je vous fais revenir un peu en arrière dans le débat. Pour utiliser la fonction load.
= faut-il créer un fichier spécifique *.php avec en tête les paramètres de connexion (j'ai en fait un fichier externe congig.php que j'include chaque fois dans mes fichiers d'appel. Ce fichier loadtxt.php comprendrait la syntaxe load etc.)
= Puis je garder le fichier mon_texte.txt à insérer sur mon PC ou le mettre dans un dossier sur le site distant (lhébergeur) que j'aurai crée à la racine (et uploadé soit direct ou ftp ?
= quel serait la syntaxe exacte
"LOAD DATA INFILE '/ftp/mon_texte.txt' INTO TABLE `test` FIELDS TERMINATED BY '&&' ENCLOSED BY '\"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' ";
- L'ordre de chargement des FIELDS est-il celui qui apparait dans la table (pour en sauter un, laisser un vide entre deux && ?
= Inclure le champ id_article ?
= faut-il obligatoirement, comme j'ai cru le comprendre en lisant le forum, écrire $query= "LOAD DATA etc. et terminer par : $req = mysql_query($query) or die (mysql_error());

Je fais un exercice en créant un loadtxt.php
<html>
<Head>
<title>chargement de page</title>
</Head>
<body>
<?
include /scripts/config.php
$query= "LOAD DATA INFILE '/ftp/mon_texte.txt' INTO TABLE `article` FIELDS TERMINATED BY '&&' ENCLOSED BY '\"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' ";
$req = mysql_query($query) or die (mysql_error());
?>
</body>
</html>

et dans mon_texte.txt écrire

&& ne rien écrire pour l'id&&titre&&intro&auteur&&article\r\n
0
hola me gustaria un ejemplo mas completo .. de que manera tiene que estar estructurado el txt.. y como puedo hacer una rutina ...

mi problema es lo siguiente :

desde cliper .. me genera un archivo plano.. ose un txt por cada registro.. lo que se desea es leer ese txt y pasarlo a mi base de datos mysql ... agradecere su ayuda:

explico a medida que se van generando los txt mi php tiene que leer el txt y automaticamente insertarlo en mi tabal de mi bd mysql .. quiero algo asi como una rutina .. gente .. es urgente .. agradecere su ayuda
0
Nandrianina22 Messages postés 1 Date d'inscription dimanche 25 mars 2012 Statut Membre Dernière intervention 25 mars 2012
25 mars 2012 à 11:17
Slt! jte propose une autr solution si ça t'interasse :
supposons que t'a une table Personne('Nom','Prenom','Numero').
Pour ajouter des données à cette table à partir d'un fichier .txt, il faut structure ton fichier texte comme suit :
DUPOND Eric 2
DURANT Jacque 1
DUVAL Denis 3
...

tu doit utilise la tabulation comme séparateur et pour les valeurs nulles utilisez \N.
Et pour la syntaxe, utiliser ceci:
LOAD DATA LOCAL INFILE "repertoire\\texte.txt" INTO TABLE Personne

Ca devra marcher...Bonne cntinuation...
0
Bonjour,
Je cherche à faire un terminated by ' ' (espace) pour les fields mais ça ne semble pas fonctionner!
est-ce possible? quelqu'un aurait une idée?
merci
0