Połączenie się z kilkoma bazami

(Weak.) #1

Hej. Przeszukałem prawie cały internet, ale niestety nie mogę nigdzie dostać wskazówek dot. łączenie się z kilkoma bazami MySQL’a poprzez PDO. Ktoś może tutaj mnie nakieruje w jaki sposób mogę to zrobić?

Jeżeli zły dział, to sorki.

(xBotekx) #2

Nie do końca rozumiem co chcesz osiągnąć. Ale skoro chcesz się łączyć z wieloma bazami to po prostu połącz się z każdą z osobna i tyle. Ale chyba nie rozumiem problemu do końca.

(Weak.) #3
if ( \IPS\Settings::i()->wkBans_enabled_SB )
{
	$pdo = new \PDO('mysql:host='.\IPS\Settings::i()->wkBans_host_SB.';dbname='.\IPS\Settings::i()->wkBans_base_SB.';port='.$port, \IPS\Settings::i()->wkBans_user_SB, \IPS\Settings::i()->wkBans_password_SB );
	$stmt = $pdo->query("SELECT * FROM sb_bans WHERE RemoveType IS NULL AND ip = '$stmtMemberIP' LIMIT 1");
}
		
if ( \IPS\Settings::i()->wkBans_enabled_AMX )
{
	$pdo = new \PDO('mysql:host='.\IPS\Settings::i()->wkBans_host_AMX.';dbname='.\IPS\Settings::i()->wkBans_base_AMX.';port='.$port, \IPS\Settings::i()->wkBans_user_AMX, \IPS\Settings::i()->wkBans_password_AMX );
	$stmt = $pdo->query("SELECT * FROM amx_bans WHERE player_ip = '$stmtMemberIP' LIMIT 1");
}

$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);PTION);

To nie ma sensu, chcę to jakoś zgrabniej napisać.

(xBotekx) #4

Ale co nie ma sensu? Kompletnie nie wiem co chcesz osiągnąć. Nie opisałeś problemu. Chcesz się połączyć z dwoma bazami to po prostu użyj

$pdo = new \PDO('mysql:host='.\IPS\Settings::i()->wkBans_host_SB.';dbname='.\IPS\Settings::i()->wkBans_base_SB.';port='.$port, \IPS\Settings::i()->wkBans_user_SB, \IPS\Settings::i()->wkBans_password_SB );
$pdo1 = new \PDO('mysql:host='.\IPS\Settings::i()->wkBans_host_AMX.';dbname='.\IPS\Settings::i()->wkBans_base_AMX.';port='.$port, \IPS\Settings::i()->wkBans_user_AMX, \IPS\Settings::i()->wkBans_password_AMX );

I po prostu odwołuj się do odpowiedniego handlera.

(Weak.) #5

Dobra, to już ogarnąłem. To teraz tak. Mam:
foreach($stmt as $value)
{
$value[‘name’] = $value[‘name’];

$data[] = $value;
}
Co teraz mogę zrobić, jeżeli w jeden bazie jest NAME, a w drugiej PLAYER_NAME, w jaki sposób mogę to połączyć do jednej zmiennej?

(darek0107) #6

Ale ja też cie nie rozumie
Masz np. 2 bazy a takiej samej strukturze rekordu czy o innej i co chcesz s tych bas uzyskać.
Może mieć otwarte 2 ole dane bierzesz w danej chwili z jednej, każdej możesz mieć inną nazwę bo pobiera z niej do jakieś innej zmiennej abo do 3 bazy
Tzn może mieć B1 nazwa B2 nazwax a tworzysz nazway raz z tej raz z tej
Chodzi ci o to że np
$stmt = $pdo->query(‘SELECT id, nazwa, FROM baza 1’)
$stmt = $pdo->query(‘SELECT id, nazwa1, FROM baza2’)
i chcesz to wbić do nazwa3?

(Weak.) #7

Skrypt działa na tej zasadzie, że pobiera aktualny adres IP osoby przeglądającej stronę, jeżeli jego IP w bazie danych 1 lub 2 znajduję się, to wyskoczy mu informacja, niestety ale bazy mają inną strukturę. Więc chciałbym aby zmienna $value[‘name’] odwoływała się do tych dwóch struktur, czyli coś typu $value[‘name’] = $value[‘name’] ? $value[‘player_name’] ;

A potem przez echo czy coś innego wywołuję $value[‘name’];

(darek0107) #8

Ja dawno php nie używałam ale to trzeba zrobić ta:
Pobierasz IP, ja bym ją zrobił jako zmienna ‘adres’
Robisz zmienną na boolean/ false
i teraz sprawdzi jedna bazę- jeżeli adres = name to zmienna true
i tak z drugą z PLAYER_NAME
jeżeli zmienna pozostanie true to jest adres a jeżeli nie to go nie ma
samymi skryptami z PDO chyba tego nie zrobisz
Nie mam teraz podręcznika z instukcjami, ja używam JAVA i C++, więc bez instukcji to by mi było trudno napisać

(hindus) #9

Po to właśnie robi się warstwy abstrakcji. Zrób sobie interfejs (np. IBaza) i dziedzicz po nim dwie klasy - jedną do obsługi jednej bazy (z metodami do pobierania id, nazwa i zwracaniem wyniku jako ustandaryzowanego obiektu), drugą po drugiej (do pobierania id, nazwa1 - i zwracaniem jako ten sam typ co w poprzednim przykładzie).
Zamiast odwoływać się bezpośrednio do zapytań bazodanowych ($pdo) odwołasz się do konkretnej implementacji interfejsu - którą stworzysz na podstawie Twojego ifa. Nic dalej nie musisz zmieniać.