PHP MySQL Jak połączyć się z dwoma (kilkoma) różnymi bazami danych MySQL?

W artykule Jak połączyć się z serwerem bazy danych MySQL zaprezentowałem podłączenie się do bazy MySQL, jednej bazy!
Gdybyście za pomocą tamtych skryptów próbowali połączyć się z kilkoma bazami MySQL, niestety nie uda się!
Dlaczego?
Otóż konfiguracja PHP domyślnie pozwala na podłączenie się tylko do jednej bazy MySQL. Nie jest to żadne ograniczenie! Jest to po prostu ustawienie domyślne.
Więc jak podłączyć się do dwóch albo nawet kilku baz MySQL w tym samym czasie?

PROBLEM:
W jaki sposób połączyć się z różnymi bazami danych MySQL (w tym samym czasie) i wysyłać do nich pytania?

OPIS PROBLEMU:
Chciałbyś aby twój skrypt PHP, połączył się jednocześnie z różnymi bazami danych MySQL i kierował do nich zapytania.
Dodatkowo chcesz sterować – określać, które zapytania mają być wykonywane przez wybrane połączenie – wybraną bazę danych.

ROZWIĄZANIE:
Jak już wyżej było wspomniane, domyślna konfiguracja PHP umożliwia jednoczesne podłączenie do jednej bazy danych MySQL.
Za tę konfigurację odpowiada 4 argument funkcji mysql_connect(), jest to argument opcjonalny – dlatego w większości przypadków nieznany i nieużywany ;-), określany jako $new_link, domyślnie ustawiony na false.

Z dokumentacji:
mysql_connect (string $server, string $username, string $password, [bool $new_link = false], [int $client_flags = 0]);
$new_link – $nowe_polaczenie;
Przy drugim wywołaniu funkcji mysql_connect() z tymi samymi argumentami, nie zostanie ustawione nowe połączenie, ale zamiast tego, zostanie zwrócony identyfikator już otwartego połączenia. Parametr $new_link zmienia to zachowanie i sprawia, że funkcja mysql_connect() zawsze otwiera nowe połączenie, nawet jeśli mysql_connect() zostało już wcześniej wywołane z tymi samymi parametrami. W trybie SQL safe mode, parametr ten jest ignorowany.

PO CO TO KOMU, ZALECENIA I OSTRZERZENIA:
Jednoczesne połączenie do kilku baz MySQL przynosi wiele korzyści. Dzięki temu, w tym samym czasie, możesz operować na kilu bazach, uruchamiając tylko jeden skrypt PHP. Możesz przenosić dane z jednej bazy do drugiej, porównywać, robić kopię bezpieczeństwa wybranych tabel, itp. Możesz operować na bazach znajdujących się na tym samym serwerze – hoście, ale również i znajdujących się na różnych serwerach.
Jednoczesne połączenie do kilu baz w jednym skrypcie, a co za tym idzie, posiadanie kilku różnych identyfikatorów połączenia, przysparza wiele problemów. Musisz pamiętać który link połączenia, łączy Cie z którą bazą danych. Konkretne zapytanie SQL musisz skierować do prawidłowej bazy. Oczywiście możesz mieć z tym problemy, głównie wtedy gdy dotychczas nie podawałeś identyfikatora połączenia. Było to możliwe, gdyż wiele funkcji operujących na bazie danych nie wymaga określenia go (używa domyślnego identyfikatora).

PRZYKŁAD 1:
Prosty kod PHP tworzący bezpośrednio połączenie z dwoma bazami danych MySQL

<?PHP
// Tworzymy pierwsze połączenie z hostem o nazwie locahost1.
$con1 = @mysql_connect(‘locahost1′, ‘user’, ‘pass’, false);
if(!$con1) {
        echo “ERROR MySQL: Connect to Server locahost 1\n”;
        exit;
}
// Tworzymy drugie połączenie z hostem o nazwie locahost2.
$con2 = @mysql_connect(‘locahost2′, ‘user’, ‘pass’, true);
if(!$con2) {
        echo “ERROR MySQL: Connect to Server locahost 2\n”;
        exit;
}
// Wyświetlamy identyfikator połączenia $con1 i $con2
// Różne identyfikatory świadczą o dwóch rożnych połączeniach!
// Takie same identyfikatory, to tak naprawdę jedno połączenie!
echo $con1.”\n”;
echo $con2.”\n”;
// Podłączamy się do wybranej bazy danych MySQL – używając połączenia $con1.
@mysql_select_db(‘baza_mysql_1′, $con1);
// Podłączamy się do wybranej bazy danych MySQL – używając połączenia $con2.
@mysql_select_db(‘baza_mysql_2′, $con2);
//[...]
// Zamykamy połączenie z bazą danych MySQL na hoście locahost1 i locahost2 ($con1, $con2)
mysql_close($con1);
mysql_close($con2);
?>

