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 :

copie entre 2 bases pour une fiche unique [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut copie entre 2 bases pour une fiche unique
    Bonjour

    après des heures sur google et des essais +- infructueux, je me décide à poser ma question

    J'ai besoin de copie des champs unique (pas le tuple complet) d'une table a une autre, et elle sont dans deux bases distincts.

    Aujourd'hui, je sais le faire pour une colonne complète, mais cela ne correspond pas a mon besoin de création de scripts permettant de faire des changements de versions complexes (incluant des chgts de structures de tables, et des calculs différents entre mes champs (exemple : un champ HT devient TTC sur une autre table).

    A ce jour, le mieux que je sache faire, c'est cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE `$tabl_cibl` LEFT JOIN `$tabl_sourc` 
    ON $tabl_cibl.$champ_cibl_id = $tabl_sourc.$champ_sourc_id 
    SET $tabl_cibl.$champ_cibl = $tabl_sourc.$champ_sourc
    mais je ne parviens pas a dire :

    je veux uniquement copier le champ "mon_champ" du tuple "X"

    Pour corser le tout, cela peut aussi concerné des champs textes, avec accents, apostrophes ect. Et pour finir, cela doit être appellable en php. donc pas de commande mysql en console.

    tant qu'a poser une question tordue, autant y aller à fond;-)

    Je remercie par avance quiconque aurait la moindre piste

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonjour,

    Si j'ai bien compris ton besoin la requête serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE tabl_cibl c
    INNER JOIN tabl_sourc s
    ON -- Les différents critère de jointure et de recherche suivant le besoin
        set c.champ_cibl = s.champ_sourc,
        c.champ_cibl = s.champ_sourc_2;
    pour mettre à jour plus de 2 champs il te suffit d'en rajouter dans la partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set champ = champ2, ...
    pour le calcul TTC avec une colonne HT + colonne TVA il te suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set c.TTC = s.HT * s.TVA
    ( le calcul peut être différent si la TVA est enregistrer en entier tel que 20 pour 20% ou en float 1.20 )

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut
    J'ai pris le temps de faire le test avant de répondre.
    c'est le reflet de mes besoins, mais ce n'est qu'un exemple

    J'ai créer une base :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `ps_product_test` (
      `id_product` int(10) unsigned NOT NULL,
      `id_lang` int(10) unsigned NOT NULL,
      `name` varchar(128) NOT NULL,
      `description1` text,
      `description2` text,
      `description3` text,
      PRIMARY KEY  (`id_product`,`id_lang`),
      KEY `id_lang` (`id_lang`),
      KEY `name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Je veux sélectionner les tuples par le couples "id_product" / "id_lang" et copier la description3 du couple1/2 dans la description2 du couple 4/3 (c'est toujours un exemple)

    j'ai fais cette fonction PHP

    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
    function CpyMysql_champ_2tabl_par_id(
    $base_source, $tabl_source, $nom_champ_id_source, $valeur_champ_id_source, $id_lang_source, $champ_a_copier_source,
    $base_cible, $tabl_cible, $nom_champ_id_cible, $valeur_champ_id_cible, $id_lang_cible, $champ_a_copier_cible,
    $dbname1, $link1, $dbname2, $link2)
    {
    $Requet1 ="
    UPDATE `$base_cible.$tabl_cible`
    INNER JOIN `$base_source.$tabl_source`
    ON $base_cible.$tabl_cible.$nom_champ_id_cible = $base_source.$tabl_source.$nom_champ_id_source.$valeur_champ_id_source
    SET $base_cible.$tabl_cible.$champ_a_copier_cible = $base_source.$tabl_source.$champ_a_copier_source
    ";
     
    mysql_select_db($dbname2,$link2);
    mysql_query("SET NAMES UTF8");
    mysql_query($Requet1,$link2) or die ("Requete <b>CpyMysql_champ_2tabl_par_id</b> invalide : $Requet1 > ".mysql_error()." <br>");// execution de la requete
    }
    On notera que j'ai deux db, c'est le reflet d'une des problèmes que je rencontre. passer les info d'un ancien système vers un nouveau en restructurant les données au passage.
    Mais je n'ai pas la moindre idée de la syntaxe pour faire un INNER JOIN entre deux bases. Au pire, ce n'est pas le plus grave, je peux toujours copier les tables pour les rassembler sur la meme base le temps de l'import.

    Le noeud du probleme est la syntaxe de la commande. Car l'exemple que j'ai fait me repond des choses du genre : Not unique table/alias: 'ps_product_test' .

    A priori, cela me semble logique, puisque je n'ai pas gerer le fais que l'ID_lang du tuple source pourrait être 4 et celui du tuple cible 2.

    C'est agacant de pas arriver a transformer les docs que je lis en code qui fonctionne !!

    J'ai le sentiment d'avancé, mais il me manque encore un bout

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    L'erreur viens du fait que dans ton scirpt php $tabl_cible et $tabl_source doivent avoir le même nom, quand tu dois faire une auto jointure tu dois donner un alias différent au deux table.

    Pour la requête correspondant à ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE ps_product_test a
    INNER JOIN ps_product_test b
    ON a.id_product = 4 AND a.id_lang = 3 AND b.id_product = 1 AND b.id_lang = 2
    SET a.description2 = b.description3

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut
    Ca y est, j'ai compris ce qui me bloquais !!
    Je n'empilais pas les conditions comme il fallait. Je pensais qu'on devait donner toutes les conditions de la source, puis les conditions de cible, mais en les séparant, dans le genre :

    ON ...... AND ..... AND
    ON ....... AND...... AND

    alors qu'en fait, on peut mettre tous les AND les uns à la suite des autres !

    Voilà qui m'ôte une sacré épine du pied. Franchement merci. ca tourne super.
    Reste plus qu'un (peu être) petit soucis.

    Mes tables sont dans deux bases distincts. Je sais deja traiter cela sur des requetes simples, mais tout mes essais avec INNER JOINT ce solde par une erreur. Je crains que ce coup ci j'en demande trop.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut Merci et encore merci
    J'ai finaliser ma fonction. C'est génial, ca fonctionne pile poil et ca me fait gagner un temps fou.

    encore merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/01/2010, 12h27
  2. Réponses: 9
    Dernier message: 09/11/2006, 10h10
  3. Réponses: 12
    Dernier message: 23/09/2006, 12h12
  4. Réponses: 1
    Dernier message: 20/06/2006, 15h11
  5. Quelle base pour une application e-musique ?
    Par Sie O'Brian dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 25/04/2006, 09h49

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