Jak połączyć się z wieloma bazami danych MySQL na jednej stronie internetowej?

Mam informacje rozłożone w kilku bazach danych i chcę umieścić wszystkie informacje na jednej stronie internetowej za pomocą PHP. Zastanawiałem się, jak Mogę połączyć się z wieloma bazami danych na jednej stronie PHP.

Wiem jak połączyć się z pojedynczą bazą danych używając:

$dbh = mysql_connect($hostname, $username, $password) 
        or die("Unable to connect to MySQL");

Jednakże, czy mogę po prostu użyć wielu poleceń "mysql_connect", aby otworzyć inne bazy danych, a skąd PHP wie, z jakiej bazy danych Chcę pobrać informacje, jeśli mam wiele baz danych podłączonych.

 168
Author: Gilles, 2008-11-08

11 answers

Możesz wykonywać wiele wywołań do mysql_connect(), ale jeśli parametry są takie same, musisz przekazać true dla parametru' $new_link ' (czwarty), w przeciwnym razie to samo połączenie zostanie ponownie użyte. Na przykład:

$dbh1 = mysql_connect($hostname, $username, $password); 
$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1);
mysql_select_db('database2', $dbh2);

Następnie do zapytania bazy danych 1 podaj pierwszy identyfikator linku:

mysql_query('select * from tablename', $dbh1);

I dla bazy danych 2 Podaj drugi:

mysql_query('select * from tablename', $dbh2);

Jeśli nie podasz identyfikatora łącza, zostanie użyte Ostatnie utworzone połączenie (w tym przypadku to reprezentowane przez $dbh2) np.:

mysql_query('select * from tablename');

Inne opcje

Jeśli Użytkownik MySQL ma dostęp do obu baz danych i są one na tym samym hoście (tzn. oba DBs są dostępne z tego samego połączenia), możesz:

  • utrzymuj jedno połączenie otwarte i wywołaj mysql_select_db(), aby zamienić je w razie potrzeby. Nie jestem pewien, czy jest to czyste rozwiązanie i może skończyć się zapytaniem o niewłaściwą bazę danych.
  • Określ nazwę bazy danych, gdy odwołujesz się do tabel w zapytaniach (np. SELECT * FROM database2.tablename). Jest to prawdopodobnie być ból do wdrożenia.

Przeczytaj również odpowiedź troelskna, ponieważ jest to lepsze podejście, jeśli możesz używać PDO zamiast starszych rozszerzeń.

 316
Author: Tom Haigh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-06 09:54:15

Jeśli używasz PHP5 (i powinieneś, biorąc pod uwagę, że PHP4 został przestarzały), powinieneś użyć PDO, ponieważ powoli staje się to nowym standardem. Jedną (bardzo) ważną zaletą PDO jest to, że obsługuje parametry związane, co sprawia, że kod jest znacznie bezpieczniejszy.

Połączyłbyś się przez PDO, w ten sposób:

try {
  $db = new PDO('mysql:dbname=databasename;host=127.0.0.1', 'username', 'password');
} catch (PDOException $ex) {
  echo 'Connection failed: ' . $ex->getMessage();
}

(oczywiście zastąp nazwę bazy danych, nazwę użytkownika i hasło powyżej)

Możesz następnie odpytywać bazę danych w następujący sposób:

$result = $db->query("select * from tablename");
foreach ($result as $row) {
  echo $row['foo'] . "\n";
}

Lub, jeśli masz zmienne:

$stmt = $db->prepare("select * from tablename where id = :id");
$stmt->execute(array(':id' => 42));
$row = $stmt->fetch();

Jeśli potrzebujesz wielu połączeń jednocześnie, możesz po prostu utworzyć wiele instancji PDO:

try {
  $db1 = new PDO('mysql:dbname=databas1;host=127.0.0.1', 'username', 'password');
  $db2 = new PDO('mysql:dbname=databas2;host=127.0.0.1', 'username', 'password');
} catch (PDOException $ex) {
  echo 'Connection failed: ' . $ex->getMessage();
}
 92
Author: troelskn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-18 19:31:23

Po prostu uprościłem sobie życie:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;
Mam nadzieję, że to pomoże... zdrowie...
 8
Author: Ihsan Kusasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-31 20:25:54

Zamiast mysql_connect Użyj mysqli_connect .

Mysqli zapewnia funkcjonalność łączenia wielu baz danych naraz.

$Db1 = new mysqli($hostname,$username,$password,$db_name1); 
// this is connection 1 for DB 1

$Db2 = new mysqli($hostname,$username,$password,$db_name2); 
// this is connection 2 for DB 2
 6
Author: kaushik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-02 15:41:09

Spróbuj poniżej kodu:

    $conn = mysql_connect("hostname","username","password");
    mysql_select_db("db1",$conn);
    mysql_select_db("db2",$conn);

    $query1 = "SELECT * FROM db1.table";
    $query2 = "SELECT * FROM db2.table";