WYJAŚNIENIA:
1. Wyświetlenie identyfikatora połączenia pomoże nam stwierdzić, czy rzeczywiście jesteśmy połączeni z różnymi bazami / hostami
2. Proszę zwrócić szczególną uwagę na czwarty argument wywołania funkcji mysql_connect()
- Dla pierwszego połączenia: mysql_connect(‘locahost1′, ‘user’, ‘pass’, false);
- Dla drugiego i kolejnych połączeń: mysql_connect(‘locahost2′, ‘user’, ‘pass’, true);
Użycie “true” w drugim wywołaniu funkcji powoduje utworzenie nowego połączenia!

PRZYKŁAD 2:
Poniżej rozbudowana funkcja w PHP którą można wykorzystać do połączenia z bazą lub bazami danych MySQL.
Funkcja:
- umożliwia nawiązanie połączenie z kilkoma hostami danych MySQL,
- podłącza nas do wybranej bazy danych MySQL – dla określonego hosta,
- ustawia wybrane kodowanie w tym przypadku UTF-8 (połączenia, klienta, zwracanych wyników, itp.),
- zwraca odpowiedni komunikat w przypadku niepowodzenia (połączenia, ustawienia bazy, ustawienia odpowiedniego kodowania),
- zwraca uchwyt połączenia,
- idealnie nadaje się do developerki, zawsze wiemy gdy coś poszło nie tak!

<?PHP
function connect_to_db($host, $user, $pass, $db, $link) {
        if(!($con = @mysql_connect($host, $user, $pass, $link))) {
                echo “ERROR MySQL: Connect to Server\n”;
                exit;
        }
        if(!mysql_select_db($db, $con)) {
                echo “ERROR MySQL: Connect to DataBase\n”;
                exit;
        }
        if(!mysql_query(“SET NAMES ‘utf8′”, $con)) {
                echo “ERROR MySQL: SET NAMES ‘utf8′\n”;
                exit;
        }
        if(!mysql_query(“SET CHARACTER SET ‘utf8′”, $con)) {
                echo “ERROR MySQL: SET CHARACTER SET ‘utf8′\n”;
                exit;
        }
        if(!mysql_query(“SET character_set_client = ‘utf8′”, $con)) {
                echo “ERROR MySQL: SET character_set_client = ‘utf8′\n”;
                exit;
        }
        if(!mysql_query(“SET character_set_results = ‘utf8′”, $con)) {
                echo “ERROR MySQL: SET character_set_results = ‘utf8′\n”;
                exit;
        }
        if(!mysql_query(“SET character_set_connection = ‘utf8′”, $con)) {
                echo “ERROR MySQL: SET character_set_connection = ‘utf8′\n”;
                exit;
        }
        mb_internal_encoding(“UTF-8″);
        mb_regex_encoding(“UTF-8″);
        return $con;
}
// Tworzymy pierwsze połączenie z bazą danych MySQL na hoście locahost1
$con1 = connect_to_db(‘locahost1′, ‘user’, ‘pass’, ‘db’, false);
// Tworzymy drugie połączenie z bazą danych MySQL na hoście locahost2
$con2 = connect_to_db(‘locahost2′, ‘user’, ‘pass’, ‘db’, true);
// Tworzymy trzecie połączenie z bazą danych MySQL na hoście locahost3
$con3 = connect_to_db(‘locahost3′, ‘user’, ‘pass’, ‘db’, true);
// [...]
// zamykamy połączenia z bazami danych – opcjonalnie
mysql_close($con1);
mysql_close($con2);
mysql_close($con3);
?>

This entry was posted in MySQL, PHP and tagged , , , , , , , , , , , , , , , . Bookmark the permalink.

Leave a Reply