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 :

Mise à jour d'une table à partir d'une autre table [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut Mise à jour d'une table à partir d'une autre table
    Bonjour, je viens vers vous car je n'arrive pas à former une requête de mise à jour, je ne vois pas comment faire...

    De plus mes 2 tables sont sur le même serveur, mais pas sur la même base, après je peut dupliquer ma 1ere table dans la seconde base si il y a besoin...

    J'ai une table T1 dans une base BDD1 contenant entre autre champs les champs "reference" et "prix".

    J'ai une table T2 dans une base BDD2 contenant entre autre les champs "reference" et "prix".

    Je veux mettre à jour les prix de T2 à partir des prix de T1.
    Petite subtilité, une référence de T1 peut avoir plusieurs concordances dans T2 sous la forme de "référence %%%"

    Merci d'avance à tous de votre aide en espérant avoir été clair
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  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
    Je me lance :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T2 JOIN T1 ON T2.reference=T1.reference SET T2.prix = T1.prix
    (fait une sauvegarde hein )
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Hum je vois a peu près le principe mais la ca ne prends pas en compte que mes 2 références ne soit pas exactement pareil si ?
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  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
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi tes clefs ne sont pas uniformes ?

    Je pense qu'on peut faire un truc totalement affreux comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T2 JOIN T1 ON T2.reference='Référence ' &  T1.reference SET T2.prix = T1.prix
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 71
    Points
    71
    Par défaut
    Bonjour.

    Je ne suis pas sûre, mais si tes deux tables sont sur deux BDD, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     UPDATE T2 JOIN T1 ON T2.reference=T1.reference SET T2.prix = T1.prix
    ne suffira pas, si ? Il va bien falloir préciser quelque part que tu travailles sur deux BDD distinctes, non ?

    Tu veux le faire en une seule requête SQL ? Parce que sinon en PHP ça doit être un peu plus simple je pense.

  6. #6
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Je disais que je pouvais si besoin dupliquer T1 sur BDD2

    Effectivement j'ai pensé au Php mais pour une fois j'avoue que je vois pas bien l'algorithme a suivre....
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  7. #7
    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
    Deux bases distinctes ne pose aucun problème tant qu'elles sont sur le meme serveur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Certes mais dans ta requête tu ne spécifie pas dans quelle base trouver T1 et quelle base trouver T2 si ?
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  9. #9
    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
    Ca s'ecrit comme ça : base.table.colonne

    Ta connexion peut se faire sur n'importe laquelle des deux bases, ou sur aucune des deux puisque tu spécifies leurs noms dans la requête.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre régulier Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 71
    Points
    71
    Par défaut
    Re-bonjour.

    Qu'il s'agisse de PHP comme de SQL, la démarche est relativement simple si j'ai bien compris ton problème :
    - récupération des données dans T1
    - éventuellement formatage de ces données (pour pouvoir faire coller tes références, même si j'avoue ne pas avoir bien compris ce point-là)
    - mise à jour de T2

    Dupliquer T1 sur BDD2 est la solution la plus simple effectivement, mais je suppose qu'il devait y avoir une raison aux différences entre T1 et T2, donc à voir s'il faut conserver ces différences, et si tu choisis de dupliquer, voir comment garder un lien entre T1 "bis" et T2 si besoin...

    Est-ce que tu pourrais donner un exemple pour cette histoire de références différentes ? Merci.

  11. #11
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Une fois mise a jour plus besoin de corélation entre les deux bases...

    En fait pour les références dans T1 j'ai par exemple 1405 et dans T2 1405 B - 1405 Y erc... qui signifie la référence 1405 en noir "Black" ou jaune "Yellow" car c'est un site qui a été mis a jour et remis a jour, et re-remis a jour avant que j'arrive dans la boite...et oui je suis d'accord avec vous c'est un peu bancale
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  12. #12
    Membre régulier Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 71
    Points
    71
    Par défaut
    Finalement, ça ne paraît pas plus compliquer en SQL qu'en PHP, autant pour moi ^^

    Donc, si je comprends bien, quelle que soit la référence dans T2, tu vas mettre à jour d'après T1 ? Du coup il n'y aura plus de différences entre 1405-B, 1405-Y, etc. dans T2 après mise à jour ?

    Peut-être qu'il faudrait commencer par "faire un peu de ménage" dans T2 avant de continuer histoire d'alléger la suite ?

  13. #13
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    En fait par exemple dans T1 j'ai la réf 1405 à 10€

    Dans T2 je peut avoir des références du type :
    1405 B
    1405 Y
    1405 NB
    1405 XXXX
    qui sont toutes par exemple a 15€

    Il faut que je fasse concorder mes prix de T2 avec ceux de T1 c'est à dire mettre toutes les références du type 1405%% à 10€

    il n'y a aucune référence en trop dans T2

    suis-je clair ?
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  14. #14
    Membre régulier Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 71
    Points
    71
    Par défaut
    C'est clair , moi par contre je ne l'ai peut-être pas été Je ne disais pas qu'il faut "vider" T2 (je suppose que si ces références sont stockées, c'est qu'elles sont à conserver ^^), mais qu'il fallait peut-être (et j'insiste sur le "peut-être" !) légèrement en modifier la structure pour l'adapter... Maintenant c'est toi qui connaît le projet et qui peut juger si c'est nécessaire ou non, c'était juste une suggestion

    Finalement, avec la requête toute simple de Sabotage, ça paraît plutôt simple en mettant ta référence dans une close WHERE... à la condition bien sûr que toutes tes références, dans T1 comme dans T2, aient un "format" similaire (si des fois les références dans T2 sont 1405-B et d'autres fois B-1405, ça devient un peu plus compliqué )... ça donnerait quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     UPDATE T2 SET T2.prix = 
    (SELECT T1.prix FROM T1 WHERE T1.ref = 'XXX') 
    WHERE T2.prix LIKE 'XXX%'

  15. #15
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Yes, elles ont toujours la même structure

    La requête me parait clair mais comment je dois l'écrire pour lui dire que T1 est dans BDD1 et T2 dans BDD2 jai pas saisi ce point...

    Et sinon je l'éxécute direct comme ça dans PhpMyAdmin ?

    Merci de votre aide en tout cas, j'ai le cerveau qui fume un peu aujourd'hui

    Et 2ème question dans la requête il y a T1.ref = 'XXX' mais moi je veux que ca me parcours totalement T1, que ca update toutes les références....

    Et je devance la question non je peut pas les faire à la main, il y a plus de 3000 références que je connais pas toutes d'ailleurs oui je sais suis chiant
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  16. #16
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Pourquoi tes clefs ne sont pas uniformes ?

    Je pense qu'on peut faire un truc totalement affreux comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T2 JOIN T1 ON T2.reference='Référence ' &  T1.reference SET T2.prix = T1.prix
    Oups j'avais pas vu la remarque
    Ce n'est pas moi qui ai créé les bases, je fait de la récup de code, et je sais pas pourquoi mais les références ne sont pas les clés de table...y'a un auto increment en clé
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  17. #17
    Membre régulier Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 71
    Points
    71
    Par défaut
    Bonjour.

    Tu veux donc avec ta requête parcourir toute ta table T1 pour actualiser T2 ? Alors pour les BDD différentes, Sabotage disait de noter ta table BDD1.T1 et BDD2.T2 au lieu de juste T1 et T2 je crois... Ensuite, pour la requête, euh ... Là comme ça je ne vois...

  18. #18
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Salut tout le monde en ce vendredi béni qui annonce le week-end

    Ce matin j'ai pris mon courage à deux mains et j'ai fait un script Php pour faire ma mise à jour, j'ai fait une variable $table_source car j'ai plusieurs table source en fait

    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
     
    $table_source = 'trodat_tampon';
     
    echo "<h1>--- Debut de la mise à jour des prix ---</h1>";
     
    echo "<h2>--- Traitement de la table $table_source ---</h2>";
     
    echo "<h3>Connexion à la base xxx</h3>";
     
    $bdd_machine = "localhost";
    $bdd_compte = "admin";
    $bdd_bdd="xxx";
    $bdd_motpasse = "xxx";
     
    $connect=mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
    mysql_select_db($bdd_bdd,$connect);
    unset($bdd_motpasse);
     
    $tableau = array();
     
    $sql = "SELECT reference, prix FROM $table_source ORDER by reference";
    echo "$sql<br /><br />";
    $result = mysql_query($sql);
    while($data = mysql_fetch_array($result)){
      //on recupere la reférence et le prix
      $reference = $data['reference'];
      $prix = $data['prix'];
     
      //echo "$reference -> $prix<br /><br />";
     
      //on stocke dans un tableau les référence et les prix;
      $tableau[$reference] = $prix;
    }
     
    //print_r($tableau);
     
    //maintenant on parcourt le tableau pour récupérer référence et prix
    foreach($tableau as $cle=>$valeur){
        echo "$cle -> $valeur<br>";
        echo "Connection à la base 3 clics<br />";
        $bdd_machine = "localhost";
        $bdd_compte = "admin";
        $bdd_bdd="xxx";
        $bdd_motpasse = "xxx";
     
        $connect=mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
        mysql_select_db($bdd_bdd,$connect);
        unset($bdd_motpasse);
        echo "Connecté à la base<br />";
     
        //on forme la requêt d'update de la table article2
        $sql = "UPDATE article2 SET tarifPublicHT = '$valeur' WHERE reference = '$cle'";
        echo "$sql<br />";
        mysql_query($sql);
        echo "Mise à jour effectuée<br /><br />";
     
    }
     
    ?>
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

  19. #19
    Membre régulier Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 71
    Points
    71
    Par défaut
    Bonsoir.

    Tu peux tout faire en "une fois", sans stocker tes données de T1 dans un tableau je pense. Mais surtout, attention à ta requête de mise à jour : les références n'étant pas identiques, il faut un LIKE dans ta close WHERE, et non un égal...

    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
    <?php
      $table_source = 'trodat_tampon';
     
      // CONNEXION A LA BDD 1
      $bdd_machine = "localhost";
      $bdd_compte = "admin";
      $bdd_bdd = "xxx";
      $bdd_motpasse = "xxx";
     
      $connect_bdd1 = mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
      mysql_select_db($bdd_bdd, $connect_bdd1);
      unset($bdd_motpasse);
     
      // CONNEXION A LA BDD 2
      $bdd_machine = "localhost";
      $bdd_compte = "admin";
      $bdd_bdd = "xxx";
      $bdd_motpasse = "xxx";
     
      $connect_bdd2 = mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
      mysql_select_db($bdd_bdd, $connect_bdd2);
      unset($bdd_motpasse);
     
      // SELECTION DES DONNEES DANS BDD 1
      $sql = "SELECT reference, prix FROM $table_source ORDER by reference";
      $result = mysql_query($sql, $connect_bdd1);
     
      while($data = mysql_fetch_array($result)){
        //on recupere la reférence et le prix
        $reference = $data['reference'];
        $prix = $data['prix'];
     
        // MISE A JOUR DE LA TABLE 2 : on forme la requête d'update de la table article2
        $sql = "UPDATE article2 SET tarifPublicHT = '$prix' WHERE reference LIKE '".$reference."%'";
        mysql_query($sql, $connect_bdd2);
      }
     
      // FERMETURE DES CONNEXIONS
      mysql_close($connect_bdd2); 
      mysql_close($connect_bdd1); 
    ?>
    A tester... Tiens-nous au courant

    [edit] Attention aussi au temps que prennent tes requêtes. MySQL déconnecte au bout de 30s par défaut je crois...

  20. #20
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Hello, en fait je suis passé par un tableau car c'est ce que je maitrise le mieux, et j'ai mis égal car en fait c'est égal j'avais mal vu, tout a fonctionné et est à jour

    Pour les temps d'exec c'est un select simple et un update donc pas de souci

    merci à tous
    Le contenu est roi, optimisé il est empereur...

    Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

    http://www.tethis-interactive.com

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/05/2014, 12h46
  2. Réponses: 9
    Dernier message: 23/11/2010, 10h10
  3. [WD14] mise à jour d'un enregistrement à partir d'une autre table
    Par piogo113 dans le forum WinDev
    Réponses: 9
    Dernier message: 05/05/2010, 19h06
  4. Réponses: 6
    Dernier message: 29/06/2006, 14h00
  5. [VB.NET] Mise à jour d'un site à partir d'une application
    Par boulete dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/04/2006, 12h15

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