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 :

Importer une table de 69 000 lignes [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut Importer une table de 69 000 lignes
    Bonjour

    Je travaille en local
    WAMPSERVER2.5

    Impossible d'importer une table dans PHP MySQL:

    Fatal error: Maximum execution time of 360 seconds exceeded in C:\wamp\apps\phpmyadmin4.1.14\libraries\import.lib.php on line 849
    Sous OpenOfficeCalc ma table fait 69 000 lignes et environ 50 colonnes

    Pouvez vous m'aidez?

  2. #2
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Points : 1 458
    Points
    1 458
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Dans ton PHP.ini tu as la ligne:

    max_execution_time
    Tente d'augmenter la valeur pour voir si l'importation fonctionne.
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  3. #3
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    1) Je décoche la case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Permettre l'interruption de l'importation si la limite de temps configurée dans PHP est sur le point d'être atteinte. (Ceci pourrait aider à importer des fichiers volumineux, au détriment du respect des transactions.)
    2) Modifications apportées au php.ini:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    post_max_size: 400M
    upload_max_filesize=250M
    memory_limit=128M
    max_execution_time=1200
    Ça ne marche pas

    ( ! ) Fatal error: Maximum execution time of 360 seconds exceeded in C:\wamp\apps\phpmyadmin4.1.14\libraries\import.lib.php on line 772
    Call Stack
    # Time Memory Function Location
    1 0.0260 391120 {main}( ) ..\import.php:0
    2 1.5670 231561928 ImportOds->doImport( ) ..\import.php:523
    3 310.7910 1048739752 PMA_analyzeTable( ) ..\ImportOds.class.php:377
    4 359.9990 1048756872 PMA_detectType( ) ..\import.lib.php:849

  4. #4
    Membre éclairé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2012
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2012
    Messages : 416
    Points : 747
    Points
    747
    Par défaut
    Bonjour,

    Il faut redémarrer le serveur après la modification du php.ini.

    Après cela, essaie un phpinfo pour voir si la valeur est bien celle attendue.

  5. #5
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci

    La modif est bien prise en compte

    Core:
    Directive			Local Value		Master Value
    max_execution_time	1200			1200
    mais l'importation de la table (fichier ods de 20.9Mo) échoue:

    Fatal error: Maximum execution time of 360 seconds exceeded in C:\wamp\apps\phpmyadmin4.1.14\libraries\import.lib.php on line 849
    Call Stack
    # Time Memory Function Location
    1 0.0210 391512 {main}( ) ..\import.php:0
    2 1.5800 231564128 ImportOds->doImport( ) ..\import.php:523
    3 359.9720 1048731080 PMA_analyzeTable( ) ..\ImportOds.class.php:377

  6. #6
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    En découpant ma table l'importation fonctionne:

    1) table1: j'ai d'abord importé les 4999 premières lignes + nom des champs
    2) puis j'ai importé dans la table1 les enregistrements compris entre 5000 et 9999
    ...
    c'est fastidieux

    Quelqu'un a une astuce?

    (max_execution_time augmenté à 12000)

    En important la table entière j'ai le message d'erreur suivant:
    Fatal error: Maximum execution time of 360 seconds exceeded in C:\wamp\apps\phpmyadmin4.1.14\libraries\import.lib.php on line 849
    Call Stack
    # Time Memory Function Location
    1 0.0020 391936 {main}( ) ..\import.php:0
    2 0.4790 9596376 ImportCsv->doImport( ) ..\import.php:523
    3 58.7880 716050312 PMA_analyzeTable( ) ..\ImportCsv.class.php:536

  7. #7
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    C'est pas possible d'importer un fichier volumineux (ods, csv) dans phpmyadmin?

  8. #8
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Tu as plusieurs solutions :

    - d'abord on travaille avec les outils qui vont bien, PhpMyAdmin c'est bien, mais c'est limité.

    Pour gérer tes db, normalement l'éditeur de ton moteur offre des outils.
    Dans ton cas chez Oracle (MySQL donc), te permette de télécharger une suite qui vont gérer tout ça très bien.
    Tu peux aussi le faire en ligne de commande.

    Tu également utiliser un ETL tel que Talend Open Studio que te fera ça tip top.

    A chaque produit ses outils.

  9. #9
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci pour votre aide

    Importation en ligne de commande: pouvez vous m'aider à corriger la syntaxe sql?

    Sous OpenOffice Calc enregistrement de mon fichier au format texte: 3_Economy_Growth.txt
    - jeu de caractère: Unicode (UFT-8)
    - séparateur de champ: ,
    - séparateur de texte: "

    Sous phpmyadmin:
    dans la base "hct" j'ai crée la table "gdp_bis"
    la structure de la table est crée (champs, type de variable) à l'identique de 3_Economy_Growth.txt
    toutefois cette table est vide (pas d'enregistrements)
    Question: est ce que je dois créer sous phpmyadmin la table qui va accueillir l'importation des données (enregistrements)?

    Dans la console MySQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mysql -h localhost -u root
    LOAD DATA LOCAL INFILE '3_Economy_Growth.txt'
    INTO  [gdp_bis]
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY 'AUTO';
    Ça ne fonctionne pas:
    erreur 1064 <42000> you have an error in your SQL syntax, check the manual that corresponds to your mysql server version for the right syntax to use near 'mysql -h localhost -u root
    LOAD DATA LOCAL INFILE '3_Economy_Growth.txt'
    INTO [' at line 1

  10. #10
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    svp c'est ma première importation en ligne de commande (peu de documentation en français)

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Petit tuto simple sur phpfrance.

  12. #12
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Merci pour le tuto
    Il est intéressant mais on ne dit pas si il faut préalablement créer dans PhpMyAdmin la table qui va recevoir les données
    Aussi j'ai essayé 2 méthodes mais ça ne marche pas
    Ça m'énerve ......
    Pouvez vous m'éclairer?

    fichier base1.csv crée sous OpenOfficeCalc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    - jeu de caractère: Unicode (UFT-8)
    - séparateur de champs: ;
    - séparateur de texte: "
    base1.csv ouvert dans bloc notes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A;B;C
    ab;55.236;452.36
    abc;4785.256;0.2563
    abcd;145236.28;4256987.856
    1) méthode 1: je ne crée pas la structure de table1 dans PhpMyAdmin:
    --------------------------------------------------------------------
    Console MySQL:
    --------------
    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
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 29
    Server version: 5.6.17 MySQL Community Server (GPL)
     
    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
     
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
     
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     
    mysql> /*selectionner une base*/
    mysql> use hct;
    Database changed
    mysql>
    mysql> /*afficher les tables présentes dans cette base*/
    mysql> show tables;
    +-------------------+
    | Tables_in_hct     |
    +-------------------+
    | table 7           |
    | table 8           |
    +-------------------+
    2 rows in set (0.00 sec)
     
    mysql>
    mysql> /*importer le fichier base1.csv*/
    mysql> LOAD DATA INFILE 'base1.csv'
        -> REPLACE
        -> INTO TABLE table1
        -> FIELDS
        -> TERMINATED BY ';'
        -> ENCLOSED BY '"'
        -> ESCAPED BY '\\'
        -> LINES
        -> STARTING BY ''
        -> TERMINATED BY '\n'
        -> (A, B, C);
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use near '?base
    1.csv?
    REPLACE
    INTO TABLE table1
    FIELDS
    TERMINATED BY ';'
    ENCLOSED BY '"'
    E' at line 1
    mysql>

    2) méthode 2: je crée préalablement la structure de table1 dans PhpMyAdmin
    --------------------------------------------------------------------------
    PhpMyAdmin:
    -----------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	Nom	Type
    1	A	varchar(10)
    2	B	decimal(10,10)
    3	C	decimal(10,10)
    Console MySQL:
    --------------
    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
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 43
    Server version: 5.6.17 MySQL Community Server (GPL)
     
    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
     
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
     
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     
    mysql> /*selectionner une base*/
    mysql> use hct;
    Database changed
    mysql>
    mysql> /*afficher les tables présentes dans cette base*/
    mysql> show tables;
    +-------------------+
    | Tables_in_hct     |
    +-------------------+
    | table1            |
    | table 7           |
    | table 8           |
    +-------------------+
    3 rows in set (0.00 sec)
     
    mysql>
    mysql> /*importer le fichier base1.csv*/
    mysql> LOAD DATA INFILE 'base1.csv'
        -> REPLACE
        -> INTO TABLE table1
        -> FIELDS
        -> TERMINATED BY ';'
        -> ENCLOSED BY '"'
        -> ESCAPED BY '\\'
        -> LINES
        -> STARTING BY ''
        -> TERMINATED BY '\n'
        -> (A, B, C);
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use near '?base
    1.csv?
    REPLACE
    INTO TABLE table1
    FIELDS
    TERMINATED BY ';'
    ENCLOSED BY '"'
    E' at line 1
    mysql>

  13. #13
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Alors oui, il faut créer la table avant!!!!
    Ensuite c'est quoi pour des nom de table , même les noms de colonne c'est n'importe quoi.
    Même en cas de test on fait les choses correctement.
    Maintenant montre nous un exemple de ton fichier cvs

  14. #14
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    on ne peut pas joindre de .csv => je l'ai zippé:
    3_Economy_Growth.zip

    Remarque: à l'ouverture du fichier csv il faut décocher la virgule
    Le séparateur de champ est: ";" point-virgule

  15. #15
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bon déjà, il faut virer la première ligne qui sert à rien.
    Ensuite, tu as 15 informations et toi tu essayes d'en insérer 3

    Soit déjà clair avec toi même sur ce que tu veux faire.

  16. #16
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bon alors, je suis parti de ton fichier.
    J'ai créer une table avec 16 colonnes répartit comme suit :

    1 id
    4 varchar(255)
    12 float

    ensuite j'ai appliqué le script suivant (a toi de modifier) et ça roule.

    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
     
    <?php
     
    $dsn = 'mysql:dbname=laTable;host=127.0.0.1';
    $user = 'user';
    $password = 'passwod';
     
    try {
        $pdo = new PDO($dsn, $user, $password);
        $sql = 'INSERT INTO insert_csv (col1, col2, col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
         $stmt = $pdo->prepare($sql);
     
     
        $row = 1;
        if (($handle = fopen("test.csv", "r")) !== FALSE) {
            while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
                if($row!=1) { //pour éviter la ligne avec les titres
     
                    $stmt->execute($data);
                    echo "<p> la ligne $row: est inséré <br/></p>\n";
                }
                $row++;
            }
            fclose($handle);
        }
     
    } catch (PDOException $e) {
        echo 'Connexion échouée : ' . $e->getMessage();
    }

  17. #17
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci MaitrePylos

    J'ai opté pour le type de variable numérique DECIMAL(..., ...), avec FLOAT on a une perte de précision

    Y a un souci au niveau des champs vides
    Les champs "vides" dans le classeur OpenOfficeCalc sont transformés en "0" dans phpmyadmin
    Y a t il un moyen d'attribuer la valeur "NULL" aux champs "vides"?

    Cordialement

  18. #18
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $num = count($data);
    for ($c=0; $c < $num; $c++) {
    	if (!empty($data[$c]) && trim($data[$c]) !== '') {$data[$c]=$data[$c];} else {$data[$c]=null;}
    }

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

Discussions similaires

  1. Importer une table de plusieurs mdb en VBA
    Par Jean-Marc68 dans le forum VBA Access
    Réponses: 9
    Dernier message: 16/03/2007, 13h55
  2. Réponses: 3
    Dernier message: 20/07/2006, 15h41
  3. Importer une table supérieure à 1Mo
    Par BlacKou dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/03/2006, 10h23
  4. Comment exporter / importer une table postgres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 01/03/2005, 18h22

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