Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/11/2011, 13h27   #1
Membre à l'essai
 
Inscription : mars 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 66
Points : 22
Points : 22
Envoyer un message via MSN à reventlov
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 :
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 :
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 :
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 :
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
reventlov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 13h33   #2
Futur Membre du Club
 
Inscription : septembre 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 36
Points : 15
Points : 15
Bonjour,

Comment fait tu cela ? :

Code :
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
steven78700 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/11/2011, 13h41   #3
Membre à l'essai
 
Inscription : mars 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 66
Points : 22
Points : 22
Envoyer un message via MSN à reventlov
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 :
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
reventlov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 14h20   #4
Membre à l'essai
 
Inscription : mars 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 66
Points : 22
Points : 22
Envoyer un message via MSN à reventlov
Une autre idées me vient pour arranger mon problème.

Si une requête de type :

Code :
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
reventlov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 18h01   #5
Futur Membre du Club
 
Inscription : septembre 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 36
Points : 15
Points : 15
Peux tu développer quand tu dis que tu veux mettre à jour ton champs ID de la table B stp ?


Merci
steven78700 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 18h07   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 031
Points : 5 031
Heu...

Code :
INSERT INTO tblb SELECT a,b,CONCAT(c, 'peter') FROM tbla WHERE c='hello'
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 09h02   #7
Membre à l'essai
 
Inscription : mars 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 66
Points : 22
Points : 22
Envoyer un message via MSN à reventlov
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 :
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 :
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 :
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
reventlov est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h26.


 
 
 
 
Partenaires

Hébergement Web