PHP, MYSQL – Come connettersi a due database contemporaneamente

Se vi capita di gestire un cliente che dispone di due siti internet, è probabile che prima o poi vi ritroverete nella condizione di dover connettervi contemporaneamente a due database.
Il motivo può essere vario: promuovere i prodotti di un dominio sull’altro dominio tramite una procedura automatica; recuperare informazioni o riferimenti dell’altro dominio; ecc.

La connessione tra due database non è sempre immediata.
Prima di tutto dobbiamo distinguere due situazioni:
1) i due database si trovano sullo stesso server: in questo caso host, user e password di connessione potrebbero coincidere
2) i due database si trovano su server diversi: è necessario eseguire per forza due connessioni diverse

Qua sotto vi mostrerò due sistemi per connettervi a database multipli.
In entrambe le situazioni:
– i due database avranno il nome (poco fantasioso ma immediato) di primo_database e secondo_database
– in entrambi i database è presente una tabella chiamata prodotti, al cui interno ha un campo chiamato id (che rappresenta il campo autoincrementale dei record) e un campo chiamato nome (varchar di lunghezza a piacere)
– poniamo per semplicità che in entrambe le tabelle “prodotti” ci siano dei record con id=2 . L’unica differenza sta nel campo nome, che avrà i seguenti valori:
– tabella di “primo_database”: nome=”libro”
– tabella di “secondo_database”: nome=”film”

In questo modo, quando stamperemo a video il campo “nome” del record con id=2 avremo la possibilità di capire se proviene dal primo database o dal secondo.

Connessione a due database sullo stesso server

Se i due database si trovano sullo stesso server (probabilmente un server dedicato), in gran parte dei casi la connessione a entrambi avverrà con lo stesso host, user e password.
Per distingue quale database coinvolge una delle nostre query, ci basta far precedere il nome della tabella prodotti dal nome del database.
Quindi, se la tabella di ricerca della select sarà “primo_database.prodotti” significa che coinvolgerà la tabella “prodotti” di “primo_database”.
Viceversa, se la tabella di ricerca della select sarà “secondo_database.prodotti” significa che coinvolgerà la tabella “prodotti” di “secondo_database”.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* Connessione a due database sullo stesso server 
*/
 
$db_host = "localhost";
$db_user = "root";
$db_password = "password";
 
$db_name1 = "primo_database";
$db_name2 = "secondo_database";
 
$db1 = mysql_connect($db_host, $db_user, $db_password);
 
$db2 = mysql_connect($db_host, $db_user, $db_password);
 
 
define('DB1', $db1);
define('DB2', $db2);
define('DBNAME1', $db_name1);
define('DBNAME2', $db_name2);
 
 
 
$q = "SELECT * FROM ".DBNAME1.".prodotti WHERE id=2";
$result = mysql_query($q, DB1);
$row = mysql_fetch_array($result);
echo $row['nome']."<br /><br />"; //stamperà "libro"
 
$q = "SELECT * FROM ".DBNAME2.".prodotti WHERE id=2";
$result = mysql_query($q, DB2);
$row = mysql_fetch_array($result);
echo $row['nome']; //stamperà "film"

Connessione a due database (su stesso server o su server diversi)

Un po’ più macchinoso è il sistema da usare qualora i database risiedano su due server diversi.
In questo caso host, user e password saranno diversi e le connessioni saranno completamente distinte.


Il modo migliore per gestire la situazione è di creare una funzione ad hoc, che ho chiamato dbconn, in cui come argomento passiamo semplice il valore “1” o “2” per far capire che vogliamo connetterci rispettivamente a “primo_database” e a “secondo_database”.
Per connettersi al secondo database, quindi, dovremo semplicemente richiamare la funzione:

dbconn(2);

Una volta effettuata la connessione in questo modo, ci basterà eseguire normalmente la query sulla tabella “prodotti”.

L’aspetto macchinoso? Un simile sistema tiene aperta una sola connessione alla volta, per cui a ogni cambio di database dovremo richiamare la funzione “dbconn”.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Connessione a due database
* utilizzabile sia per database nello stesso server che in server diversi
*/
function dbconn($type){
 
	switch($type){
 
		case "1":
			$db1 = mysql_connect("host1", "root", "password1");
			mysql_select_db("primo_database", $db1);
			break;
 
		case "2":
			$db2 = mysql_connect("host2", "root", "password2");
			mysql_select_db("second_database", $db2);
			break;
 
	}
 
}
 
 
dbconn(1);
$q = "SELECT * FROM prodotti WHERE id=2";
$result = mysql_query($q);
$row = mysql_fetch_array($result);
echo $row['nome']."<br /><br />"; //stamperà "libro"
 
dbconn(2);
$q = "SELECT * FROM prodotti WHERE id=2";
$result = mysql_query($q);
$row = mysql_fetch_array($result);
echo $row['nome']; //stamperà "film"
Etichette:,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *