몇 가지 데이터베이스에 정보가 분산되어 있으며 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 문으로 감싸고 싶을 수도 있습니다.