¿Cómo se conecta a múltiples bases de datos MySQL en una sola página web?
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?
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_xx
funciones 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.
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();
}