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 :

Select et Insert a partir de 2 database [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut Select et Insert a partir de 2 database
    Bonjour,

    Je souhaite faire un select d'une base Oracle puis inserer le résultat dans une base MySql en utilisant PDO.
    Mon code fonctionne correctement mais je ne pense pas qu'il soit bien optimisé.

    Auriez des commentaires sur la méthode la plus performante.

    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
     
    try
        {
     
        $db = new PDO("odbc:wh", 'wh', 'wh');
        $dbup = new PDO('mysql:host=localhost;dbname=uat', 'root', '');
     
        //select all lines from the Oracle DB
        $result = $db->prepare('SELECT * FROM item_master WHERE ROWNUM <= 5000');
     
        foreach($result as $row)
        {
        //Insert all lines in the MySql DB
          $dbup->exec("INSERT INTO item_master (SKU_ID,SIZE_DESC) VALUES ('" . $row['SKU_ID'] . "','" . $row['SIZE_DESC'] . "')")
    	  or die(print_r($dbup->errorInfo(), true));
     
        }
     
     
        // close the database connection
        $db = NULL;
        $dbup = NULL;
      }
      catch(PDOException $e)
      {
        print 'Exception : '.$e->getMessage();
      }

  2. #2
    Membre expérimenté Avatar de stephanegib2
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 152
    Par défaut
    Salut,

    il vaut mieux faire une seule requête INSERT, que plusieurs petites requêtes.
    tu peux éventuellement utiliser les transactions.
    Dans ta requête SELECT, sélectionne les champs que tu a besoin. Sa sert a rien de récupérer des choses que tu n'utilises pas.

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Bonjour,

    quoi ca ? exec() ... ne pas faire de $dbup prepare() avant la boucle oui pas vraiment bon

  4. #4
    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
    Oui effectivement il en manque par endroits et même il y en a aussi trop à d'autres endroits : la notion des requêtes préparées est à revoir.
    1/ La première requête SELECT ne gagne rien à être préparée car elle n'est pas répétitive et ne contient aucune donnée utilisateur particulièrement sensible à protéger.
    2 /Par contre la requête d'insertion risque d'être exécutée de nombreuses fois. C'est donc elle qu'il convient de préparer en mettant la préparation avant la boucle comme suggérer par papajoker

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    Oui je me suis rendu compte que la requete préparée n'avait pas grand interet.

    J'ai éssayer de tenir compte des remarques et avec le code ci-dessous j'obtiens une execution de la requete plus rapide.

    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
     
    try
    {
    	$pdo = new PDO('mysql:host=localhost;dbname=uat', 'root', '');
        $db = new PDO("odbc:wh", 'wh', 'wh');
     
        $pdo->beginTransaction();
     
        $result = $db->query('SELECT SKU_ID,SIZE_DESC FROM item_master WHERE ROWNUM <= 5000');
     
    	foreach($result as $row)
        {
     
          $pdo->query("INSERT INTO item_master(SKU_ID,SIZE_DESC) VALUES ('" . $row['SKU_ID'] . "','" . $row['SIZE_DESC'] . "')");
     
        }
     
        $pdo->commit();
     
    }

  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
    Et pourquoi ne veux-tu pas faire une requête préparée pour l'insertion ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    A vrai dire je ne sais pas, le seconde code est plus rapide à l'éxécution que celle avec la requte préparée.

    C'est plus sur la méthode de construction de mon code que je m'interroge, a savoir si la boucle utilisée est bonne ou si je dois m'orienter vers une classe par exemple..

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //...
        $insert = $dbup->prepare("INSERT INTO item_master(SKU_ID,SIZE_DESC) VALUES (?,?)");
     
    foreach($result as $row)
        {
          $insert->execute(array($row['SKU_ID'],$row['SIZE_DESC']));
        }

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    Je pensais que tu parlais de préparer le sélect....

  10. #10
    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
    Faudrait être plus attentif. Regardes mes précédents messages ici et .
    Il faudrait apprendre à suivre des conseils sans qu'on te donne le code, parce qu'on ne le fait pas tout le temps, t'as de la chance qu'il n'y avait que deux lignes à écrire

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

Discussions similaires

  1. [Sous requetes] insertion a partir d'un select
    Par max44410 dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/05/2007, 02h46
  2. Select et insert avec des caracteres speciaux (quote ')
    Par Paco75 dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/10/2006, 14h59
  3. insertion a partir d'un formulaire dans bd
    Par vanou dans le forum ASP
    Réponses: 25
    Dernier message: 22/06/2006, 09h38
  4. [Oracle 9i] insertion a partir de plusieurs tables
    Par micoscas dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2006, 17h26
  5. Réponses: 5
    Dernier message: 14/03/2006, 16h12

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