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

Php 如何连接到单个网页上的多个MySQL数据库?,php,mysql,Php,Mysql,我的信息分布在几个数据库中,希望使用PHP将所有信息放到一个网页上。我想知道如何在一个PHP网页上连接到多个数据库 我知道如何使用以下方式连接到单个数据库: $dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL"); 但是,我可以只使用多个mysql_connect命令打开其他数据库吗?如果我连接了多个数据库,PHP如何知道我想要从哪个数据库中提取信息。

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

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

$dbh = mysql_connect($hostname, $username, $password) 
        or die("Unable to connect to MySQL");
但是,我可以只使用多个mysql_connect命令打开其他数据库吗?如果我连接了多个数据库,PHP如何知道我想要从哪个数据库中提取信息。

警告:mysql_xx函数自PHP5.5起就被弃用,自PHP7.0见,使用mysqli_xx函数或从@Troelskn查看下面的答案

您可以多次调用mysql\u connect,但是如果参数相同,则需要为“$new\u 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用户可以访问两个数据库,并且它们位于同一主机上,即两个数据库都可以从同一连接访问,则您可以:

保持一个连接打开,并根据需要调用mysql\u select\u db进行交换。我不确定这是一个干净的解决方案,您可能最终查询错误的数据库。 在查询中引用表时指定数据库名称,例如从database2.tablename中选择*。这可能是一个难以实施的难题。
另外,请阅读Troleskn的回答,因为如果您能够使用PDO而不是旧的扩展,那么这是一种更好的方法。

如果您使用PHP5,并且您应该使用PHP4,鉴于PHP4已经被弃用,您应该使用,因为这正在慢慢成为新的标准。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";
}
当然,替换上面的数据库名、用户名和密码

然后可以按如下方式查询数据库:

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语句在数据库之间切换

当然,您可能希望将其包装在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);

这是我使用的最明显的解决方案,但请记住,如果两个数据库的用户名/密码在同一主机中完全相同,则此解决方案将始终使用第一个连接。因此,不要感到困惑,在这种情况下,这是行不通的。您需要做的是,为这两个数据库创建两个不同的用户,它就会工作。

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

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

希望对你有帮助。。。干杯…

您可以使用MySQLi语法,这将使您能够更好地处理它

定义数据库连接,然后在需要查询其中一个数据库时,指定正确的连接

例如:

然后,要在同一页面上查询它们,请使用以下方法:

$query = $Db1->query("select * from tablename")
$query2 = $Db2->query("select * from tablename")
die("$Db1->error");
以这种方式更改MySQLi将对您有所帮助。

而不是使用

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_连接文件。喜欢 第一个是

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中参数pass的名称,如DB1和DB2。
若在mysqli中传递相同的参数,那个么第二个数据库将不再连接。因此,请记住,当您在mysqli函数中使用两个或多个连接传递不同的参数名时,实际上不需要select_db。您可以同时向两个数据库发送查询。首先,通过DB2上的grant select向DB1授予一个从DB2中选择的权限。*toDB1@localhost;. 然后,刷新特权;。最后,您可以执行“多数据库查询”,如从DB1中选择DB1.TABLE1.id、DB2.TABLE1.username、DB2等。不要忘记,您需要“root”访问权限才能使用grant命令

为什么这个答案不在顶部?!这是正确的方法。@aditya menon在我看来,做某事的正确方法往往不是对眼前问题的正确答案。提问者在他的问题中没有使用PDO,而是使用php原生mysql函数,因此我相信最合适的答案应该遵循提问者的代码。@Adityameon谁授权?记住用户永远是对的。。。PDO是最好的方法,但这两种方法都是解决用户问题的正确方法
<?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/>----------------------------------------";

        }     

    }
    ?>

莱姆。请注意正确与最佳之间的区别。对我很无聊,所以我不得不做一个陈述:$db1和$db2代表多个mysql连接吗?如果是这样,那就不好了。有没有办法只通过一个连接容纳多个数据库?@kavoir为什么要这样?如果需要,您可以使用use DATABASENAME更改当前连接上的数据库,但我看不出有什么意义?+1此解决方案适合我。经过两天的调试,为什么我的自定义WordPress模板在调用第二个数据库连接后失去了对$WP_查询对象的访问权……是否可以将其中一个设置为默认值,并且仅在需要时才为第二个添加$dbh2?必须更改所有查询才能使此方法正常工作可能需要几天时间才能找到所有查询…@ThomasK,您可以将mysql\u query包装在一个带有默认参数的函数中,例如db\u query$query,$db='db1',然后将所有旧查询批量更新为db\u query$query,然后将非默认查询自定义更新为db\u query$query,“db2”使用您的方法,如果我定义了两个连接,但没有在查询中指定要使用的连接,那么将使用哪个连接?@Peter:根据:如果没有指定链接标识符,则假定mysql_connect打开的最后一个链接。对于那些尝试上述方法的人,请先看看我喜欢这个解决方案!我可以不使用持久性设置,但是PDO的实例化是一个很好的解决方案。您在未连接到特定数据库的情况下获得了默认连接。请改进您的语法,这不是sms,并使用工具Ctrl+K格式化您的代码。例如,$hostname='your DB_hostname'$用户名='您的DB_用户名'$密码='您的DB_密码'$db_Name 1='您的db_Name 1'$db_Name 2='您的db_Name 2';如果两个数据库中没有同名的表,那么这是最简单的解决方案。您只需执行一次,就不必再担心多个数据库。@只要您只需要以只读方式访问另一个数据库中的数据,对吗?给定的两个查询将以相同的方式工作,而无需调用mysql_select_db,哪怕只调用一次-还有,在中间没有其他任何东西调用它两次是不需要更多细节的。
    define('HOST','localhost');
    define('USER','user');
    define('PASS','passs');
    define(**'DB2**','database_name1');

    $connMitra = new mysqli(HOST, USER, PASS, **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/>----------------------------------------";

        }     

    }
    ?>