2008-10-24 11 views
18

Próbuję połączyć się z 2 bazami danych na tym samym wystąpieniu MySQL z 1 skryptu PHP.Jak połączyć się z 2 bazami danych w tym samym czasie w PHP

W tej chwili jedynym sposobem, jaki wymyśliłem, jest połączenie się z obydwoma bazami danych z innym użytkownikiem dla każdego z nich.

Używam tego w skrypcie migracji, w którym pobieram dane z oryginalnej bazy danych i wstawiam ją do nowej, więc przeglądam duże listy wyników.

Podłączenie do 1 bazy danych, a następnie próba nawiązania drugiego połączenia z tym samym użytkownikiem powoduje jedynie zmianę bieżącej bazy danych na nową.

Jakieś inne pomysły?

+0

Jeśli korzystasz z 2 procedur obsługi połączeń, na pewno chcesz się upewnić, że oba połączenia zostaną zamknięte po ich użyciu. - Arunabh Das –

+0

Ale PHP rozłączy się z bazą danych, gdy skrypt zakończy działanie http://php.net/manual/en/function.mysql-close.php –

Odpowiedz

3

Proponuję za pomocą dwóch procedur obsługi połączeń

$old = mysql_connect('old.database.com', 'user', 'pass); 
    mysql_select_db('old_db', $old); 


    $new = mysql_connect('new.database.com','user','pass); 
    mysql_select_db('new_db', $new) 

    // run select query on $old 
    // run matching insert query on $new 
+1

Działa to tylko wtedy, gdy obie bazy danych znajdują się na różnych serwerach. –

8

Lucas jest prawidłowe. Zakładam, że obie bazy danych są hostowane na tym samym hoście.

Alternatywnie można utworzyć tylko jedno połączenie db i zachowywać wymianę baz danych zgodnie z wymaganiami. Oto pseudo kod.

$db_conn = connect_db(host, user, pwd); 
mysql_select_db('existing_db', $db_conn); 
-- do selects and scrub data -- 
mysql_select_db('new_db', $db_conn); 
-- insert the required data -- 
13

Jeśli użytkownik bazy danych ma dostęp do obu baz danych i są one na tym samym serwerze, można użyć tylko jedno połączenie i określić bazę danych, którą chcesz pracować przed nazwą tabeli. Przykład:

SELECT column 
FROM database.table 

W zależności od tego, co trzeba zrobić, może być w stanie zrobić INSERT INTO i zaoszczędzić sporo czasu przetwarzania.

INSERT INTO database1.table (column) 
SELECT database2.table.column 
FROM database2.table 
+0

Próbowałem bardzo ciężko, aby dowiedzieć się, jak stara aplikacja php to robi. Teraz ma to sens. – zkent

3

Jeśli jest to opcja, użyj PDO: możesz otworzyć dowolną liczbę połączeń z bazą danych.

Dodatkowo, zakładając, że wciąż będziesz wykonywać te same zapytania, możesz użyć przygotowanych wyciągów.

0

można łatwo korzystać z 2 baz danych w tym samym czasie z następujących kodów:

<?php 
    define('HOST', "YOURHOSTNAME"); 
    define('USER', "YOURHOSTNAME"); 
    define('PASS', "YOURHOSTNAME"); 
    define('DATABASE1', "NAMEOFDATABASE1"); 
    define('DATABASE2', "NAMEOFDATABASE2"); 

    $DATABASE1 = mysqli_connect(HOST, USER, PASS, DATABASE1); 
    $DATABASE2 = mysqli_connect(HOST, USER, PASS, DATABASE2); 
    if(!$DATABASE1){ 
     die("DATABASE1 CONNECTION ERROR: ".mysqli_connect_error()); 
    } 
    if(!$DATABASE2){ 
     die("DATABASE2 CONNECTION ERROR: ".mysqli_connect_error()); 
    } 


    $sql = "SELECT * FROM TABLE"; /* You can use your own query */ 

    $DATABASE1_QUERY = mysqli_query($DATABASE1, $sql); 
    $DATABASE2_QUERY = mysqli_query($DATABASE2, $sql); 

    $DATABASE1_RESULT = mysqli_fetch_assoc($DATABASE1_QUERY); 
    $DATABASE2_RESULT = mysqli_fetch_assoc($DATABASE2_QUERY); 

    /* SHOW YOUR RESULT HERE WHICH DATABASE YOU WANT FROM */ 
    echo $DATABASE1_RESULT['id']; 
    echo $DATABASE2_RESULT['id']; 


    /*After complete your all work don't forgot about close database connections*/ 
    mysqli_close($DATABASE1); 
    mysqli_close($DATABASE2); 
     ?> 
+1

Jako ogólny przewodnik zmiennych w PHP nie należy pisać wielkimi literami, ale '$ camelCased'. Słowa pisane wielką literą są trudniejsze do odczytania. – Martin

+0

@Martin - W zależności od wyboru możesz użyć własnego stylu. Ponieważ po prostu staram się dać odpowiedź na to pytanie z kilkoma przykładami. –

-1

najpierw połączyć dwie bazy

$database1 = mysql_connect("localhost","root","password"); 
$database2 = mysql_connect("localhost","root","password"); 

Teraz wybierz bazę danych

$database1_select = mysql_select_db("db_name_1") or die("Can't Connect To Database",$database1); 
$database_select = mysql_select_db("db_name_2") or die("Can't Connect To Database",$database2); 

Teraz, jeśli chcemy aby uruchomić zapytanie, określ nazwę bazy danych na końcu, np.

$select = mysql_query("SELECT * FROM table_name",$database1); 
+0

To nie działa. Musisz przekazać wartość true jako czwarty parametr w mysql_connect, w przeciwnym razie po prostu zwróci poprzednie połączenie –

Powiązane problemy