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

Langage PHP Discussion :

importer un fichier texte dans une table de la base de données mysql [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut importer un fichier texte dans une table de la base de données mysql
    Bonjour à tous ! je suis débutant en PHP et j'ai un problème dans ce langage qui est le suivant: dans mon projet donc je suis en train de coder en PHP, j'ai un fichier texte que je dois lire chaque ligne contenant 6 mots chacune, et stocker ces 6 mots respectivement dans 6 colonnes d'une table de ma Base de Données (MySQL). Ceci pour toutes les lignes (plus de 100000 lignes). Voici le détail:

    (IM ME ES PU AK MD)
    624030743830000 A100001D7DEE6D 80E5FA73 37312379 0E47EA7A6F444640 33830000
    624030743830001 A100001D7DEE6E 80AE089F 91944192 F9052B04E3969977 33830001
    624030743830002 A100001D7DEE6F 809A1A9F 29861661 4617481A74D864B5 33830002
    624030743830003 A100001D7DEE70 80E68950 20303707 1C45F0418B552C45 33830003
    624030743830004 A100001D7DEE71 80C275C6 70591541 EA26D0523114FFF2 33830004
    624030743830005 A100001D7DEE72 80932253 44181182 1384BC94E9D33B9C 33830005
    624030743830006 A100001D7DEE73 8035029C 38663053 1225153351556433 33830006
    624030743830007 A100001D7DEE74 80CB3B71 64591576 3C96BB2772B43D85 33830007
    624030743830008 A100001D7DEE75 800B3616 06726100 E33622230DA94ABF 33830008

    voilà un extrait du contenu de mon fichier texte. Maitenant il faut que je le charge dans une table (nommée: coord) de ma BD (nommée: gestnu), structure de la table: colonne 1 -> IM, 2 -> ME, 3 -> ES, 4 -> PU, 5 -> AK, 6 -> MD




    voici le premier code que j'ai essayé:

    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
    <?php
     
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
    //on vide la table coordab avant
    mysql_query("TRUNCATE TABLE coordab");
     
    //On ouvre le fichier en question (en lecture seule)
    $handle = fopen("fichab.txt", "r");
     
    //on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
    while ($data = fgetcsv($handle, 1000, " ")) {
     
    //$data correspond à une ligne complete, nous n'avons plus qu'à l'exploser pour tout récupérer
    	$explode = explode(' ',$data[0]);
     
    //Maintenant qu'on à tous, on l'insert en base
    mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
     	           VALUES (".$explode[0].",".$explode[1].",".$explode[2].",".$explode[3].",".$explode[4].",".$explode[5].");") or die(mysql_error());
        }
    //On ferme le fichier
    fclose($handle);
    ?>

    Il m'affiche l'erreur suivante:

    Notice: Undefined offset: 1 in C:\wamp\www\etudephp\chargerbd.php on line 20
    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 ',,,)' at line 2



    SVP aidez moi c'est mon tout premier projet php et je suis bloqué à cause de ce problème. Vraiment je ne connais pas.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    tu as fait deux fois le découpage sur l'espace.
    Tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ($data = fgetcsv($handle, 1000, " ")) {
     
    mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
     	           VALUES ('".$data[0]."','".$data[1]."','".$data[2]."','".$data[3]."','".$data[4]."','".$data[5]."');") ;
    }
    ou encore plus simplement, plutôt que de découper ta ligne pour la recomposer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (($ligne = fgets($handle, 4096)) !== false) {
            mysql_query('INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
     	           VALUES ("'.str_replace(' ', '","', $ligne) . '")');
        }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut importer un fichier texte dans une base de données mysql
    Merci pour votre disponibilité ! voici le code que j'ai modifié:




    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
     
     
    <?php
     
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
    //on vide la table coordab avant
    mysql_query("TRUNCATE TABLE coordab");
     
    //On ouvre le fichier en question (en lecture seule)
    $handle = fopen("fichab.txt", "r");
     
    //on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
    while ($data = fgetcsv($handle, 1000, ",")) {
     
    //$data correspond à une ligne complete, nous n'avons plus qu'à l'exploser pour tout récupérer
    	$explode = explode(' ',$data[0]);
     
    //Maintenant qu'on à tous, on l'insert en base
    mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
    VALUES ('".$explode[0]."','".$explode[1]."','".$explode[2]."','".$explode[3]."','".$explode[4]."','".$explode[5]."');") or die(mysql_error());
     
        }
    //On ferme le fichier
    fclose($handle);
     
    ?>
     
    Et j'obtient l'erreur suivante (elle se présente sous la forme de quatre tableaux): 
     
    ( ! ) Notice: Undefined offset: 2 in C:\wamp\www\etudephp\chargerbd.php on line 20
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0005	251256	{main}( )	..\chargerbd.php:0
     
    ( ! ) Notice: Undefined offset: 3 in C:\wamp\www\etudephp\chargerbd.php on line 20
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0005	251256	{main}( )	..\chargerbd.php:0
     
    ( ! ) Notice: Undefined offset: 4 in C:\wamp\www\etudephp\chargerbd.php on line 20
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0005	251256	{main}( )	..\chargerbd.php:0
     
    ( ! ) Notice: Undefined offset: 5 in C:\wamp\www\etudephp\chargerbd.php on line 20
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0005	251256	{main}( )	..\chargerbd.php:0

    S'il vous plait aidez moi toujours, je ne connait vraiment pas.

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    Tu fais toujours deux découpages, seulement maintenant c'est une fois avec "," et une autre fois avec l'espace.

    Il n'y a pas de "," dans ton fichier ce qui fait que toute ta ligne se retrouve dans ton $data[0].

    N'hésite pas à abuser du print_r($data) et print_r($explode) juste pour voir ce que donne les résultats des fonctions que tu utilises.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut importer un fichier texte dans une base de données mysql
    Voici le code j'ai modifié comme vous m'avez dit:


    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
    <?php
     
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
    //on vide la table coordab avant
    mysql_query("TRUNCATE TABLE coordab");
     
    //On ouvre le fichier en question (en lecture seule)
    $handle = fopen("fichab.txt", "r");
     
    //on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
    while ($data = fgetcsv($handle, 1000, " ")) {
     
    //$data correspond à une ligne complete, nous n'avons plus qu'à l'exploser pour tout récupérer
    	$explode = explode(' ',$data[0]);
     
    //Maintenant qu'on à tous, on l'insert en base
    mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
    VALUES ('".$explode[0]."','".$explode[1]."','".$explode[2]."','".$explode[3]."','".$explode[4]."','".$explode[5]."')") or die(mysql_error());
     
        }
    //On ferme le fichier
    fclose($handle);
    Il rempli uniquement le premier champs IMSI avec ces valeurs exactes sur toutes les lignes jusqu'à la fin du fichier et les autres champs restent vides et une erreur s'affiche au navigateur. SVP jettez un coup d'oeil sur ces captures d'ecrans.

    ?>
    Nom : CaptureErreur.png
Affichages : 2774
Taille : 169,0 Ko

    Nom : CaptureResultat.png
Affichages : 2907
Taille : 216,3 Ko

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut importer un fichier texte dans la base de données mysql
    J'ai mis la virgule à la ligne n° 17 mais ça n'affiche toujours rien. Que faire ?

    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
    <?php
     
    set_time_limit(0);
    error_reporting(E_ALL ^ E_NOTICE);
     
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
    //on vide la table coordab avant
    mysql_query("TRUNCATE TABLE coordab");
     
    //On ouvre le fichier en question (en lecture seule)
    $handle = fopen("fichab.txt", "r");
     
    //on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
    $i = 0;
            $queryBase = 'INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) VALUES, ';
            $query = $queryBase;
            while (($data = fgetcsv($handle, 0, " ")) !== FALSE) 
            {
     
                $query .= "('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]')";
                if ($i % 5000 == 0) 
                {
                    // On enlève la dernière virgule
                    $query = substr($query, 0, -1);
                    mysql_query($query);
                    $query = $queryBase;
                }
                $i++;
            }
            // Pour les derniers enregistrements
            if ($query != $queryBase) {
                   $query = substr($query, 0, -1);
                   mysql_query($query);
            }
     
     
     
    ?>

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    C'est que ton traitement prends du temps, et par défaut php limite l'exécution d'un script à 30 secondes.

    Pour enlever cette limitation

  8. #8
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    Avant de montrer une barre de progression, il y a déjà quelques améliorations à faire au niveau de ta requête pour qu'elle s'effectue bien plus rapidement.

    En premier lieu, ne pas faire un insert à chaque ligne mais ne le faire que toutes 1000 voir même 5000 ou 10000 lignes.

    L'idée c'est quelque chose comme ça :
    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
     
            $i = 0;
            $queryBase = 'INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) VALUES ';
            $query = $queryBase;
            while (($data = fgetcsv($handle, 0, " ")) !== FALSE) {
     
                $query .= "('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]'),";
                if ($i % 5000 == 0) {
                    // On enlève la dernière virgule
                    $query = substr($query, 0, -1);
                    mysql_query($query);
                    $query = $queryBase;
                }
                $i++;
            }
            // Pour les derniers enregistrements
            if ($query != $queryBase) {
                   $query = substr($query, 0, -1);
                   mysql_query($query);
            }
    Tu devrais déjà gagner énormément en performance

  9. #9
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    Il manque la virgule au bout de la ligne $query...

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

Discussions similaires

  1. [VB6]Importer un fichier texte dans une table ACCESS
    Par jean-pierre96 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/02/2013, 15h55
  2. Importer un fichier texte dans une table en VBA
    Par Benji01 dans le forum VBA Access
    Réponses: 8
    Dernier message: 18/04/2008, 23h47
  3. Réponses: 4
    Dernier message: 09/01/2008, 16h20
  4. Importer un fichier texte dans une table avec champ Memo
    Par Steph4fun dans le forum Paradox
    Réponses: 12
    Dernier message: 25/11/2007, 23h10
  5. Comment importer un fichier text dans une table
    Par mongilotti dans le forum SQL
    Réponses: 6
    Dernier message: 21/05/2007, 13h05

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