- ベストアンサー
PHPで2箇所のODBCサーバーを使うには?
- PHPで2箇所のODBCサーバーを使う方法を教えてください。
- 具体的なODBCリンクの定義方法を教えてください。
- 1つ目のODBCサーバーのテーブルをプライマリーで読み込みながら、2つ目のODBCサーバーのテーブルにJOINやSELECTする方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
がると申します。 んっと…ムリにJOINでつなげなくても、SQL文を複数回、それぞれのDBに対して発行する、ではダメなのでしょうか? あまり色々とムリをして「1つのSQLに全てを詰め込む」よりも、随分と楽に実装が可能だと思うのですが。
その他の回答 (4)
- galluda
- ベストアンサー率35% (440/1242)
がるです。 > [key]を[$key]に変更してみたら上手く表示できました。 うを失礼いたしました(苦笑 んで。 > keyの部分にスペースがあると配列が上手くセット出来ないのですがどうしてなのか解りません スペース「を含めた」状態だと、多分keyが「違う値になっている」のだろうと思います。 本質的には「文字列が完全に一致するようにkeyを作る」のが基本なのですが。 回避策としては「wihleループでデータを入れるときにkeyからスペースを取り除く」手段があります。 具体的には // で、以下のようにデータを突っ込みます while($row = odbc_fetch_array($res1)) { // DEBUG print "id = " . $row["ID1"] . " and name1 = " . $row["NAME1"] . "\n"; $data[$row["ID1"]]["NAME1"] = $row["NAME1"]; } と // で、以下のループを回します while($row = odbc_fetch_array($res2)) { // DEBUG print "id = " . $row["ID2"] . " and name2 = " . $row["NAME2"] . "\n"; $data[$row["id2"]]["name2"] = $row["name2"]; } の部分を // で、以下のようにデータを突っ込みます while($row = odbc_fetch_array($res1)) { // DEBUG print "id = " . $row["ID1"] . " and name1 = " . $row["NAME1"] . "\n"; $data[ trim($row["ID1"]) ]["NAME1"] = $row["NAME1"]; } と // で、以下のループを回します while($row = odbc_fetch_array($res2)) { // DEBUG print "id = " . $row["ID2"] . " and name2 = " . $row["NAME2"] . "\n"; $data[ trim($row["id2"]) ]["name2"] = $row["name2"]; } とします。ポイントはtrimという関数です。 http://jp.php.net/manual/ja/function.trim.php 以上でどんなもんでしょうか?
お礼
早速やってみます。 振り返って・・・お礼です。 ありがとうございました。
補足
がる様、済みません・・・大変お世話になった上、あつかましい追加質問をしてしまいました。がる様の回答をチェックする前に私の急な事情で、QNo.2258050で同様の質問をしてしまいました。一応、参考書でtrimもやってみたのですが、上手くできませんでした。本当に新しいプログラミング+DB等の習得に四苦八苦しております(48歳)。 今後ともよろしくお願いいたします。
- galluda
- ベストアンサー率35% (440/1242)
がるでっす。 DEBUG print見ている限りですと、確かに正しくデータが取れているようなので。 後は出力部分だけですね。 とりあえず、テーブルエレメント出力するまわりだけピックアップして記述してみます。 で。拝見している限りですと、多分こーゆー条件式になります。 ・ID1は無条件に出力 ・NAME1は無条件に出力 ・もしNAME2存在していれば、ID2及びNAME2を出力 こんな感じでしょうか。 その場合、概ね以下のソースで動くかと思われます。 if文で「NAME2が存在して、それは空文字ではない(ちゃんとデータが入っている)」かどうかをきいています。 print "<TABLE>\n"; foreach ($data as $key => $value) { print "<TR>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["NAME1"] . "</TD>\n"; // このif文によって分岐をかけます if ((isset($data[key]["name2"])) && ("" != $data[key]["name2"])) { print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["name2"] . "</TD>\n"; } } print "</TABLE>\n"; こんな感じでどでしょうか?
お礼
振り返って・・・お礼です。 ありがとうございました。
補足
がる様、長いサポートありがとうございます。 どうも結果が思わしくないのでもう一度ソースを見て、 [key]を[$key]に変更してみたら上手く表示できました。 -------------------------------------------------------- print "<TABLE>\n"; foreach ($data as $key => $value) { print "<TR>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[$key]["NAME1"] . "</TD>\n"; // このif文によって分岐をかけます if ((isset($data[$key]["name2"])) && ("" != $data[$key]["name2"])) { print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[$key]["name2"] . "</TD>\n"; } } print "</TABLE>\n"; ----------------------------------------------------- いやー、本当にどうもありがとうございました。 初心者なので丁寧に教えていただきとても感謝しております。 ======================================================== 最後にもう1つだけ教えて下さい。 質問)keyの部分にスペースがあると配列が上手くセット出来ないのですがどうしてなのか解りません(解決方法も教えて頂けるとありがたいです。) 今回教えていただいたテストデータによる結果を記載します。 ----------------------------------------------------------- <DEBUG> sql is SELECT ID1, NAME1 FROM TB1 ORDER BY ID1 id = AA and name1 = 日本 id = BB and name1 = 中国 id = CC and name1 = 韓国 id = DD and name1 = アメリカ id = S and name1 = Sの国名 sql is SELECT id2, name2 FROM tb2 ORDER BY id2 id = AA and name2 = 東京 id = BB and name2 = 北京 id = DD and name2 = ワシントン id = S and name2 = Sの首都名 -------------------実行結果------------------ AA 日本 AA 東京 BB 中国 BB 北京 CC 韓国 CC DD アメリカ DD ワシントン S Sの国名 S <-----下の行と合わせて1行にしたい S S Sの首都名 <----- --2006/07/03 がる様 help挿入後-- AA 日本 AA 東京 BB 中国 BB 北京 CC 韓国 DD アメリカ DD ワシントン S Sの国名 <-----下の行と合わせて1行にしたい S S Sの首都名 <----- ====================================================== S Sの国名 S Sの首都名 <---この様にしたいのですが
- galluda
- ベストアンサー率35% (440/1242)
がるです。まぁこれも何かの縁かと思うので、突っ込んでみます(笑 とりあえずこーゆー時には「デバッグプリント」を入れるのが定石です。 ちと修正したソースをいれるので。 コメントに「DEBUG」って書いてあるあたりに留意しながらご覧ください。 <?php //共通データをインクルードします require_once("item_pic_ini.php"); // 全てのデータを格納する領域を用意しておきます unset($data); // まず、以下のSQL文でODBC1からの全データを取得します $dbh1 = odbc_connect($ODBCDSN1, $DSNUSER1, $DSNPASS1); $sql = "SELECT ID1, NAME1 FROM TB1 ORDER BY ID1"; $res1 = odbc_exec($dbh1, $sql); // DEBUG print "sql is $sql \n"; // で、以下のようにデータを突っ込みます while($row = odbc_fetch_array($res1)) { // DEBUG print "id = " . $row["ID1"] . " and name1 = " . $row["NAME1"] . "\n"; $data[$row["ID1"]]["NAME1"] = $row["NAME1"]; } // この時点で、全てのODBC1のデータが$dataに入ってます。 // 次にODBC2に以下のSQL文を流します $dbh2 = odbc_connect($ODBCDSN2, $DSNUSER2, $DSNPASS2); $sql = "SELECT id2, name2 FROM tb2 ORDER BY id2"; $res2 = odbc_exec($dbh2, $sql); // DEBUG print "sql is $sql \n"; // で、以下のループを回します while($row = odbc_fetch_array($res2)) { // DEBUG print "id = " . $row["ID2"] . " and name2 = " . $row["NAME2"] . "\n"; $data[$row["id2"]]["name2"] = $row["name2"]; } // この時点で、全てのODBC1とODBC2のデータが$dataに入ってます。 // もし「ODBC1とODBC2でデータの同期が取れていない」状態で、かつ、 // 「双方に入っているもののみを表示する」場合、以下の処理を行います foreach ($data as $key => $value) { // もしどちらかのデータが「ない」場合 if ((!isset($data[$key]["NAME1"]))||(!isset($data[$key]["name2"]))) { // 対象のidそのものを削除 unset($data[$key]); } } // で、表示処理を行います // XXX とりあえず大雑把にテーブルで print "<TABLE>\n"; foreach ($data as $key => $value) { print "<TR>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["NAME1"] . "</TD>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["name2"] . "</TD>\n"; } print "</TABLE>\n"; ?> このソースで、デバッグ用の情報が出てくるかと思います。 恐らく、単純に$row["ID1"]とか$row["NAME1"]とかの情報が取れていないのではないかと推測するのですが。 で、IDがとれてNAMEが取れていないところをみると、カラム名が違うとか、単純にそのあたりではないかと推測いたします。 良くあるケースとしては、NAMEのつもりがMANEになっていたり、NAME1ではなく単純にNAMEになっていたり。 そのあたりの定義を見直しつつ、デバッグプリント付きのソースを動かすと、なにか見えてくるのではないかと思います。
お礼
振り返って・・・お礼です。 ありがとうございました。
補足
がる様、DEBUG付きソースありがとうございました。 試すのが遅くなってすみませんでした。 もし、続けて相談&解決して頂けるならよろしくお願いいたします。 ------------------------------------------------------------ <テスト結果:画面コピー>・・・改行を追加しました。 sql is SELECT ID1, NAME1 FROM TB1 ORDER BY ID1 id = AA and name1 = 日本 id = BB and name1 = 中国 id = CC and name1 = 韓国 id = DD and name1 = アメリカ sql is SELECT id2, name2 FROM tb2 ORDER BY id2 id2 = AA and name2 = 東京 id2 = BB and name2 = 北京 AA AA BB BB ------------------------------------------------------- と、以上の結果になりましたので配列内容はいいのだと思います。 これを以下のように表示したいのですが・・・解らない(自己嫌悪) ID1 NAME1 id2 name2 AA 日本 AA 東京 BB 中国 BB 北京 CC 韓国 DD アメリカ -------------------------------------------------------- 済みません、よろしくお願いいたします。
- galluda
- ベストアンサー率35% (440/1242)
がるです。 んっと…あんまり「そのもの」のソースコードを書くのを好まないのではありますが。 以下、簡単にコメントなども入れつつ、大まかにコードっぽいものを。 適宜、命令など補完してください。 とりあえず、仕様から拝見するに「TABLE出したいんだなぁ」という感じでしょうか。 以下、いくつか注意点っていうか留意点を。 ・「id1とid2は"かならず"同一になる」ので、ちょっと処理的にはしょってるところもあります ・本当は、以下のように「プログラムにHTML組み込む」のはよろしくないです ・エラー処理、ところどころはしょってます ・データを「連想配列の連想配列」にしましたが、本当はここを「クラス」にするともあべたぁです なんてところに留意しぃつつ。 // 全てのデータを格納する領域を用意しておきます unset($data); // まず、以下のSQL文でODBC1からの全データを取得します $dbh1 = odbc_connect(ODBC1に接続するための情報各種); $sql = "SELECT id1, name1 FROM テーブル名 ORDER BY お好きなソート用項目名;"; $res1 = odbc_exec($dbh1, $sql); // で、以下のようにデータを突っ込みます while($row = odbc_fetch_array($res1)) { $data[$row["id1"]]["name1"] = $row["name1"]; } // この時点で、全てのODBC1のデータが$dataに入ってます。 // 次にODBC2に以下のSQL文を流します $dbh2 = odbc_connect(ODBC2に接続するための情報各種); $sql = "SELECT id2, name2 FROM テーブル名 ORDER BY お好きなソート用項目名;"; $res2 = odbc_exec($dbh2, $sql); // で、以下のループを回します while($row = odbc_fetch_array($res2)) { $data[$row["id2"]]["name2"] = $row["name2"]; } // この時点で、全てのODBC1とODBC2のデータが$dataに入ってます。 // もし「ODBC1とODBC2でデータの同期が取れていない」状態で、かつ、 // 「双方に入っているもののみを表示する」場合、以下の処理を行います foreach ($data as $key => $value) { // もしどちらかのデータが「ない」場合 if ((!isset($data[$key]["name1"]))||(!isset($data[$key]["name2"]))) { // 対象のidそのものを削除 unset($data[$key]); } } // で、表示処理を行います // XXX とりあえず大雑把にテーブルで print "<TABLE>\n"; foreach ($data as $key => $value) { print "<TR>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["name1"] . "</TD>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["name2"] . "</TD>\n"; } print "</TABLE>\n"; ーー こんなところでしょうか?
お礼
振り返って・・・お礼です。 ありがとうございました。
補足
がる様、ご丁寧にお返事頂きまして大変感謝しております。 早速に実際にテーブルとデータを登録し、ご教授頂いたソースコードを 実行してみました。 <結果> AA AA BB BB ---------------------- となってしまい、 AA日本 AA東京 BB中国 BB北京 と表示できませんでした。 ---------------------- 私のコピーが悪いのかどうか、申し訳ありませんが校正していただけないでしょうか? -------------------------------------- <ソースコード> <?php //共通データをインクルードします require_once("item_pic_ini.php"); // 全てのデータを格納する領域を用意しておきます unset($data); // まず、以下のSQL文でODBC1からの全データを取得します $dbh1 = odbc_connect($ODBCDSN1, $DSNUSER1, $DSNPASS1); $sql = "SELECT ID1, NAME1 FROM TB1 ORDER BY ID1"; $res1 = odbc_exec($dbh1, $sql); // で、以下のようにデータを突っ込みます while($row = odbc_fetch_array($res1)) { $data[$row["ID1"]]["NAME1"] = $row["NAME1"]; } // この時点で、全てのODBC1のデータが$dataに入ってます。 // 次にODBC2に以下のSQL文を流します $dbh2 = odbc_connect($ODBCDSN2, $DSNUSER2, $DSNPASS2); $sql = "SELECT id2, name2 FROM tb2 ORDER BY id2"; $res2 = odbc_exec($dbh2, $sql); // で、以下のループを回します while($row = odbc_fetch_array($res2)) { $data[$row["id2"]]["name2"] = $row["name2"]; } // この時点で、全てのODBC1とODBC2のデータが$dataに入ってます。 // もし「ODBC1とODBC2でデータの同期が取れていない」状態で、かつ、 // 「双方に入っているもののみを表示する」場合、以下の処理を行います foreach ($data as $key => $value) { // もしどちらかのデータが「ない」場合 if ((!isset($data[$key]["NAME1"]))||(!isset($data[$key]["name2"]))) { // 対象のidそのものを削除 unset($data[$key]); } } // で、表示処理を行います // XXX とりあえず大雑把にテーブルで print "<TABLE>\n"; foreach ($data as $key => $value) { print "<TR>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["NAME1"] . "</TD>\n"; print "<TD>" . $key . "</TD>\n"; print "<TD>" . $data[key]["name2"] . "</TD>\n"; } print "</TABLE>\n"; -------------------------------------- <テストデータ> (ODBC1....TB1) ID1 NAME1 ETC1 AA 日本 NIPPON BB 中国 CHAINA CC 韓国 KOREA DD アメリカ U.S.A (ODBC2....tb2) id2 name2 etc2 AA 東京 TOKYO BB 北京 PEKIN -------------------------------------- <欲しい結果> ID1 NAME1 id2 NAME2 AA 日本 AA 東京 BB 中国 BB 北京 CC 韓国 -- ------- <==TB1にあってtb2にない DD アメリカ -- ------- <==TB1にあってtb2にない ----------------------------------------------------------- ごめんなさい!非常に面倒な事をお願いしているのは自覚しております。申し訳ありません。
お礼
振り返って・・・お礼です。 ありがとうございました。
補足
galluda様ありがとうございました。 *表示したい画面のイメージを書いてみます。 -- ODBC1 --/ -- ODBC2 -- (DATA1) / (DATA2) id1 nam1/id2 nam2 AA 日本 AA 東京 <===1行目の表示イメージ BB 中国 BB 北京 <===2行目の表示イメージ CC 韓国 CC ソウル<===3行目の表示イメージ -------------------------------------------------- (概略仕様) (1) ODBC1(DATA1)をラストまで1件毎に読込む id1でODBC2(DATA2/id2)より等しいデータを抽出 表示データの作成 id1,nam1,id2,nam2にデータセット -------------------------------------------------- *1行にODBC1とODBC2の両方の情報を表示させる場合、 最初にjoinで結合してしまうか、メインテーブルをぐるぐる読みなが らサブテーブルの情報をセットする方法、のどっちかだと思いました が、初心者なのでよく解らないのです。 galluda様のご指摘の様に、プロセスを分けてやる方法でも何でもいいので、 具体的にお教え願えないでしょうか? お手数ですが、ソースを例示して頂けると助かります。