【问题标题】:How do you connect to multiple MySQL databases on a single webpage?如何在一个网页上连接多个 MySQL 数据库?
【发布时间】:2010-09-21 10:52:37
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    警告: 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 这个解决方案对我有用。经过两天的调试,为什么我的自定义 WordPress 模板在调用第二个数据库连接后无法访问 $WP_Query 对象...
    • 是否可以将其中一个设置为默认设置,而仅在需要时才为第二个添加$dbh2?必须更改所有查询才能使用这种方法可能需要几天时间才能找到所有查询...
    • @ThomasK,您可以使用默认参数将 mysql_query 包装在一个函数中,例如 db_query($query,$db='db1'),然后将所有旧查询批量更新为 db_query($query),然后自定义更新您的非默认查询为db_query($query,'db2')
    • 使用你的方法,如果我定义了两个连接但没有指定在查询中使用哪个连接,将使用哪个连接?
    • @Peter:根据php.net/manual/en/function.mysql-query.phpIf the link identifier is not specified, the last link opened by mysql_connect() is assumed.
    【解决方案2】:

    如果你使用 PHP5(你应该使用 PHP4,因为 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();
    }
    

    【讨论】:

    • 为什么这个答案不在顶部?!这是正确的做法。
    • @aditya menon 在我看来,做某事的正确方法往往不是手头问题的正确答案。提问者在他的问题中没有使用 PDO,而是使用 php 本机 mysql 函数,所以我相信最合适的答案会遵循提问者代码。
    • @adityamenon 在谁的授权下?记住用户永远是对的... PDO 是最好的方法,但两种方法都是解决用户问题的正确方法。请注意正确和最佳之间的区别。是的......我很无聊,所以我不得不发表声明。
    • $db1 和$db2 是否代表多个mysql连接?如果是这样,那就不好了。有什么方法可以通过一个连接来容纳多个数据库?
    • @kavoir 你为什么想要那个?如果需要,您可以使用use DATABASENAME 更改当前连接上的数据库,但我看不出重点?
    【解决方案3】:

    除非您确实需要使用多个 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 语句中。

    【讨论】:

    • 想尝试以上方法的朋友们可以先看看stackoverflow.com/a/14933070/1623579
    • 我喜欢这个解决方案!我可以不用持久化设置,但是 PDO 的实例化是一个很好的解决方案。您无需连接到特定数据库即可获得默认连接。
    【解决方案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);
    

    【讨论】:

    • 给定的两个查询将以相同的方式工作,甚至一次也不调用mysql_select_db - 而且,在中间没有任何其他内容的情况下调用两次是没有用的
    【解决方案5】:
    $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 个不同的用户,它就会工作。

    【讨论】:

      【解决方案6】:

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

      CREATE VIEW another_table AS SELECT * FROM another_database.another_table;
      

      希望对您有所帮助...干杯...

      【讨论】:

      • 如果两个数据库中没有同名的表,这是最简单的解决方案。您只需执行一次,就不必再担心多个数据库了。
      • @ErelSegal-Halevi 只要您只需要对其他数据库中的数据进行只读访问,对吗?
      【解决方案7】:

      您也许可以使用 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 将对您有所帮助。

      【讨论】:

      • 请改进您的语法(这不是短信)并使用工具(例如 Ctrl+K)格式化您的代码。
      【解决方案8】:

      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
      

      【讨论】:

      • $hostname = '你的 DB_Hostname';$username = '你的 DB_Username'; $password = '你的 DB_password';$db_name1 = '你的 DB_Name 1'; $db_name2 = '你的 DB_Name 2';
      • 这不适用于mysql_connect
      【解决方案9】:

      如果你使用 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】:

        您实际上并不需要select_db。您可以同时向两个数据库发送查询。首先,授予DB1 以从DB2GRANT select ON DB2.* TO DB1@localhost; 中进行选择。然后,FLUSH PRIVILEGES;。最后,您可以像SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2 等进行“多数据库查询”。(不要忘记您需要“root”权限才能使用授权命令)

        【讨论】:

          【解决方案11】:
          <?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/>----------------------------------------";
          
                  }     
          
              }
              ?>
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-04
          相关资源
          最近更新 更多