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 :

Insertion avec LOAD DATA LOCAL INFILE


Sujet :

PHP & Base de données

Vue hybride

johndoe71 Insertion avec LOAD DATA... 14/02/2017, 10h46
badaze En fait (comme souvent) il... 15/02/2017, 23h25
ABCIWEB Il faut aussi que mysql aient... 17/02/2017, 03h31
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 1
    Par défaut Insertion avec LOAD DATA LOCAL INFILE
    Bonjour,
    Je sais que le problème a déjà été poser.
    J'ai un soucis je suis entrain d'apprendre le php mais je bloque, je dois insérer un fichier csv dans ma base de données avec la fonction "load data local infile mais ça ne marche pas.
    voici le code:

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php
    extract(filter_input_array(INPUT_POST));
     
    $fichier = $_FILES['userfile']['name'];
     
    	if ($fichier){//ouverture du fichier temporaire
     
    $fp = fopen($_FILES['userfile']['tmp_name'], "r");}
     
    else{//fichier inconnu ?>
     
    <p align="center">- Importation echouee -</p>
     
    <p align="center"><b>Desole, mais vous n'avez pas specifie de chemin valide...</b></p>
     
    <?php exit();}
    // declaration de la variable "cpt" qui permettra de compter le nombre d'enregistrement réalisé
    $cpt = 0;
     
    ?>
     
    <p align="center">- Importation Reussie -</p>
     
    <?php
    //importation
     
    while (!feof($fp)){
    $ligne = fgets($fp,4096);
     
    //on crée un tableau des éléments séparés par des points virgule
     
    $liste = explode(";", $ligne);
    $table = filter_input(INPUT_POST, 'userfile');
     
    //premier élément
    $liste[0] = (isset($liste[0])) ? $liste[0] : Null;
    $liste[1] = (isset($liste[1])) ? $liste[1] : Null;
    $liste[2] = (isset($liste[2])) ? $liste[2] : Null;
    $liste[3] = (isset($liste[3])) ? $liste[3] : Null;
    $liste[4] = (isset($liste[4])) ? $liste[4] : Null;
    $liste[5] = (isset($liste[5])) ? $liste[5] : Null;
    $liste[6] = (isset($liste[6])) ? $liste[6] : Null;
    $liste[7] = (isset($liste[7])) ? $liste[7] : Null;
    $liste[8] = (isset($liste[8])) ? $liste[8] : Null;
    $liste[9] = (isset($liste[9])) ? $liste[9] : Null;
    $champs1  = $liste[0];
    $champs2  = $liste[1];
    $champs3  = $liste[2];
    $champs4  = $liste[3];
    $champs5  = $liste[4];
    $champs6  = $liste[5];
    $champs7  = $liste[6];
    $champs8  = $liste[7];
    $champs9  = $liste[8];
    $champs10  = $liste[9];
    if ($champs1!='id')
    {
    	$cpt++;
    $bdd = new PDO('mysql:host=127.0.0.1; dbname=monsite2','root','toto1234');
    $insert ="LOAD DATA LOCAL INFILE 'logo_utilisateur.csv' INTO TABLE 'logo_utilisateur2' 
    	FIELDS TERMINATED BY ',' 
    	LINES TERMINATED BY '\r\n'
    	IGNORE 1 LINES";
     
    (NULL, $champs2, $champs3, $champs4, $champs5, $champs6, $champs7, $champs8, $champs9, $champs10);
     
    }}
    // fermeture du fichier
    fclose($fp);
    $cpt = $cpt-1;
    ?>
    <h2>Nombre de valeurs nouvellement enregistrees: </h2><b><?php echo $cpt; ?></b>

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    En fait (comme souvent) il n'y a pas qu'un seul problème mais un ensemble.

    La plupart du code ne sert à rien puisque l'importation de tout un fichier csv peut se faire uniquement via une requête. Bien entendu on part du principe que l'ordre des champs dans le fichier csv correspond à celui de la table.
    - il ne faut pas mettre de cote sur le nom de la table => logo_utilisateur2 et non pas 'logo_utilisateur2'
    - il faut mettre le chemin d'accès au fichier csv => 'c:/toto/titi/logo_utilisateur.csv' et non pas 'logo_utilisateur.csv' (sauf si le fichier se trouve dans le même répertoire que le script php - mais bon il vaut mieux mettre le chemin d'accès).
    - il faut autoriser PDO à utiliser LOCAL DATA => PDO::MYSQL_ATTR_LOCAL_INFILE => true
    - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION permet d'afficher les erreurs PDO.

    Le code ci-dessous suffit pour importer un fichier csv dans une table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    $bdd = new PDO('mysql:host=127.0.0.1; dbname=tests','root','', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_LOCAL_INFILE => true));
    $insert ="LOAD DATA LOCAL INFILE 'C:/Program Files (x86)/EasyPHP-Devserver-16.1/eds-www/tests/toto2.csv' INTO TABLE tab_toto 
    	FIELDS TERMINATED BY ',' 
    	LINES TERMINATED BY '\r\n'
    	IGNORE 1 LINES";
    $prepared = $bdd->prepare($insert);
    $prepared->execute();
    Mon fichier exemple : 'C:/Program Files (x86)/EasyPHP-Devserver-16.1/eds-www/tests/toto2.csv'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    id,champ1,champ2,champ3
    10,a1,a2,a3
    20,b1,b2,b3
    30,c1,c2,c3
    40,d1,d2,d3
    Remplit ma table tab_toto

    Nom : 170215-001.JPG
Affichages : 1168
Taille : 13,4 Ko

  3. #3
    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
    Il faut aussi que mysql aient les droits d'accès aux fichiers ce qui n'est pas possible sur la plupart des mutualisés. Enfin bon s'il s'agit d'un exercice je suppose qu'il n'y a pas de problèmes à ce niveau là.

Discussions similaires

  1. [PDO] LOAD DATA LOCAL INFILE avec PDO MySql
    Par ultimus dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/07/2015, 11h54
  2. Syntaxe LOAD DATA LOCAL INFILE avec CSV
    Par armand6464 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/01/2015, 14h27
  3. [MySQL] Errcode: 2 : Problème avec Load data local infile
    Par Jarod51 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 26/09/2011, 16h55
  4. Insertion avec LOAD DATA LOCAL INFILE
    Par Krys006 dans le forum Débuter
    Réponses: 2
    Dernier message: 04/05/2008, 16h40
  5. probleme avec <<load data local infile etc>> errcode: 2
    Par oumaridia dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 11/11/2007, 08h13

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