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

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

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

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

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



답변

경고 : 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를 사용할 수 있다면 더 나은 접근 방법입니다.


답변

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();
}


답변

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

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

도움이 되길 바랍니다.


답변

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


답변

아래 코드를 사용해보십시오 :

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


답변

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


답변

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