• 締切済み

phpで複数のDBを使用した場合のコーディング

mysqlは複数のDB(DBエンジンではなくデータベース)に跨る検索は出来ないと思いますが、仮に複数のDBを使う必要がある場合一般的にはどのようにしてるのでしょうか? 特にDBアクセスクラスを作っている場合のまとめ方など指南して頂けないでしょうか? 今は、一つのクラスの中で、コンストラクタでコネクト処理をして、全てのDBアクセスはクラスの中のメソッドを通してやってましたが、ここに来て別のDBも参照する必要が出てきて対応に困っています。せっかくクラスの概念にも慣れてきてるところなので、ぜひきれいなコード(処理)をしたいと考えています。 使用する環境は、 debian woody php 5.2.0-8 mysql4.0.24

みんなの回答

回答No.3

#1です。レスへのレス。 コーディングというよりデザイン(設計)の話ですね。どちらが分かりやすい、どちらがメンテナンスしやすい、どちらが将来的に汎用性がある、とか言う事に主眼をおいたらいいと思います。 接続方法は一緒でしょうから、接続用のクラスをまず作って、DB毎に違うでしょうからそれを継承した拡張クラスをDBの数用意し、それらを利用する大きなクラスでまとめていろんなメソッドを追加していく、と言う事になるのではないでしょうか。 参考まで。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

私の理解力がないのかいまいち状況がはあくできないのですが、 今回の希望は別サーバーへのアクセスなのでしょうか? それとも同じサーバー内の別データベースへのアクセスなのでしょうか? リンクをわければアクセスできそうですが。 別サーバーであれば・・・ $link1=mysql_connect($host1,$username1,$password1); $link2=mysql_connect($host2,$username2,$password2); mysql_select_db($database1,$link1); $sql="SELECT * FROM `hoge`"; $res=mysql_query($sql,$link1); mysql_select_db($database2,$link2); $sql="SELECT * FROM `fuga`"; $res=mysql_query($sql,$link2); 同じサーバーの別データベースなら $link=mysql_connect($host,$username,$password); mysql_select_db($database1,$link); $sql="SELECT * FROM `hoge`"; $res=mysql_query($sql,$link); mysql_select_db($database2,$link); $sql="SELECT * FROM `fuga`"; $res=mysql_query($sql,$link); 検証してないので、間違っている可能性かなりありますが・・・

回答No.1

きれいかどうかわかりませんが。。。。 PEARのDBクラスでやった場合、こんな感じです。 require_once 'DB.php'; $dsn1 = "mysql://aaa1: @localhost/hogehoge";// 自ホストのhogehogeへaaa1で接続 $dsn2 = "mysql://aaa2: @db.host.name/herohero";//別サーバ db.host.nameのheroheroにaaa2で接続 $db1 = DB::connect( $dsn1 );//接続、オブジェクト$db1を返す $db2 = DB::connect( $dsn2 );//接続、オブジェクト$db2を返す .......................... //別サーバのテーブルからgetAll()を使ってデータを取得し、自サーバに格納してみましょう $arr = $db2->getAll("SELECT * FROM ......"); foreach($arr as $data){  $db1->query("INSERT INTO ......."); } とこんな感じです。ちなみにMySqlとPostgreSQL、オラクル、と言うようにどんなDBであっても同じです。 同じ処理が多かったら、これをクラス化すれば良いとお思います。 参考まで。

lovehiroko
質問者

お礼

回答ありがとうございます。 質問にも書きましたが、自作クラスからアクセスするようにしています。 これを自作クラスに当てはめた場合、やはりコンストラクタで二つのDB接続処理をするのがスマートなんでしょうか? その場合、戻り値も二つとなりますよね。それともコンストラクタでは接続に必要な情報のセットだけにして、別メソッドでそれぞれ接続処理したほうがいいのでしょうか? 今これを書きながらmysqlというよりphpのコーディングの話である事に気付いてしまいましたがよろしくお願いします。 クラスはなかなか難しいです。

関連するQ&A