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 d'une table à l'autre + mise a jour d'un champ dans la table d'arrivée


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 107
    Points : 73
    Points
    73
    Par défaut Copie d'une table à l'autre + mise a jour d'un champ dans la table d'arrivée
    Bonjour, j'ai un petit problème et je ne sais pas comment m'y prendre

    Voilà : je copie le contenu d'une table A dans une table B avec cette commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE <ma-clause>");
    Cela fonctionne sans problème.
    J'ai souhaité ensuite modifier un champ des nouvelles entrées ainsi crées dans la table B. J'ai tenté de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("UPDATE `B` SET <mon-champ-a-modifier> WHERE `id`='".mysql_insert_id()."'");
    Mais évidemment en utilisant comme clause mysql_insert_id() seule la dernière ligne copiée dans la table B est modifiée. Or si la requete insert crée plusieurs entrées, je souhaiterai que chacune de ces entrées soient affectées.

    Donc ma question : existe-t-il une ligne de commande à ajouter à ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE <ma-clause>");
    pour qu'en plus à chaque entrée créée dans la table B, cette entrée ai un champs mis à jour (<mon-champ-a-modifier>) Un truc que j'imagine dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE <ma-clause> AND `<le-champ-a-modifier-dans-la-derniere-insertion-de-B>`='<la-valeur>'");
    Ou sinon une autre solution...

    merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Comment fait tu cela ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE <ma-clause>");
     
    mysql_query("UPDATE `B` SET <mon-champ-a-modifier> WHERE `id`='".mysql_insert_id()."'");

    Dans une même boucle ?



    Apres ton 1er insert , fait un select * from A avec un while ou dedans tu mets tes updates.

    Tu as déja essayé ?

    Steven

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 107
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par steven78700 Voir le message
    Bonjour,

    Comment fait tu cela ? :

    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE <ma-clause>");

    mysql_query("UPDATE `B` SET <mon-champ-a-modifier> WHERE `id`='".mysql_insert_id()."'");


    Dans une même boucle ?


    Steven
    Non je ne le fait pas dans une boucle... En fait je faisais les deux requetes l'une à la suite de l'autre et je me suis apperçu que bien sur le résultat obtenu n'était pas ce que je souhaitais...

    j'ai tenté de faire une boucle genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    $req=mysql_query("ma-requete-de-copie");
     
    while($line=mysql_fetch_row($req)){
           <commande pour ecrire la nouvelle valsuer dans B>
    }
    Mais evidemment j'ai un message d'erreur qui me dit que l'argument de mysql_fetch_row n'est pas bon... j'ai tenté sans y croire et j'avais raison

    je pense que cette solution est sur la bonne piste mais le mysql_fetch_row ne convient pas puisque la requête n'est pas un SELECT. Autrement dit existe-il un truc genre mysql_fetch_row mais permettant de récuperer un résultat de requete de copie...

    Citation Envoyé par steven78700 Voir le message
    Apres ton 1er insert , fait un select * from A avec un while ou dedans tu mets tes updates.
    Non, c'est la table B que je veux ensuite update pour résumer

    - Je veux copier certaines ligne de A vers B mais je ne sais pas à priori combien de lignes seront affectées pour la copie

    - Je me retrouve donc avec x lignes copiées dans B

    - je veux mettre à jour un champ de ces x ligne copiée dans b et cette valeur sera différente du champ correspondant à la même entrée dans la table A

    - Le seul moyen que j'ai d'identifier les lignes copiées dans B c'est leur id auoincrementiel

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 107
    Points : 73
    Points
    73
    Par défaut
    Une autre idées me vient pour arranger mon problème.

    Si une requête de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE <maclause>");
    génère plusieurs insertions dans la table B. Comment récupéré les valeurs du champ auto-increment (disons le champ id) pour chacune de ces nouvelles entrèes ? Car mysql_insert_id ne retourne que le dernier id créé par cette requête. Il me faudrait une sorte de multi_mysql_insert_id

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Points : 53
    Points
    53
    Par défaut
    Peux tu développer quand tu dis que tu veux mettre à jour ton champs ID de la table B stp ?


    Merci

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Heu...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO tblb SELECT a,b,CONCAT(c, 'peter') FROM tbla WHERE c='hello'

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 107
    Points : 73
    Points
    73
    Par défaut
    je me suis peut-être mal exprimé désolé, je vais essayé d'être plus précis :

    Ma table A constituée des champs par exemple :
    id, nom, prenom, age

    Ma table B est une copie de la table A au niveau de la structure donc ces champs sont également
    id, nom, prenom, age

    Pour les deux table le champ ID est en auto-increment

    Disont que ma table A contienne ça :

    1 Legrand, Albert, 10
    2 Machin, Arthur, 20
    3 Bidule, Toto, 20
    4 Chose, Titi, 20

    Je veux copier d'un bloc dans la table B toutes les personnes ayant 20 ans je fait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE `age`=20");
    Ma table B contient donc ça :

    1 Legrand, Albert, 10
    2 Machin, Arthur, 20
    3 Bidule, Toto, 20
    4 Chose, Titi, 20

    Je veux ensuite modifier ma table B en passant l'âge des dernière lignes inscrites dans cette base à 0. Mais je ne peux pas faire "UPDATE" avec une clause "WHERE age=20" (parce que dans mon prog à priori je ne peu pas savoir ce que contient age au moment de la requête).

    Donc je me suis dit que dans une éventuelle requête UPDATE table B faites de suite après la requête de copie de A vers B il y aurait peut-être un moyen de trouver l'id (au-increment) de la table b des dernière insertions comme clause pour l'UPDATE et de pouvoir faire la mise à jour donc un truc du genre ( je reprend la première requête également pour plus de clarté):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mysql_query("INSERT INTO `B` SELECT * FROM `A` WHERE `age`=20");
    mysql_query("UPDATE `B` SET `age`=0 WHERE `id`='".mysql_insert_id()."'");
    Seulement cette solution ne passe l'âge à 0 que de la dernière ligne inscrite dans la table or moi je veux que toutes les lignes créées dans B par la requête de copie/insertion de A vers B soient affectées par l'update soit dans notre cas 3 lignes.

    Comme je ne trouve pas de solution du côté de mysql_insert_id() je me demande si dans la commande d'insertion/copie on ne peut pas bidouiller un truc qui permettent en une seule commande de copier les bonnes lignes et en plus de les mettre à jour dans la table B

    ou alors autre solution :

    Un truc qui me permettent de récupérer les dernier id auto-inc inscrits dans la table B suite à la commande de copie (et donc connaissant ces id je peut ensuite faire ma mise à jour)

    ou encore

    Une commande ou un bout de code qui permettrait de faire comme un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while($line=mysql_fetch_row($ma_requete_de_copie))
    Sauf que mysql_fetch_row à ma connaissance n'est capable de générer un jeu de résultat que pour un SELECT (mais peut-être je me trompe). Il faudrait un mysql_fetch_row capable de générer un jeu de résultat mais issu d'une commande INSERT. La je pourrais ensuite faire mes UPDATES dans la boucle.

    Une de ces solutions est-elle réalisable si oui comment ? Ou Alors toute autre suggestion est la bienvenue

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par reventlov Voir le message
    Une de ces solutions est-elle réalisable si oui comment ? Ou Alors toute autre suggestion est la bienvenue
    Bonjour,

    Je répond car ça pourra toujours servir. Si j'ai bien compris tu veux copier des lignes d'une de tes tables selon une condition, puis modifier un des champs de ces lignes.

    Tu peux utiliser INSERT INTO + SELECT et forcer un des champs à se remplir avec la valeur désirée. Dans ton cas, commence par insérer uniquement les lignes où la modification ne doit pas se faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `B` SELECT * FROM `A` WHERE `age` <>20
    puis une seconde requête où tu inserts les lignes où la modification doit se faire, en forçant la valeur du champs dans le select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `B` SELECT id, nom, prenom, 0 FROM `A` WHERE `age` = 20

Discussions similaires

  1. Problème de copie d'une machine à l'autre via SSH
    Par junior222 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/08/2014, 14h26
  2. Copie d'une plage à l'autre
    Par hortencia dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/11/2011, 00h45
  3. [XL-2003] copie d'une ligne sur autre feuille
    Par sofynet dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/07/2011, 14h25
  4. [WD14] Mise à jour d'un champ dans une table
    Par forgotten dans le forum WinDev
    Réponses: 2
    Dernier message: 16/03/2011, 10h34
  5. Mise a jour d'un champ dans une base access
    Par FabriceAmex dans le forum IHM
    Réponses: 9
    Dernier message: 10/06/2010, 09h48

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