• 締切済み

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

  • PHP+MySQLでの排他処理とDBクローズ

    <環境> Apache1.3.37 PHP4.4.6 MySQL4.0.27 PHPで、掲示板などのスクリプト作成を勉強しています。 これまで、ログをログファイルとして保存するように作成しておりましたが、データベースに保存するように変更している途中です。 そこで、教えていただきたいのは下記の2点です。 ・ロック処理の必要性 →ログファイルを作成するタイプの場合、同時アクセスによるファイル破損を防ぐため、ロック処理が必要でした。DBに変更した場合も同様に必要なのでしょうか? ・DBのクローズ処理 →最小限のソースを以下に記します。9行目のクローズ処理は必ず必要でしょうか?また、エラーが発生した場合、7行目で処理が終わるのですが、この直前にもクローズ処理を記入する必要があるのでしょうか? 1)<?php 2)$db = mysql_connect(host,user,pass); 3)mysql_select_db(db-name,$db); 4)$query = "INSERT INTO table(id,name) VALUES('1','なまえ')"; 5)if (!(mysql_query($query))) { 6) print = "書き込みに失敗しました。"; 7) exit(); 8)} 9)mysql_close($db); 10)?> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP5 コンストラクタや初期化の意味がわからない

    プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • MySQL、Accessを利用したDBの設計

    会社で現在の作業をシステム化し、将来的にはマーケティング処理も行う目的でMySQLを導入し、インタフェースをAccessにしてDB設計する方針になり、多少経験があるわたしが担当することになってしまいました。今、必死でMySQLを調べているのですが、基本的な理解ができていません。助けてください!! 1.MySQLとAccessを使うには会わせてODBC、MDACのインストールも必要のようですが、サーバ/クライアントのどちらに載せればいいのですか?他に必要なソフト(ミドル)ウェアはありますか? 2.MySQLの起動とありますが、サーバが立ち上がっている間自動で動作しているものではないのですか?(DBにアクセスする前にサーバに行ってMySQLを起動し、終わったら終了させるということですか?) 3.サーバ上のDBをクライアント側のAccessで操作するには、DBのアクセス権等何をどう設定する必要がありますか? 4.何十万件ものデータ処理をAccessで耐えられますか? 5.現在Access上にあるデータはテーブル毎にODBCにエクスポートするようですがクエリ(SQLソース)、リレーションシップ等はどう移植すればいいのですか?移植で注意すること(文字コード等)とかありますか? Access2002、MySQL3.23.51、phpMyAdmin2.2.6、WindowsXPを使ってます。 MySQL解説書には上記のようなことには触れていないのでわけがわかりません。ながくてばかばかしい質問かもしれませんが教えてください。よろしくお願いします。

  • PHPからMySQLにアクセスする方法について、

    PHPからMySQLにアクセスする方法について、 自分のとっている方法が正しいか分かりません。 現在、以下のような状態です <<< index.phpの中身(概要) >>> (1)DBのコネクト    mysql_connect("localhost", "mysql_user", "mysql_password");    mysql_select_db("mydb"); (2)DBへのアクセス    $result=mysql_query("SELECT id, name FROM mytable");    $row=mysql_fetch_array($result, MYSQL_NUM); (3)クエリーのクローズ    mysql_free_result($result); (4)exit; 公式サイトのサンプルをそのまま流用したような形なのですが、 これだとindex.phpが呼び出されるたびにDBをコネクトし直します。 現在、数万レコード単位のテーブルの読み込みが頻発するシステムを開発しています。 取得したいデータの容量自体は大きなものではなく、SELECT文も高速に動作するように WHERE文等気を使っていますが、後々のことを考えると心配になりました。 できればページが飛んでもDBの接続が保持されるようにしたいのですが 可能なのでしょうか。 また、それによってアクセスの高速化は望めるのでしょうか。 ご存知の方、お手数ですがご教授お願いいたします。

    • ベストアンサー
    • PHP
  • Javaのstaticメソッドの意味を教えて下さい

    Javaのstaticメソッドの意味を教えて下さい。 現在の解釈では、staticなメソッドとはインスタンスの生成に依存せず呼び出せる処理のことだと認識しています。逆にstaticでないメソッドは、生成後のインスタンスにしか使えない処理だと理解しています。 しかし、コンストラクタがstaticでないことに気がつき、疑問が生まれました。コンストラクタはstaticではないので、コンストラクタを呼び出す時にはそのクラスのインスタンスが必要になるはずです。しかしこのインスタンスを作るのにもコンストラクタが必要です。コンストラクタを使うためにインスタンスが必要で、インスタンスを作るためにコンストラクタが必要という無限ループになってしまいました。 そこで改めて、staticメソッドの意味を教えて頂きたいです。

  • BeanにてのDB接続方法

    こんばんは、こちらの皆様には大変お世話になっております。 早速ですがまた質問です^_^; 今MVCモデルを使って社員データをDBにいれる簡単なプログラムを作っているのですが、DB接続がうまくいきません。というよりも私の考え方で合っているのかが定かではないのですが…。 BeanのほうでDB接続のメソッドを作って、それをサーブレットで使おうと思っているのですが、Beanクラスのコンパイルができないんです。(画面表示担当のJSPから直接DBへ接続するぶんにはなんの問題もありません) Beanにはいろんなメソッドを作るつもりで、DBへの指示のSQL文も一つ一つメソッド(データを追加したり、削除したり)を作るつもりでいます。 問題はメソッドの中でDB接続の処理をしてしまうと、別のメソッドでStatementオブジェクトが使えなくなってしまうことです。 DB接続のメソッドは戻り値も引数もなく、DBへ指示を出すメソッドはその時々に合ったものにしようと考えています。この引数をうまく使うのかなぁ、と思いつつも良い案が浮かびません。それとも根本的に考え方が間違っているのでしょうか? 皆様お忙しいとは思いますがご教示のほど、宜しくお願いいたします<(_ _)>

    • ベストアンサー
    • Java
  • 取得値の複数使用

    $result = mysql_query("SELECT id, name FROM mytable"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $id = mb_convert_encoding($row['id'] , "SJIS", "EUC"); $name = mb_convert_encoding($row['name'], "SJIS", "EUC"); echo $id.":".$name; } 一度DBより取得した値 $resultの中身を複数回使用したいのですが・・・。 毎回、DBにアクセスしないとダメですか?

    • 締切済み
    • PHP
  • final修飾子を使用した場合で

    お世話になっています。 finalクラスとfinalメソッドの利用目的の考え方を踏まえて、 id/passwordを「新規」、「更新」、「削除」したい場合で、 開発者側から判定してほしいのですが。 ※更新、削除が複数実行されることを考慮する dbへのユーザーの追加方法だけ、決定事項として実行する(finalメソッド) public class LoginAction { public static void main(String[] args) { User login = new Login("test","test"); //サブクラスを親クラスにインスタンス化する int key = 0; String id="test"; String password="test"; login.check(key, id, password); } } public class Login extends User { public Login(String id, String password) { super(id, password); } //処理判断 @Override public void check(int key, String id, String password) { if(key==0){ insertUser(id,password); }else if(key==0){ deleteUser(id,password); }else if(key==2){ updateUser(id,password); } } } public class User { public User(String id,String password) {} /** * ユーザーの追加(一件) */ public final void insertUser(String id, String password) { //DBに登録 } /** * ユーザーの削除(1件) */ public final void deleteUser(String id,String password) { //DBからデータ削除 } /** * ユーザーの更新(1件) */ public final void updateUser(String id, String password) { //DBの更新 } //処理判断 public void check(int key, String id, String password) { //サブクラスに預ける } } また、この時に、check()メソッドでどの処理かを判断し、メソッドのわたしているのですが、それをコンストラクタで渡したら、 無駄なロスが出そうな気がするのですが。 他に、サブクラスで設定し、親クラスにインスタンス化を実行すると、 何がいいのかがよくわかりません。 親クラスはサブクラスのデータを持っていて、そうすることで最終的に 親クラスから、サブクラスのデータが取れるという感じなのですが。 宜しくお願いします。

    • ベストアンサー
    • Java
  • 複数のDBを同時に開く事ができなくなりました

    Access2K/Win2Kを使っています。 これまで2・3種類のDBを同時に開き、同時使用していました。 (任意のデータをコピー&ペーストする必要が度々あり。) ハードディスクの故障もあり、何らかの理由で設定が変ったせいでしょうが、 複数のDBを同時に開く事ができなくなりました。 一つのDB-1を開いた後、DB-2を開こうとすると、フリーズした状態となり、DB-1を一端閉じてからでないとDB-2を開く事ができません。 DB-1とDB-2にはリンクが貼ってありますが、リンクの無いDB-3との関係も同じ問題が起きます。 設定をどのようにやり直したらよいのか是非ご教授お願いします。

  • 親クラスコンストラクタを呼び出すタイミングについて

    ・親クラスコンストラクタを呼び出すタイミングに決まりはあるのでしょうか? ・例えば、子クラスのコンストラクタではなくて、子クラスのメソッドとかで呼び出しても良いのでしょうか? ・後、親クラスコンストラクタ処理が不要な場合は、子クラスから呼ばなくても別に構わないのでしょうか?

    • ベストアンサー
    • PHP
ix500とEvernote連携中のトラブル
このQ&Aのポイント
  • 最近、ix500とEvernoteの連携で問題が発生しています。1ページ目が白紙のデータとして取り込まれる現象が起きていますが、スキャナ単独での動作では正常に動作しています。
  • Evernoteクライアントソフトとの連携部分に問題がある可能性が高いと考えられます。他に同様の症状が出ている方はいないか確認したいです。
  • ScanSnap Homeのバージョンは2.5.0.5、ScanSnap オンラインアップデートのバージョンは3.1.34.2、Evernoteクライアントのバージョンは10.32.4です。
回答を見る