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