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

时间:2008-11-08 16:24:13

标签: php mysql

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

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

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

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

12 个答案:

答案 0 :(得分:328)

警告: 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而不是较旧的扩展程序,这是一种更好的方法。

答案 1 :(得分:96)

如果您使用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();
}

答案 2 :(得分:9)

我让生活变得简单:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

希望它有用......干杯......

答案 3 :(得分: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

答案 4 :(得分:4)

尝试以下代码:

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

答案 5 :(得分:3)

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

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

注意构造参数中缺少dbname=

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

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

当然,您可能希望将其包装在catch try语句中。

答案 6 :(得分: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);

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

答案 7 :(得分:2)

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

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

E.g:

$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将对您有所帮助。

答案 8 :(得分:2)

您实际上并不需要select_db。您可以同时向两个数据库发送查询。首先,向DB1提供赠款,以DB2GRANT select ON DB2.* TO DB1@localhost;中进行选择。然后,FLUSH PRIVILEGES;。最后,您可以进行多数据库查询'比如SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2等。(不要忘记你需要&root;'访问使用grant命令)

答案 9 :(得分:1)

如果您使用的是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**);

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

答案 10 :(得分:0)

<?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/>----------------------------------------";

        }     

    }
    ?>

答案 11 :(得分:-1)

我已经在laravel中做到了

 ini_set('max_execution_time', 3600);
                $old_users = DB::connection('mysql2')->table('user_master')->get();
                foreach ($old_users as $old_user) {
                    if ($old_user->usr_phone != "0") {
                        $password = base64_decode($old_user->usr_pwd);
                        $password = Hash::make($password);
                        if ($old_user->device_type == "1") {
                            $device_type = "ios";
                        } else if ($old_user->device_type == "2") {
                            $device_type = "android";
                        } else {
                            $device_type = "web";
                        }
                        $user = new User;
                        $user->name = $old_user->usr_name;
                        $user->email = $old_user->usr_email;
                        $user->points_exp_date = "2018-08-02";                        try {
                            $user->save();
                        } catch (\Exception $e) {
                            echo ("<script>console.log('duplicate entry in user: " . $user->name . "');</script>");
                        }
                        Log::info('user saved');
                    }
                }

这是我的示例代码