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

Resuelto JoshFinnie asked hace 54 años • 11 respuestas

Tengo información distribuida en algunas bases de datos y quiero colocar toda la información en una página web usando PHP. Me preguntaba cómo puedo conectarme a varias bases de datos en una sola página web PHP.

Sé cómo conectarme a una única 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?

JoshFinnie avatar Jan 01 '70 08:01 JoshFinnie
Aceptado

Advertencia: mysql_xx las funciones están obsoletas desde php 5.5 y eliminadas desde php 7.0 (ver http://php.net/manual/intro.mysql.php ), use mysqli_xxfunciones o vea la respuesta a continuación de @Troelskn


Puede realizar varias llamadas a mysql_connect(), pero si los parámetros son los mismos, deberá pasar verdadero para el ' $new_link' (cuarto) parámetro; de lo contrario, se reutilizará 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 pase 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), por ejemplo:

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, se puede acceder a ambas bases de datos desde la misma conexión), podría:

  • Mantenga una conexión abierta y llame 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 tablas dentro de sus consultas (por ejemplo, SELECT * FROM database2.tablename). Es probable que esto sea complicado de implementar.

Lea también la respuesta de troelskn porque es un mejor enfoque si puede usar PDO en lugar de las extensiones anteriores.

Tom Haigh avatar Nov 08 '2008 16:11 Tom Haigh

Si usa PHP5 (y debería hacerlo, dado que PHP4 ha quedado obsoleto), debe usar PDO , ya que poco a poco se está convirtiendo en el nuevo estándar. Un beneficio (muy) importante de PDO es que admite parámetros vinculados, 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 esta 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();
}
troelskn avatar Nov 08 '2008 18:11 troelskn