你如何连接到一个网页上的多个MySQL数据库?

我有信息分布在几个数据库,并希望把所有的信息,使用PHP的一个网页。 我想知道如何连接到单个PHP网页上的多个数据库。

我知道如何使用以下方式连接到单个数据库:

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

但是,我可以使用多个“mysql_connect”命令来打开其他数据库,如果我连接了多个数据库,PHP将如何知道从哪个数据库中提取信息。

您可以对mysql_connect()进行多次调用,但是如果参数相同,则需要为“ $new_link ”(第四个)parameter passingtrue,否则将重用相同的连接。 例如:

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

然后查询数据库1传递第一个链接标识符:

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

并为数据库2通过第二个:

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

如果你没有传递一个链接标识符,那么使用上一个创build的连接(在这个例子中是由$dbh2表示的$dbh2 ),例如:

 mysql_query('select * from tablename'); 

其他选项

如果MySQL用户可以访问这两个数据库,并且他们在同一个主机上(即两个数据库都可以从同一个连接访问),那么您可以:

  • 保持一个连接打开,并根据需要调用mysql_select_db()进行交换。 我不确定这是一个干净的解决scheme,你最终可能会查询错误的数据库。
  • 在查询中引用表时指定数据库名称(例如, SELECT * FROM database2.tablename )。 这可能是一个执行的痛苦。

另外请阅读troelskn的答案,因为如果你能够使用PDO而不是旧的扩展,这是一个更好的方法。

如果你使用PHP5(你应该,鉴于PHP4已被弃用),你应该使用PDO ,因为这正在慢慢成为新的标准。 PDO的一个(非常)重要的好处是它支持绑定参数,这使得代码更加安全。

您将通过PDO连接,如下所示:

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

(当然更换上面的数据库名,用户名和密码)

然后你可以像这样查询数据库:

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

或者,如果你有变数:

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

如果您需要一次打开多个连接,则可以简单地创build多个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(); } 

我只是让我的生活变得简单:

 CREATE VIEW another_table AS SELECT * FROM another_database.another_table; 

希望它有帮助…干杯…

而不是mysql_connect使用mysqli_connect 。

mysqli提供了一次连接多个数据库的function。

 $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 

尝试下面的代码:

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

您可以从两个数据库中获取上述查询的数据,如下所示

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

你可能也想看看周围的许多数据库抽象工具之一。 然而,他们通常会做同样的事情,汤姆描述,以保持同时打开多个连接。

除非你确实需要在一个PDO对象中有多个实例,否则请考虑以下几点:

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

注意在构造参数中没有dbname=

当您通过terminal或其他工具连接到MySQL时,数据库名称不再需要。 您可以通过使用USE dbname语句通过PDO::exec()方法在数据库之间切换。

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

当然你可能想把这个包装在一个catch语句中。

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

这是我使用的最明显的解决scheme,但是请记住,如果两个数据库的用户名/密码在同一主机中完全相同,则此解决scheme将始终使用第一个连接。 所以不要混淆,这是不是在这种情况下工作。 你需要做的是,为2个数据库创build2个不同的用户,它将工作。

你可以使用MySQLi语法,这样可以更好地处理它。

定义数据库连接,然后每当你想查询一个数据库时,指定正确的连接。

例如:

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

然后在同一页面上查询它们,使用如下所示:

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

以这种方式更改为MySQLi将帮助您。

如果你使用mysqli并有两个db_connection文件。 像第一个是

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

第二个是

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

所以只需要像DB1和DB2那样改变mysqli中parameter passing的名字。 如果你在mysqli中传入同样的参数,假设DB1在这两个文件中,那么第二个数据库将不再连接。 所以记得当你使用两个或更多的连接时,在mysqli函数中传递不同的参数名称

你实际上不需要select_db 。 您可以同时向两个数据库发送查询。 首先,授予DB1通过GRANT select ON DB2.* TO DB1@localhost;DB2 GRANT select ON DB2.* TO DB1@localhost; 。 然后, FLUSH PRIVILEGES; 。 最后,您可以像SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2等那样执行“多数据库查询”(不要忘记您需要“root”访问权限来使用grant命令)