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

Jos*_*nie 179 php mysql

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

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

$dbh = mysql_connect($hostname, $username, $password) 
        or die("Unable to connect to MySQL");
Run Code Online (Sandbox Code Playgroud)

但是,我可以使用多个"mysql_connect"命令来打开其他数据库,如果我连接了多个数据库,那么PHP如何知道我希望从中获取信息的数据库.

Tom*_*igh 332

警告: 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);
Run Code Online (Sandbox Code Playgroud)

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

mysql_query('select * from tablename', $dbh1);
Run Code Online (Sandbox Code Playgroud)

对于数据库2传递第二个:

mysql_query('select * from tablename', $dbh2);
Run Code Online (Sandbox Code Playgroud)

如果您未传递链接标识符,则使用创建的最后一个连接(在本例中为表示的连接$dbh2),例如:

mysql_query('select * from tablename');
Run Code Online (Sandbox Code Playgroud)

其他选择

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

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

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

  • +1这个解决方案对我有用.经过两天的调试后,为什么我的自定义WordPress模板在调用第二个数据库连接后失去了对$ WP_Query对象的访问权限... (2认同)

tro*_*skn 97

如果您使用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();
}
Run Code Online (Sandbox Code Playgroud)

(当然替换上面的databasename,用户名和密码)

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

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

或者,如果您有变量:

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

如果您需要一次打开多个连接,您只需创建多个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();
}
Run Code Online (Sandbox Code Playgroud)

  • @aditya menon在我看来,正常做事的正确方法并不是对手头问题的正确答案.Asker在他的问题中没有使用PDO,而是php本机mysql函数,所以我相信最合适的答案将遵循提问者代码. (9认同)
  • 为什么这个答案不在顶部?!这是正确的方法. (5认同)
  • @adityamenon在谁的权力下?记住用户永远是对的... PDO是最好的方式,但这两种方式都是解决用户问题的正确方法.请注意正确与最佳之间的区别.是的......我很无聊所以我不得不发表声明. (2认同)

小智 9

我让我的生活变得简单:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;
Run Code Online (Sandbox Code Playgroud)

希望它有用...欢呼......


kau*_*hik 6

而不是mysql_connect使用mysqli_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
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试下面的代码:

    $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";
Run Code Online (Sandbox Code Playgroud)

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

$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);
Run Code Online (Sandbox Code Playgroud)