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 :

Optimiser la mise à jour de la Base


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut Optimiser la mise à jour de la Base
    Bonsoir à tous !

    Je suis débutant en PHP, et j'ai écrit un petit code pour pouvoir mettre à jour les données de ma BDD.
    En fait ces informations sont contenues dans un fichier texte (de nom fichab.txt), la première colonne du fichier texte correspond à l'IMSI et la seconde colonne correspond à MEID. Et le but est de:

    Pour chaque IMSI du fichier texte (même IMSI qui se trouve dans la BDD) remplacer son MED de la BDD par celui qui est contenu dans le ficher texte. Bref l'IMSI et MEID se trouvent dans une même table de la BDD et c'est la colonne MEID que l'on veut modifier.

    Voici la structure de mon fichier texte qui a la structure que ma BDD.

    (------IMSI---------------MEID)
    624030743830000 1100001D7DEE6D
    624030743830001 CC00001D7DEE6E
    624030743830002 3100001D7DEE6F
    624030743830003 4100001D7DEE70
    624030743830004 CC00001D7DEE71


    Voici mon script:
    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
    <?php
    set_time_limit(0);
    error_reporting(E_ALL ^ E_NOTICE);
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
    /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;
    while (($data = fgetcsv($handle, 0, " ")) !== FALSE) {
        $queryBase = 'UPDATE coordab SET MEID="'.$data[1].'", WHERE IMSI="'.$data[0].'"';
        mysql_query($queryBase);
    } 
    //on ferme le fichier
    fclose($handle);
    ?>
    Lorsque je l'exécute, il fait la mise à jour mais en prenant beaucoup de temps car le fichier contient 9999 lignes.

    Je voudrais que vous m'aidiez avec des astuces pour pouvoir réduire le temps d'exécution de ce script.

    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
    Par défaut
    Commence par afficher les requêtes dans ta boucle pour voir ce qui se passe.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    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
    Par défaut
    ça fait déjà la mise à jour mais le temps d'exécution est très élevé.
    S'il vous plait aidez moi à optimiser ce code.
    Merci d'avance!

  4. #4
    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
    Par défaut
    Si tu changes la question en cours de route aussi c'est difficile de te suivre

    mais en prenant beaucoup de temps car le fichier contient 9999 lignes.
    10000 lignes ce n'est rien du tout.
    Donne nous la structure de ta table coordab.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    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
    Par défaut
    Bonjour !

    Je m'excuse pour le temps de réponse. Je n'étais plus connecté.

    Voici la structure de ma table coordab:
    Code sql : 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
    -- phpMyAdmin SQL Dump
    -- version 4.0.4
    -- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
    --
    -- Client: localhost
    -- Généré le: Mer 26 Février 2014 à 07:33
    -- Version du serveur: 5.6.12-log
    -- Version de PHP: 5.4.12
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
    --
    -- Base de données: `gestnum`
    --
    CREATE DATABASE IF NOT EXISTS `gestnum` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    USE `gestnum`;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `coordab`
    --
     
    CREATE TABLE IF NOT EXISTS `coordab` (
      `ida` int(60) NOT NULL AUTO_INCREMENT,
      `IMSI` varchar(255) NOT NULL,
      `MEID` varchar(255) NOT NULL,
      `ESN1` varchar(255) NOT NULL,
      `PUK1` varchar(255) NOT NULL,
      `AKY` varchar(255) NOT NULL,
      `MDN` varchar(255) NOT NULL,
      PRIMARY KEY (`ida`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
     
    --
    -- Contenu de la table `coordab`
    --
     
    INSERT INTO `coordab` (`ida`, `IMSI`, `MEID`, `ESN1`, `PUK1`, `AKY`, `MDN`) VALUES
    (1, '624030743830000', 'A100001D7DEE6D', '80E5FA73', '37312379', '0E47EA7A6F444640', '33830000'),
    (2, '624030743830001', 'A100001D7DEE6E', '80AE089F', '91944192', 'F9052B04E3969977', '33830001'),
    (3, '624030743830002', 'A100001D7DEE6F', '809A1A9F', '29861661', '4617481A74D864B5', '33830002'),
    (4, '624030743830003', 'A100001D7DEE70', '80E68950', '20303707', '1C45F0418B552C45', '33830003'),
    (5, '624030743830004', 'A100001D7DEE71', '80C275C6', '70591541', 'EA26D0523114FFF2', '33830004');
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

    S'il vous plait aidez moi.

    Merci d'avance.

  6. #6
    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
    Par défaut
    Utilise des types de colonnes adaptées et pas varchar(255) partout.
    ISMSI ca serait un CHAR(15) par exemple et MEID un CHAR(14).
    Ensuite ajoute un index sur ISMSI.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre confirmé
    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
    Par défaut Modifier une colonne d'une table de la BDD MySQL
    Bonjour à tous !

    J'ai un souci, en fait j'ai une table de ma BDD qui a cinq colonnes et je voulais insérer les données dans les deux premières colonnes.
    Mais lorsque j'exécute mon script, il insère ces données à la fin de la table c'est à dire à partir de la dernière ligne de la table:

    Exple:

    ida-----IMSI----MEID----ENS1----PUK1----MDN

    1------------------------20-------AD-----13
    2------------------------21-------AE-----14
    3------A22------G40-----22-------AF-----15
    4------A23------G4A------------------------
    5------A24------G4B------------------------
    6------A25------G4C------------------------

    Les colonnes IMSI et MEID sont celles dont j'ai mis les valeurs à travers mon script.
    Mon souci est de savoir comment faire pour que les données entrent dans ces deux colonnes à partir de la première ligne (ida=1).

    Voici mon script:
    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
     
    <?php
     
    set_time_limit(0);
    error_reporting(E_ALL ^ E_NOTICE);
     
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
     
    //On ouvre le fichier en question (en lecture seule)
     
    $handle = fopen("fichab.txt", "r");
     
    $i=0;
     
            $queryBase = 'INSERT INTO coordab (IMSI, MEID) VALUES ';
            $query = $queryBase;
            while (($data = fgetcsv($handle, 0, " ")) !== FALSE)
            {
                $query .= "('$data[0]', '$data[1]'),";
                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);
            }
     
     //on ferme le fichier
    fclose($handle);
     
     
    ?>
    Mes données viennent d'un fichier texte (fichab.text).

    S'il vous plait aidez moi à résoudre ce problème.

    Merci d'avance !

  8. #8
    Membre Expert

    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
    Par défaut
    Il faut que tu fasses un UPDATE dans ta base de données, et non un INSERT

  9. #9
    Membre confirmé
    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
    Par défaut
    Merci pour votre aide !

    Voici j'ai d'abord essayé de faire avec UPDATE mais le temps d'exécution est trop élevé (plus d'une dizaine de minute), mon fichier a 9999 lignes.

    C'est pour cela que j'ai voulu exploité le code que vous m'avez envoyé récemment.

    Voici mon script avec UPDATE:

    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
     
     
    <?php
     
    set_time_limit(0);
    error_reporting(E_ALL ^ E_NOTICE);
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
    //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, 0, " ")))
     {	
     
    $req = 'UPDATE coordab SET MEID="'.$data[1].'" WHERE IMSI ="'.$data[0].'"';    
    mysql_query($req);				
     
     }
    //on ferme le fichier
    fclose($handle);
     
    ?>

  10. #10
    Membre Expert

    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
    Par défaut
    Le soucis c'est que mon code ne peut être adapté avec un UPDATE. Un UPDATE est spécifique, et dans ton cas, doit être exécuté 10 000 fois.

    Je t'aurais bien proposé d'utiliser les requêtes préparées qui sont fortement recommandées dans ton cas d'utilisation mais la biblitohèque mysql (devenue obsolète au passage) que tu utilises ne les supportes pas...

    Pas de solution miracle malheureusement !

  11. #11
    Membre confirmé
    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
    Par défaut
    Merci pour votre aide.

    Est ce qu'il est possible donc d'insérer les données dans ces deux colonnes en commençant à la première ligne (ida=1)

    Faites quelque chose pour m'aider une fois de plus. Je ne connais plus comment faire encore.

    Merci d'avance.

  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    Je t'aurais bien proposé d'utiliser les requêtes préparées qui sont fortement recommandées dans ton cas d'utilisation mais la biblitohèque mysql (devenue obsolète au passage) que tu utilises ne les supportes pas...
    Solution : ne plus utiliser les fonctions mysql_xxxx et passer à mysqli (ou PDO)

    Autre possibilité : tu peux essayer de parcourir la totalité de ton fichier pour regrouper les éléments par même valeur, de façon à faire des updates en masse.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

Discussions similaires

  1. [C#] [MySQL] Mise à jour de la base de donnée
    Par dev01 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 01/08/2007, 09h15
  2. probleme de virgule dans la mise à jour d'une base de donnée
    Par KAF dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/12/2005, 02h18
  3. [VB6] Recordset.update et Mise à jour de ma base
    Par badgam piero dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/12/2005, 14h38
  4. mise à jour d'une base
    Par le géologue dans le forum Access
    Réponses: 7
    Dernier message: 17/11/2005, 09h46
  5. mise à jour d'une base de données
    Par flo83 dans le forum ASP
    Réponses: 6
    Dernier message: 12/06/2005, 20h27

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