¿Cómo se conecta a múltiples bases de datos MySQL en una sola página web?


Tengo información distribuida a través de unas pocas bases de datos y quiero poner toda la información en una página web usando PHP. Me preguntaba cómo puedo conectarme a múltiples bases de datos en una sola página web PHP.

Sé cómo conectarme a una sola base de datos usando:

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

Sin embargo, puedo usar múltiples comandos "mysql_connect" para abrir las otras bases de datos, y cómo sabría PHP de qué base de datos quiero extraer la información si tengo varias bases de datos conectadas.

 168
Author: Gilles, 2008-11-08

11 answers

Puede hacer varias llamadas a mysql_connect(), pero si los parámetros son los mismos, debe pasar true para el '$new_link' (cuarto) parámetro, de lo contrario se reutiliza la misma conexión. Por ejemplo:

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

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

Luego para consultar la base de datos 1 pase el primer identificador de enlace:

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

Y para la base de datos 2 pasar el segundo:

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

Si no pasa un identificador de enlace, se utiliza la última conexión creada (en este caso la representada por $dbh2), p. ej.:

mysql_query('select * from tablename');

Otras opciones

Si el usuario de MySQL tiene acceso a ambas bases de datos y están en el mismo host (es decir, ambas DBs son accesibles desde la misma conexión) usted podría:

  • Mantenga una conexión abierta y llame a mysql_select_db() para intercambiar según sea necesario. No estoy seguro de que esta sea una solución limpia y podría terminar consultando la base de datos incorrecta.
  • Especifique el nombre de la base de datos cuando haga referencia a las tablas dentro de sus consultas (por ejemplo, SELECT * FROM database2.tablename). Esto es probable que ser un dolor de implementar.

También lea la respuesta de troelskn porque es un mejor enfoque si puede usar PDO en lugar de las extensiones más antiguas.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-06 09:54:15

Si utiliza PHP5 (Y debería, dado que PHP4 ha sido obsoleto), debe usar PDO, ya que esto se está convirtiendo lentamente en el nuevo estándar. Un beneficio (muy) importante de PDO, es que soporta parámetros enlazados, lo que hace que el código sea mucho más seguro.

Te conectarías a través de PDO, así:

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

(Por supuesto, reemplace el nombre de la base de datos, el nombre de usuario y la contraseña anteriores)

Luego puede consultar la base de datos de la siguiente manera:

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

O, si tiene variables:

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

Si necesita varias conexiones abiertas a la vez, simplemente puede crear varias instancias 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();
}
 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-18 19:31:23

Acabo de hacer mi vida simple:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

Espero que sea útil... aclamaciones...

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-31 20:25:54

En lugar de mysql_connect use mysqli_connect.

Mysqli es proporcionar una funcionalidad para conectar múltiples bases de datos a la 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
 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-02 15:41:09

Intente debajo del 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";

Puede obtener los datos de la consulta anterior de ambas bases de datos como se muestra a continuación

$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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-21 11:19:33

A menos que realmente necesite tener más de una instancia de un objeto PDO en juego, considere lo siguiente:

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

Observe la ausencia de dbname= en los argumentos de construcción.

Cuando se conecta a MySQL a través de un terminal u otra herramienta, el nombre de la base de datos no es necesario desde el principio. Puede cambiar entre bases de datos utilizando la instrucción USE dbname a través del método PDO::exec().

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

Por supuesto, es posible que desee envolver esto en una instrucción 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-11 01:36:01

Es posible que pueda usar la sintaxis MySQLi, lo que le permitiría manejarlo mejor.

Defina las conexiones de la base de datos y, a continuación, cuando desee consultar una de las bases de datos, especifique la conexión correcta.

Ej:

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

Luego, para consultarlos en la misma página, use algo como:

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

Cambiar a MySQLi de esta manera te ayudará.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
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);

Esta es la solución más obvia que uso, pero solo recuerde, si el nombre de usuario / contraseña para ambas bases de datos es exactamente el mismo en el mismo host, esta solución siempre estará utilizando la primera conexión. Así que no se confunda que esto no está funcionando en tal caso. Lo que necesita hacer es crear 2 usuarios diferentes para las 2 bases de datos y funcionará.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 10:32:59

En realidad no necesitas select_db. Puede enviar una consulta a dos bases de datos al mismo tiempo. En primer lugar, dar una subvención a DB1 para seleccionar de DB2 por GRANT select ON DB2.* TO DB1@localhost;. Entonces, FLUSH PRIVILEGES;. Finalmente, puede hacer 'consulta de base de datos múltiple' como SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2, etc. (No olvide que necesita acceso 'root' para usar el comando 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 07:28:50

Si está utilizando mysqli y tiene dos archivos db_connection. como el primero es

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

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

El segundo es

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

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

Así que simplemente cambie el nombre del parámetro pass en mysqli como DB1 y DB2. si pasa el mismo parámetro en mysqli suppose DB1 en ambos archivos, la segunda base de datos ya no se conectará. Así que recuerde cuando se utiliza dos o más conexión pasar nombre de parámetro diferente en mysqli función

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 19:16:52

Yo había hecho esto en 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');
                    }
                }

Y este es mi código de ejemplo

 -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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 00:35:25