単一のWebページで複数のMySQLデータベースにどのように接続しますか?


179

いくつかのデータベースに情報が分散しているため、PHPを使用してすべての情報を1つのWebページに配置したいと考えています。単一のPHP Webページで複数のデータベースに接続するにはどうすればよいかと思っていました。

私は以下を使用して単一のデータベースに接続する方法を知っています:

$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の場合、2番目を渡します。

mysql_query('select * from tablename', $dbh2);

リンク識別子を渡さない場合、最後に作成された接続が使用されます(この場合はで表される接続$dbh2)。

mysql_query('select * from tablename');

別のオプション

MySQLユーザーが両方のデータベースにアクセスでき、それらが同じホスト上にある場合(つまり、両方のDBが同じ接続からアクセス可能)、次のことができます。

  • 1つの接続を開いたままにして、mysql_select_db()必要に応じて交換を呼び出します。これがクリーンなソリューションであるかどうかはわかりませんが、間違ったデータベースにクエリを実行する可能性があります。
  • クエリ内でテーブルを参照するときに、データベース名を指定します(例:)SELECT * FROM database2.tablename。これは、実装が面倒になる可能性があります。

古い拡張機能ではなくPDOを使用できる場合は、troelsknの回答も読んでください。


2
+1この解決策は私にとってうまくいきました。2日目のデバッグの後、2番目のデータベース接続の呼び出し後にカスタムWordPressテンプレートが$ WP_Queryオブジェクトにアクセスできなくなった理由...
Eddie B

それらの1つをデフォルトに設定し$dbh2、必要な場合にのみ2つ目を追加する必要があるのでしょうか。このアプローチが機能するようにすべてのクエリを変更する必要がある場合、おそらくすべてのクエリを見つけるだけで数日かかるでしょう
ThomasK

@ThomasK、たとえば、mysql_queryをデフォルトパラメータを使用して関数にラップdb_query($query,$db='db1')し、古いクエリをすべて一括更新してからdb_query($query)、デフォルト以外のクエリをカスタム更新するdb_query($query,'db2')
joshuahedlund

あなたの方法を使用して、2つの接続を定義し、クエリで使用する接続を指定しない場合、どの接続が使用されますか?
Peter

1
@Peter:に従ってphp.net/manual/en/function.mysql-query.phpIf the link identifier is not specified, the last link opened by mysql_connect() is assumed.
トム・ヘーグ

97

PHP5を使用する場合(そして、PHP4が非推奨になっていることを前提として、そうする必要があります)、PDOを使用する必要があります。これは、徐々に新しい標準になりつつあるためです。PDOの(非常に)重要な利点の1つは、バインドされたパラメーターをサポートすることです。これにより、コードの安全性が大幅に向上します。

次のように、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私の意見では、何かをする正しい方法はしばしば目の前の質問に対する正しい答えではありません。アスカーは彼の質問でPDOを使用していませんでしたが、phpネイティブのmysql関数を使用しているため、最も適した回答はアスカーコードに従うと思います。
ジョナサン

2
その権限の下で@adityamenon?ユーザーは常に正しいことを忘れないでください... PDOが最善の方法ですが、どちらの方法もユーザーの問題を解決する正しい方法です。正しいと最高の違いに注意してください。はい...私は退屈なので、声明を出さなければなりませんでした。
JustinKaz 2012

$ db1と$ db2は複数のmysql接続を表しますか?もしそうなら、それは良くありません。1つの接続だけで複数のデータベースに対応する方法はありますか?
datasn.io

@kavoirどうしてそんなことしたいの?必要に応じて、との現在の接続でデータベースを変更できますがuse DATABASENAME、ポイントがわかりませんか?
troelskn 2014

9

私は私の人生をシンプルにしました:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

お役に立てば幸いです...乾杯...


1
これは、両方のデータベースに同じ名前のテーブルがない場合に最も簡単なソリューションです。一度実行すれば、複数のデータベースについて心配する必要がなくなります。
Erel Segal-Halevi 2016

@ 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 = 'Your DB_Hostname'; $ username = 'Your DB_Username'; $ password = 'Your DB_password'; $ db_name1 = 'Your DB_Name 1'; $ db_name2 = 'Your DB_Name 2';
kaushik

これがうまくいかないのは間違いですmysql_connect
ニコ・ハーゼ2018

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

指定された2つのクエリは、mysql_select_db1回も呼び出さなくても同じように機能します。また、途中で何も呼び出さずに2回呼び出すのは無意味です
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構文を使用できる場合があります。これにより、より適切に処理できるようになります。

データベース接続を定義し、データベースの1つにクエリを実行する場合は常に、正しい接続を指定します。

例えば:

$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 stop harming' 2014

2

実際には必要ありませんselect_db。クエリを2つのデータベースに同時に送信できます。まず、への助成金を与えるDB1から選択することDB2によってGRANT select ON DB2.* TO DB1@localhost;。その後、FLUSH PRIVILEGES;。最後に、「マルチデータベースクエリ」SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2などを実行できます(grantコマンドを使用するには「root」アクセスが必要であることを忘れないでください)


1

mysqliを使用していて、2つの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**);

SOは、DB1やDB2のようにmysqliでパラメーターパスの名前を変更するだけです。mysqliで同じパラメーターを渡すと、両方のファイルでDB1が想定され、2番目のデータベースは接続しなくなります。mysqli関数で2つ以上の接続パスの異なるパラメーター名を使用する場合は覚えておいてください


-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 /
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.