Como você se conecta a vários bancos de dados MySQL em uma única página?

Tenho informações espalhadas por alguns bancos de dados e quero colocar todas as informações em uma página usando o PHP. Eu estava pensando como eu posso me conectar a vários bancos de dados em uma única página da web do PHP.

Eu sei como me conectar a um único database usando:

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

No entanto, posso usar vários comandos “mysql_connect” para abrir os outros bancos de dados, e como o PHP saberia o database que eu quero que as informações sejam retiradas se eu tiver vários bancos de dados conectados.

   

Você pode fazer várias chamadas para mysql_connect() , mas se os parâmetros forem iguais, você precisa passar verdadeiro para o parâmetro ‘ $new_link ‘ (quarto), caso contrário, a mesma conexão será reutilizada. Por exemplo:

 $dbh1 = mysql_connect($hostname, $username, $password); $dbh2 = mysql_connect($hostname, $username, $password, true); mysql_select_db('database1', $dbh1); mysql_select_db('database2', $dbh2); 

Em seguida, para consultar database 1 passe o primeiro identificador de link:

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

e para o database 2 passar o segundo:

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

Se você não passar um identificador de link, a última conexão criada será usada (neste caso, a representada por $dbh2 ), por exemplo:

 mysql_query('select * from tablename'); 

Outras opções

Se o usuário MySQL tiver access a ambos os bancos de dados e eles estiverem no mesmo host (ou seja, ambos os DBs são acessíveis a partir da mesma conexão) você poderia:

  • Mantenha uma conexão aberta e chame mysql_select_db() para trocar entre, conforme necessário. Não tenho certeza se esta é uma solução limpa e você pode acabar consultando o database errado.
  • Especifique o nome do database quando você faz referência a tabelas dentro de suas consultas (ex .: SELECT * FROM database2.tablename ). Isto é provável que seja uma dor para implementar.

Leia também a resposta da troelskn porque essa é uma abordagem melhor se você puder usar o DOP em vez das extensões mais antigas.

Se você usar o PHP5 (e você deve, dado que o PHP4 tenha sido reprovado), você deve usar a DOP , já que isso está se tornando lentamente o novo padrão. Um (muito) benefício importante da DOP, é que ele suporta parâmetros vinculados, o que torna um código muito mais seguro.

Você se conectaria através da PDO, assim:

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

(Naturalmente substitua databasename, nome de usuário e senha acima)

Você pode consultar o database como este:

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

Ou, se você possui variables:

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

Se você precisa de várias conexões abertas de uma só vez, você pode simplesmente criar várias instâncias de 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(); } 

Eu simplesmente fiz minha vida simples:

 CREATE VIEW another_table AS SELECT * FROM another_database.another_table; 

espero que seja útil … cheers …

Em vez de mysql_connect use mysqli_connect .

mysqli fornece uma funcionalidade para conectar múltiplos bancos de dados por vez.

 $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 

Tente abaixo do código:

  $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"; 

Você pode buscar dados da consulta acima do database conforme abaixo

 $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); 

Você também pode querer dar uma olhada em uma das muitas ferramentas de abstração de database ao redor. No entanto, eles geralmente fazem o mesmo que Tom descreveu para manter várias conexões abertas ao mesmo tempo.

A menos que você precise ter mais de uma instância de um object PDO em jogo, considere o seguinte:

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

Observe a ausência de dbname= nos argumentos de construção.

Quando você se conecta ao MySQL através de um terminal ou outra ferramenta, o nome do database não é necessário fora do morcego. Você pode alternar entre bancos de dados usando a instrução USE dbname através do método PDO::exec() .

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

Claro que você pode querer envolver isso em uma declaração try try.

 $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); 

Esta é a solução mais óbvia que eu uso, mas apenas me lembro, se o nome de usuário / senha para o database for exatamente o mesmo no mesmo host, esta solução sempre estará usando a primeira conexão. Portanto, não confunda que isso não está funcionando nesse caso. O que você precisa fazer é criar 2 usuários diferentes para os 2 bancos de dados e ele funcionará.

Você pode usar a syntax do MySQLi, o que lhe permitirá lidar com isso melhor.

Defina as conexões do database, em seguida, sempre que desejar consultar um database, especifique a conexão correta.

Por exemplo:

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

Em seguida, para consultá-los na mesma página, use algo como:

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

Mudando para MySQLi dessa forma irá ajudá-lo.

se você estiver usando mysqli e tiver dois arquivos db_connection. como primeiro é

 define('HOST','localhost'); define('USER','user'); define('PASS','passs'); define('**DB1**','database_name1'); $connMitra = new mysqli(HOST, USER, PASS, **DB1**); 

o segundo é

  define('HOST','localhost'); define('USER','user'); define('PASS','passs'); define(**'DB2**','database_name1'); $connMitra = new mysqli(HOST, USER, PASS, **DB2**); 

Então, basta alterar o nome do parâmetro no mysqli como DB1 e DB2. se você passar o mesmo parâmetro no mysqli suponha DB1 em ambos os arquivos, então o segundo database não se conectará mais. Então, lembre-se quando você usa dois ou mais nomes de parâmetro de passagem de conexão diferente na function mysqli

Na verdade, você não precisa select_db . Você pode enviar uma consulta para dois bancos de dados ao mesmo tempo. Primeiro, dê uma concessão ao DB1 para selecionar do DB2 por GRANT select ON DB2.* TO DB1@localhost; . Então, FLUSH PRIVILEGES; . Finalmente, você pode fazer ‘consulta de database múltiplo’ como SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2 etc. (Não se esqueça de que você precisa de access ‘root’ para usar o comando de concessão)