Możesz pobrać dane powyższego zapytania z obu baz danych, jak poniżej

$rs = mysql_query($query1);
while($row = mysql_fetch_assoc($rs)) {
    $data1[] = $row;
}

$rs = mysql_query($query2);
while($row = mysql_fetch_assoc($rs)) {
    $data2[] = $row;
}

print_r($data1);
print_r($data2);
 4
Author: Paks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-21 11:19:33

O ile naprawdę nie musisz mieć więcej niż jednej instancji obiektu PDO w grze, rozważ następujące kwestie:

$con = new PDO('mysql:host=localhost', $username, $password, 
      array(PDO::ATTR_PERSISTENT => true));

Zwróć uwagę na brak dbname= w argumentach konstrukcyjnych.

Gdy łączysz się z MySQL za pomocą terminala lub innego narzędzia, nazwa bazy danych nie jest potrzebna od razu. Możesz przełączać się między bazami danych za pomocą instrukcji USE dbname za pomocą metody PDO::exec().

$con->exec("USE someDatabase");
$con->exec("USE anotherDatabase");

Oczywiście możesz zawinąć to w Oświadczenie catch try.

 3
Author: Michael Ratcliffe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 01:36:01

Być może będziesz w stanie użyć składni MySQLi, co pozwoli Ci lepiej sobie z nią radzić.

Zdefiniuj połączenia z bazą danych, a następnie, gdy chcesz odpytywać jedną z baz danych, określ właściwe połączenie.

Np.:

$Db1 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 1st database connection 
$Db2 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 2nd database connection

Następnie, aby odpytywać je na tej samej stronie, użyj czegoś w stylu:

$query = $Db1->query("select * from tablename")
$query2 = $Db2->query("select * from tablename")
die("$Db1->error");

Zmiana na MySQLi w ten sposób ci pomoże.

 2
Author: user3857891,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-04 08:40:33
$dbh1 = mysql_connect($hostname, $username, $password);  
$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1); 
mysql_select_db('database2',$dbh2); 

mysql_query('select * from tablename', $dbh1);
mysql_query('select * from tablename', $dbh2);

Jest to najbardziej oczywiste rozwiązanie, którego używam, ale pamiętaj, że jeśli nazwa użytkownika / hasło dla obu baz danych jest dokładnie takie samo na tym samym Hostie, To rozwiązanie zawsze będzie używać pierwszego połączenia. Więc nie mylić, że to nie działa w takim przypadku. Musisz utworzyć 2 różnych użytkowników dla 2 baz danych i będzie działać.

 2
Author: Lazy Fellow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-03 10:32:59

Nie potrzebujesz select_db. Możesz wysłać zapytanie do dwóch baz danych w tym samym czasie. Po pierwsze, daj grant DB1, aby wybrać z DB2 przez GRANT select ON DB2.* TO DB1@localhost;. Następnie FLUSH PRIVILEGES;. W końcu możesz wykonać "zapytanie z wieloma bazami danych", takie jak SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2 itp. (Nie zapomnij, że potrzebujesz dostępu 'root', aby użyć polecenia grant)

 2
Author: Nagibaba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 07:28:50

Jeśli używasz mysqli i masz dwa pliki db_connection. jak pierwszy to

define('HOST','localhost');
define('USER','user');
define('PASS','passs');
define('**DB1**','database_name1');

$connMitra = new mysqli(HOST, USER, PASS, **DB1**);

Drugi to

    define('HOST','localhost');
    define('USER','user');
    define('PASS','passs');
    define(**'DB2**','database_name1');

    $connMitra = new mysqli(HOST, USER, PASS, **DB2**);

Więc po prostu zmień nazwę parametru pass w mysqli jak DB1 i DB2. jeśli podasz ten sam parametr w mysqli Załóżmy, że DB1 w obu plikach to druga baza danych już się nie połączy. Więc pamiętaj, gdy używasz dwóch lub więcej połączeń przekazać inną nazwę parametru w mysqli function

 1
Author: lotus weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 19:16:52

I had done this in laravel

 ini_set('max_execution_time', 3600);
                $old_users = DB::connection('mysql2')->table('user_master')->get();
                foreach ($old_users as $old_user) {
                    if ($old_user->usr_phone != "0") {
                        $password = base64_decode($old_user->usr_pwd);
                        $password = Hash::make($password);
                        if ($old_user->device_type == "1") {
                            $device_type = "ios";
                        } else if ($old_user->device_type == "2") {
                            $device_type = "android";
                        } else {
                            $device_type = "web";
                        }
                        $user = new User;
                        $user->name = $old_user->usr_name;
                        $user->email = $old_user->usr_email;
                        $user->points_exp_date = "2018-08-02";                        try {
                            $user->save();
                        } catch (\Exception $e) {
                            echo ("<script>console.log('duplicate entry in user: " . $user->name . "');</script>");
                        }
                        Log::info('user saved');
                    }
                }

A to jest mój przykładowy kod

 -1
Author: Balaji Rajendran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 00:35:25