如何在一个网页上连接多个 MySQL 数据库?

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

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

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

但是,我可以只使用多个“ mysql _ connect”命令来连接到其他数据库吗? 如果我连接了多个数据库,PHP 如何知道我想从哪个数据库中提取信息。

360062 次浏览

警告: mysql_xx函数从 php 5.5开始就被弃用,从 php 7.0开始就被删除了(请参阅 http://php.net/manual/intro.mysql.php) ,请使用 mysqli_xx函数,或者查看下面@Troelskn 给出的答案


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

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

如果您没有传递链接标识符,那么将使用最后创建的连接(在本例中是由 $dbh2表示的连接) ,例如:

mysql_query('select * from tablename');

其他选择

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

  • 保持一个连接处于打开状态,并根据需要调用 mysql_select_db()进行交换。我不确定这是一个干净的解决方案,您可能最终查询错误的数据库。
  • 在查询中引用表时指定数据库名称(例如 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();

如果需要同时打开多个连接,只需创建多个 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();
}

除非您确实需要一个以上的 PDO 对象实例,否则请考虑以下事项:

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

注意构造参数中没有 dbname=

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

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

当然,您可能希望用 catch try 语句包装它。

尝试以下代码:

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

这是我使用的最明显的解决方案,但是请记住,如果两个数据库的用户名/密码在同一个主机上完全相同,那么这个解决方案将始终使用第一个连接。所以在这种情况下,不要感到困惑。您需要做的是,为2个数据库创建2个不同的用户,这样就可以工作了。

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

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

希望对你有帮助,干杯。

您可以使用 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 _ connect代替 Mysql _ connect

Mysqli 提供了一次连接多个数据库的功能。

$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

如果您正在使用 mysqli 并且有两个 db _ connect 文件. like 第一个是

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

所以只需在 mysqli 中更改参数传递的名称,如 DB1和 DB2。 如果在 mysqli 中传递相同的参数,假设两个文件中都有 DB1,那么第二个数据库将不再连接。因此,请记住当您使用两个或多个连接在 mysqli 函数中传递不同的参数名时

你不需要 select_db。可以同时向两个数据库发送查询。首先,通过 GRANT select ON DB2.* TO DB1@localhost;授予 DB1DB2中进行选择的权限。然后,FLUSH PRIVILEGES;。最后,您可以执行“多数据库查询”,如 SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2等(不要忘记,您需要“根”访问使用授权命令)

<?php
// Sapan Mohanty
// Skype:sapan.mohannty
//***********************************
$oldData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
echo mysql_error();
$NewData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
echo mysql_error();
mysql_select_db('OLDDBNAME', $oldData );
mysql_select_db('NEWDBNAME', $NewData );
$getAllTablesName    = "SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'";
$getAllTablesNameExe = mysql_query($getAllTablesName);
//echo mysql_error();
while ($dataTableName = mysql_fetch_object($getAllTablesNameExe)) {


$oldDataCount       = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $oldData);
$oldDataCountResult = mysql_fetch_object($oldDataCount);




$newDataCount       = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $NewData);
$newDataCountResult = mysql_fetch_object($newDataCount);


if ( $oldDataCountResult->noOfRecord != $newDataCountResult->noOfRecord ) {
echo "<br/><b>" . $dataTableName->table_name . "</b>";
echo " | Old: " . $oldDataCountResult->noOfRecord;
echo " | New: " . $newDataCountResult->noOfRecord;


if ($oldDataCountResult->noOfRecord < $newDataCountResult->noOfRecord) {
echo " | <font color='green'>*</font>";


} else {
echo " | <font color='red'>*</font>";
}


echo "<br/>----------------------------------------";


}


}
?>