IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

LOAD DATA INFILE qui fonctionne à moitié [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Par défaut LOAD DATA INFILE qui fonctionne à moitié
    Bonjour,

    Je suis confronté à un problème qui me prend la tête et que je ne réussi pas à résoudre, j'espère donc trouver une réponse sur ce forum.

    Je veux insérer dans ma base de donnée un grand nombre de ligne (plus de 3000) venant d'un fichier texte.
    J'ai donc trouver le saint graal : LOAD DATA INFILE.
    Seulement, il y a des caractères spéciaux dans ce fichier, tel que "&" et et les simples quote, et lors de mes requêtes suivantes j'ai des messages d'erreurs (ben oui, le simple quote me ferme ma requête, car il n'a pas été échappé avec un antislash).

    Voici mon code actuel, qui fait bien l'ajout dans la table temp et qui permet de remplir les autres tables, mais dès que je rajoute la ligne commenter (celle du FIELDS ESCAPED BY), plus rien ne fonctionne (et pourtant je n'ai aucun message d'erreur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    /// Fonction connexion à la BDD
    	function connexion_bdd() {
    		try {
    			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    			if ($_SERVER["SERVER_NAME"] == "localhost" || $_SERVER["SERVER_NAME"] == "127.0.0.1") {
    				$bdd = new PDO('mysql:host=localhost;dbname=xxxxxxx', 'xxxxxxx', 'xxxxxx', $pdo_options);
    			}
    			else {
    				$bdd = new PDO('mysql:host=mysql51-34.bdb;dbname=xxxxxxxx', 'xxxxxx', 'xxxxxxx', $pdo_options);
    			}
    		}
    		catch(Exception $e) {
    			die('Erreur : '.$e->getMessage());
    		}
    		return $bdd;
    	}
     
     
    /// Partie du fichier pour la MAJ de la BDD
    				$bdd = connexion_bdd();
     
    				$req = "TRUNCATE TABLE temp; ";
    				if ($_SERVER["SERVER_NAME"] == "localhost" || $_SERVER["SERVER_NAME"] == "127.0.0.1") {
    					$req .= "LOAD DATA INFILE 'SITE_utf8.txt' ";
    				}
    				else {
    					$req .= "LOAD DATA LOCAL INFILE 'SITE_utf8.txt' ";
    				}
    				$req .= "REPLACE INTO TABLE temp ";
     
    ////////////////////////////////////// Cette ligne !!!!
    				$req .= "FIELDS ESCAPED BY '\\' ";
     
    				$req .= "IGNORE 1 LINES ;";
    				$bdd->query($req);
     
    				$bdd->query("TRUNCATE TABLE categories;");
    				$req_categories = "INSERT INTO categories (groupe_produit, cat, sub_cat) SELECT DISTINCT num_groupe, cat, sub_cat FROM temp;";
    				$reponse_categories = $bdd->query($req_categories);
     
    				$bdd->query("TRUNCATE TABLE articles;");
    				$req_articles = "INSERT INTO articles (num, description, groupe, life_cycle_code) SELECT num_art, description, num_groupe, life_cycle_code FROM temp;";
    				$reponse_articles = $bdd->query($req_articles);
     
    				// On vide la table temporaire
    				$bdd->query("TRUNCATE TABLE temp;");
     
    				echo 'Mise à jour des tables "categories" et "articles" effectué !';
    Merci d'avance pour vos réponses,

    TheDeadMan

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    comment est crée le SITE_utf8.txt ?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Par défaut
    C'est vrai que j'aurais du le préciser dans mon premier message.

    Ce fichier est crée par SAP, suite à un requête SQL toute bête.
    En fait, le résultat s'affiche dans une fenêtre sous la forme d'une table, et la seule chose que l'on peut faire c'est "fichier/exporter", aucun réglage possible...

    D'ailleurs, ça me pose problème concernant l'encodage, SAP encodant le fichier en UTF-16... je suis obligé de passer par Notepad++ et de le convertir en UTF-8 (si quelqu'un à une solution automatisé en passant par Php, merci !)

    Voici les premières lignes du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #	Numéro	CATEGORIE	SOUS-CATEGORIE	Numéro d'article	Description article	LifeCycleCode	
    1	496	Univers Ludique	Accessoires Bois	700104	LOT  2 PACKS DE 24 BOITES ASSORTIES	N11	
    2	496	Univers Ludique	Accessoires Bois	700105	LOT  2 PACKS DE 12 JEUX ASSORTIS	N11	
    3	496	Univers Ludique	Accessoires Bois	700106	LOT 10 CARNETS CHEVALIERS GM	N11	
    4	496	Univers Ludique	Accessoires Bois	700107	LOT 10 CARNETS CHEVALIERS PM	N11	
    5	496	Univers Ludique	Accessoires Bois	700108	LOT 10 REGLES BOIS CHEVALIERS	N11	
    6	496	Univers Ludique	Accessoires Bois	700109	LOT 10 CARNETS PRINCESSES GM	N11

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    si t'as des caractère spéciaux dans ton CSV et que SAP ne les échappes pas, ca va être difficile puisque le CSV n'est pas valide

    pour le charset utilise l'option CHARACTER SET

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Par défaut
    Hum, pour le character set, je fais "... INTO TABLE TEMP CHARACTER SET utf8" ? (je peux pas tester ce soir).

    Par contre, pour les caractères spéciaux, je comprends pas, ce n'est justement pas le rôle du ESCAPED BY '\' d'échapper les caractères spéciaux s'il en trouve ?

    Sinon, il faudrait analyser le fichier caractère par caractère (ou ligne par ligne, mais la faut trouver les fonctions adéquates) et ajouter un / avant chaque caractère spéciaux.
    Peut être chercher du côté des regex ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par thedeadman Voir le message
    Par contre, pour les caractères spéciaux, je comprends pas, ce n'est justement pas le rôle du ESCAPED BY '\' d'échapper les caractères spéciaux s'il en trouve ?
    Je pense plutôt que c'est pour spécifier comment les caractères ont été échappés dans le document original.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LOAD DATA INFILE] clé auto incrémentés
    Par ashurai dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/02/2006, 17h17
  2. Réponses: 5
    Dernier message: 18/04/2005, 12h38
  3. probleme avec "LOAD DATA INFILE" et les b
    Par Koo dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/07/2004, 09h37
  4. Problème avec LOAD DATA INFILE
    Par ka0z dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 04/06/2004, 14h59
  5. petit soucis lors d'un LOAD DATA INFILE
    Par Jovial dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 04/06/2004, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo