Liaison entre 2 bd

Eléphant du PHP | 271 Messages

29 juin 2006, 00:41

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.
Patience et obstination sont des qualités !

Mammouth du PHP | 19672 Messages

29 juin 2006, 07:24

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

29 juin 2006, 11:03

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
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 271 Messages

30 juin 2006, 09:16

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
Patience et obstination sont des qualités !