2008-11-08 17 views
167

Tengo información repartida en 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 de PHP.¿Cómo se conecta a múltiples bases de datos MySQL en una sola página web?

sé cómo conectarse a una sola base de datos usando:

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

Sin embargo, puede que sólo tiene que utilizar múltiples "mysql_connect" comandos para abrir las otras bases de datos, y cómo habría PHP sé qué base de datos que desea que la información extraído si tengo varias bases de datos conectadas.

Respuesta

312

Puede realizar varias llamadas a mysql_connect(), pero si los parámetros son los mismos, debe pasar el parámetro verdadero '$new_link' (cuarto), 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); 

continuación para consultar la base de datos 1 pasar el primer identificador de enlace:

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

y de la base de datos 2 Pase el segundo:

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

Si usted no pasa un enlace identificador luego 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 MySQL tiene acceso a ambas bases de datos y que están en el mismo host (es decir, tanto DBs son accesibles desde la misma conexión) usted podría:

  • Mantener una conexión abierta y llamar mysql_select_db() para intercambiar entre si es 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 en sus consultas (por ejemplo, SELECT * FROM database2.tablename). Es probable que sea un dolor implementarlo.

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

+37

que "verdadero" solo me ahorra horas de trabajo – PurplePilot

+2

+1 Esta solución funcionó para mí. Después de dos días de depurar por qué mis plantillas personalizadas de WordPress estaban perdiendo acceso al objeto $ WP_Query después de una llamada a la segunda conexión de la base de datos ... –

+0

es posible configurar una de ellas para que sea la predeterminada, y solo tiene que agregar ' $ dbh2' para el segundo solo cuando sea necesario? Tener que cambiar todas las consultas para que funcione este enfoque probablemente llevaría días encontrarlas todas ... – ThomasK

3

Es posible que también desee echar un vistazo a una de las muchas herramientas de abstracción de bases de datos que existen. Sin embargo, generalmente harán lo mismo que Tom describió para mantener abiertas varias conexiones al mismo tiempo.

87

Si usa PHP5 (Y debería, dado que PHP4 ha quedado obsoleto), debe usar PDO, ya que esto se está convirtiendo lentamente 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.

Se podría conectarse a través de DOP, como esto:

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

(Por supuesto sustituir nombrebasedatos, nombre de usuario y contraseña arriba)

Luego, puede consultar la base 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 múltiples conexiones abiertas a la vez, sólo tiene que 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(); 
} 
+5

¿Por qué esta respuesta no está en la parte superior? Esta es la forma correcta de hacerlo. –

+8

@aditya menon en mi opinión, la forma correcta de hacer algo a menudo no es la respuesta correcta a la pregunta en cuestión. el Asker no estaba utilizando PDO en su pregunta, pero php funciones nativas mysql, por lo que creo que la respuesta más adecuada seguiría el código asker. – Jonathan

+2

@adityamenon bajo cuya autoridad? Recuerde que el usuario siempre tiene la razón ... PDO es la mejor manera, pero ambas formas son la forma correcta de resolver el problema de los usuarios. Tenga en cuenta la diferencia entre la derecha y la mejor. Sí ... estoy aburrido, así que tuve que hacer una declaración. – JustinKaz

3

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

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

Aviso 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 de inmediato. Puede alternar entre bases de datos utilizando la declaració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 incluir esto en una declaración catch try.

+0

Para aquellos que intentarían el enfoque anterior, échenle un vistazo antes de eso http://stackoverflow.com/ a/14933070/1623579 – TheFrost

+0

¡Me encanta esta solución! Puedo prescindir de la configuración persistente, pero la instanciación de PDO es una gran solución. Obtiene una conexión predeterminada sin estar conectado a una base de datos específica. –

5

Try a continuación 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"; 

se puede recuperar los datos de consulta anterior tanto de la base de datos de la siguiente manera

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

Ésta es la solución más obvia que yo uso, pero sólo recuerdo, si el nombre de usuario/contraseña para ambas bases de datos es exactamente el mismo en el mismo host, esta solución siempre utilizará la primera conexión. Así que no te confundas porque esto no está funcionando en tal caso. Lo que debe hacer es crear 2 usuarios diferentes para las 2 bases de datos y funcionará.

8

acabo de hacer mi vida simple:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table; 

espero que sea útil ... salud ...

+1

Esta es la solución más fácil si no tiene tablas con el mismo nombre en ambas bases de datos. Lo haces una vez y ya no tienes que preocuparte por las múltiples bases de datos. –

1

Usted puede ser capaz de utilizar la sintaxis MySQLi, lo que permitirá manejar mejor .

Defina las conexiones de la base de datos, luego cuando quiera 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 

continuación para consultar ellas en la misma página, usar algo como:

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

Cambiar a MySQLi de esta manera le ayudará.

+0

Mejore su sintaxis (esto no es un sms) y formatee su código con las herramientas (Ctrl + K, por ejemplo). – fedorqui

6

En lugar de mysql_connect use mysqli_connect.

mysqli proporciona una funcionalidad para conectar varias 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 
+1

$ hostname = 'Your DB_Hostname'; $ username = 'Su DB_Username'; $ password = 'Su contraseña DB'; $ db_name1 = 'Su nombre DB 1'; $ db_name2 = 'Su nombre DB 2'; – kaushik

1

Si está utilizando mysqli y tienen dos archivos db_connection. como primera es

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

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

segundo es

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

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

SO acaba de cambiar el nombre de pase parámetro en mysqli como DB1 y DB2. si pasa el mismo parámetro en mysqli suponga DB1 en ambos archivos y luego la segunda base de datos no se conectará más. Así que recuerde que cuando usa dos o más conexiones, pase un nombre de parámetro diferente en la función mysqli

1

No necesita realmente select_db. Puede enviar una consulta a dos bases de datos al mismo tiempo. Primero, otorgue una concesión al DB1 para seleccionar de DB2 por GRANT select ON DB2.* TO [email protected];. Luego, FLUSH PRIVILEGES;. Finalmente, puede hacer 'consultas de bases de datos múltiples' como SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2 etc. (No olvide que necesita acceso 'root' para usar el comando de concesión)

Cuestiones relacionadas