Page 1 sur 1

Liaison entre 2 bd

Posté : 29 juin 2006, 00:41
par alaingpl
Bonsoir,

Aprés une recherche infructueuse dans le forum, je souhaiterai savoir s'il est possible d'enregistrer simultanément des infos issu d'un formulaire dans 2 bd. Les 2 bd sont sur le même serveur.
Si oui comment car j'ai lu le INSERT ....SELECT et même si je n'ai pas tout saisi, je crois que ça ne correspond pas.
J'ai essayé en créant 2 fichiers confi.php et config2.php. Je les ai ensuite plaçés:
require('../config.php');
require('../config2.php'); 
Les infos ont été insérées seulement dans la bd de la config2.

J'ai essayé quelques autres bidouilles sans succés.

Si quelqu'un a une idée cela arrangerait bien mes " affaires".


Merci d'avance.

Posté : 29 juin 2006, 07:24
par Cyrano
Pour une insertion dans deux schémas différents, il faudra faire deux requêtes et deux connexions successives. Une fois préparées tes requêtes, tu devras donc avoir deux séries de fonctions pour te connecter, sélectionner le schéma et insérer les données. Je ne crois pas qu'il soit possible de le faire en une seule requête.

Posté : 29 juin 2006, 11:03
par sadeq
Le principe:
La seule obligation pour accéder aux bases de données d'un SGBDR tel que mysql sous PHP est d'ouvrir une connexion au SGBDR par mysql_connect(.....)
exemple:
//une connexion pour plusieurs accès
$connexion = mysql_connect("localhost", "root","pwd");
En suite, pour cibler une base de données particulière on a 3 méthodes :
1. utiliser autant de mysql_select_db("nom bd", $connexion) que de bases de données à ouvrir via la même connexion
exemple:
//plusieurs select_db pour interroger plusieurs bases
//1° base
mysql_select_db("base1", $connexion);
mysql_query("Insert into table1 (champ1, champ2) values ('valeur1', 'valeur2')", $connexion);
//2° base
mysql_select_db("base2", $connexion);
mysql_query("Insert into table1 (champ1, champ2) values ('valeur1', 'valeur2')", $connexion);
La seconde requête INSERT vise une table1 de la base2 tandis que la première vise une table1 de la base1 et ce via la même connexion

Les ouvertures des bases sont faites avant tout exécution de requêtes :
ce qui engendre une allocation de ressources supplémentaires qui pointent vers les bases ouvertes (variables PHP) qui persistent tout au long du programme si elles ne sont pas libérées.


2. utiliser autant de mysql_db_query("nom bd", "requête sql", $connexion) que de bases de données ciblées par les requêtes exécutées
exemple:
//plusieurs mysql_db_query pour interroger plusieurs bases
//1° base
mysql_db_query("base1", "Insert into table1 (champ1, champ2) values ('valeur1', 'valeur2')", $connexion);
//2° base
mysql_db_query("base2", "Insert into table1 (champ1, champ2) values ('valeur1', 'valeur2')", $connexion);
Même résultat que la méthode 1 : La seconde requête INSERT vise une table1 de la base2 tandis que la première vise une table1 de la base1 et ce via la même connexion

La différence est que l'ouverture de la base se passe à l'exécution de la fonction mysql_db_query qui effectue d'abord une allocation de ressource temporaire pointant vers la base ouverte et en suite exécute la requête pour cette base. La transaction une fois terminée la base est fermée et la ressource pointant vers cette base est libérée automatiquement.

3. utiliser tout simplement mysql_query("requête sql", $connexion) à condition de préfixer les noms des tables par les noms des bases qui les contiennent.
exemple:
//plusieurs mysql_query pour intérroger plusieurs bases
//1° base
mysql_query("Insert into base1.table1 (champ1, champ2) values ('valeur1', 'valeur2')", $connexion);
//2° base
mysql_query("Insert into base2.table1 (champ1, champ2) values ('valeur1', 'valeur2')", $connexion);
Même résultat que la méthode 1 et 2 : La seconde requête INSERT vise une table1 de la base2 tandis que la première vise une table1 de la base1 et ce via la même connexion

La différence est que l'ouverture de la base se passe à la transaction de la requête émise et n'engendre aucune allocation de ressource pointant vers la base ouverte.
C'est le SGBDR qui s'occupe de l'orientation des requêtes vers leurs bases spécifiées en préfixe des tables.

Effectivement, sous SQL, on peut désigner dans une seule requête des tables situées sur des bases de données différentes se trouvant sur le même SGBDR (bien sur il faut avoir les droits d'accès aux bases et aux tables ciblées)
Exemple :
Remplir une table d'une base de données à partir d'une autre table citée dans une deuxième base :

Code : Tout sélectionner

INSERT into base1.catégorie (code) SELECT distinct code_cat from base2.article;
Requête qui importe les codes de catégories dans la table catégorie de la base1 à partir d'une sélection de codes de catégories distincts à partir d'une table article d'une autre base de données base2

Posté : 30 juin 2006, 09:16
par alaingpl
Bonjour,

Je vous remercie de l'aide apportée.

J'ai tout simplement pris la méthode suivante :

Dans le même fichier, je réalise 2 connexions et 2 inserts successivement (l'une après l'autre). Ca fonctionne très bien.

Merci encore