단일 웹 페이지에서 여러 MySQL 데이터베이스에 어떻게 연결합니까?


179

몇 가지 데이터베이스에 정보가 분산되어 있으며 PHP를 사용하여 모든 정보를 하나의 웹 페이지에 저장하고 싶습니다. 단일 PHP 웹 페이지에서 여러 데이터베이스에 연결하는 방법이 궁금합니다.

다음을 사용하여 단일 데이터베이스에 연결하는 방법을 알고 있습니다.

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

그러나 여러 "mysql_connect"명령을 사용하여 다른 데이터베이스를 열 수 있습니까? 그리고 여러 데이터베이스가 연결되어있는 경우 PHP가 정보를 가져 오려는 데이터베이스를 어떻게 알 수 있습니까?

답변:


335

경고 : mysql_xx 함수는 PHP 5.5부터 더 이상 사용되지 않으며 PHP 7.0부터 제거됩니다 ( http://php.net/manual/intro.mysql.php 참조 ). mysqli_xx함수를 사용 하거나 @Troelskn에서 아래 답변을 참조하십시오


에 대해 여러 번 호출 할 수 mysql_connect()있지만 매개 변수가 동일하면 ' $new_link'(4 번째) 매개 변수에 대해 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 사용자가 두 데이터베이스 모두에 액세스 할 수 있고 동일한 호스트에있는 경우 (즉, 동일한 연결에서 두 DB 모두 액세스 가능) 다음을 수행 할 수 있습니다.

  • 하나의 연결을 열어두고 mysql_select_db()필요에 따라 스왑을 호출 하십시오. 이것이 깨끗한 솔루션인지 확실하지 않으므로 잘못된 데이터베이스를 쿼리 할 수 ​​있습니다.
  • 쿼리 내에서 테이블을 참조 할 때 데이터베이스 이름을 지정하십시오 (예 :) SELECT * FROM database2.tablename. 구현하기가 어려울 수 있습니다.

또한 troelskn의 답변을 읽으십시오. 이전 확장보다 PDO를 사용할 수 있다면 더 나은 접근 방법입니다.


2
+1이 솔루션은 저에게 효과적이었습니다. 두 번째 데이터베이스 연결을 호출 한 후 $ WP_Query 객체에 왜 내 사용자 지정 워드 프레스 템플릿을 잃고 있었다 액세스를 디버깅 이틀 ... 후
에디 B

그들 중 하나를 기본으로 설정하고 $dbh2필요한 경우에만 두 번째 것을 추가 해야합니까? 이 접근 방식이 작동하도록 모든 쿼리를 변경
해야하는 경우

@ThomasK, 당신은 기본 매개 변수와 함수에는 mysql_query를 감싸는 말을 할 수 db_query($query,$db='db1')와에 다음 대량의 모든 기존 쿼리를 업데이트 db_query($query)정의에 기본이 아닌 것들을 업데이트하여 다음db_query($query,'db2')
joshuahedlund

귀하의 방법을 사용하여 두 개의 연결을 정의하지만 쿼리에 사용할 연결을 지정하지 않으면 어떤 연결이 사용됩니까?
피터

1
@Peter : php.net/manual/en/function.mysql-query.php 에 따르면 :If the link identifier is not specified, the last link opened by mysql_connect() is assumed.
Tom Haigh

97

PHP5를 사용하는 경우 (그리고 PHP4가 더 이상 사용되지 않는다는 점을 감안하면) PDO 를 사용해야합니다. 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();
}

5
왜이 답변이 맨 위에 있지 않습니까?! 이것이 올바른 방법입니다.
Aditya MP

10
내 의견으로는 @aditya menon, 종종 무언가를하는 올바른 방법은 당면한 질문에 대한 정답이 아닙니다. Asker는 자신의 질문에 PDO를 사용하지 않고 php 고유의 mysql 함수를 사용했기 때문에 가장 적합한 답변이 asker 코드를 따를 것이라고 믿습니다.
Jonathan dos Santos

2
@adityamenon의 권한은 무엇입니까? 사용자가 항상 옳다는 것을 기억하십시오. PDO가 가장 좋은 방법이지만 두 가지 방법 모두 사용자 문제를 해결하는 올바른 방법입니다. 옳고 그름의 차이점에 유의하십시오. 예 ... 지루해서 말을해야했습니다.
JustinKaz

$ db1과 $ db2는 여러 mysql 연결을 나타 냅니까? 그렇다면 좋지 않습니다. 하나의 연결로 여러 데이터베이스를 수용 할 수있는 방법이 있습니까?
datasn.io

@kavoir 왜 그렇게 하시겠습니까? 필요한 경우와의 현재 연결에서 데이터베이스를 변경할 수 use DATABASENAME있지만 요점이 보이지 않습니까?
troelskn

9

나는 방금 내 인생을 간단하게 만들었습니다.

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

도움이 되길 바랍니다.


1
두 데이터베이스에 동일한 이름의 테이블이없는 경우 가장 쉬운 솔루션입니다. 한 번만 수행하면 더 이상 여러 데이터베이스에 대해 걱정할 필요가 없습니다.
Erel Segal-Halevi

다른 db의 데이터에 대한 읽기 전용 액세스 만 필요한 경우 @ ErelSegal-Halevi?
Buttle Butkus

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

1
$ hostname = '귀하의 DB_Hostname'; $ username = '귀하의 DB_Username'; $ password = '귀하의 DB_ 암호'; $ db_name1 = '귀하의 DB_ 이름 1'; $ db_name2 = '귀하의 DB_ 이름 2';
kaushik

이것이 작동하지 않는 것은 잘못입니다mysql_connect
Nico Haase

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한 번도 호출하지 않고 같은 방식으로 작동합니다. 또한 중간에 다른 것없이 두 번 호출하면 쓸모가 없습니다.
Nico Haase

4
$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 명의 다른 사용자를 작성하는 것입니다.


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 문으로 감싸고 싶을 수도 있습니다.


위의 접근 방식을 시도하는 사람들은 stackoverflow.com/a/14933070/1623579
TheFrost

나는이 해결책을 좋아한다! 지속적인 설정없이 할 수는 있지만 PDO의 인스턴스화는 훌륭한 솔루션입니다. 특정 데이터베이스에 연결하지 않고 기본 연결을 얻습니다.
척 버지스

2

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로 변경하면 도움이됩니다.


구문 (SMS가 아님)을 개선하고 도구 (예 : Ctrl + K)로 코드를 형식화하십시오.
fedorqui 'SO 중지 피해'

2

당신은 실제로 필요하지 않습니다 select_db. 두 데이터베이스에 동시에 쿼리를 보낼 수 있습니다. 먼저 by DB1중에서 선택할 수있는 권한을 부여 하십시오 . 그런 다음, . 마지막으로, 당신은 등등 과 같은 '다중 데이터베이스 쿼리'를 수행 할 수 있습니다 .DB2GRANT select ON DB2.* TO DB1@localhost;FLUSH PRIVILEGES;SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2


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

따라서 DB1 및 DB2와 같은 mysqli의 매개 변수 전달 이름을 변경하십시오. mysqli에서 동일한 매개 변수를 전달하면 두 파일 모두에서 DB1이 있다고 가정하면 두 번째 데이터베이스는 더 이상 연결되지 않습니다. 따라서 두 개 이상의 연결을 사용하는 경우 mysqli 함수에서 다른 매개 변수 이름을 전달하십시오.


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

        }     

    }
    ?>

더 자세한 내용은 당신이 방문 할 수 github.com/sapankumarmohanty/CountRecordsAtMigrationFinalSync을
htngapi을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.