2011-08-08 4 views
2

私はPDOを初めて使うので私を許してください。簡単な解決策があるかどうかはわかりません。私はしばらくオンラインで検索してきましたが、まだ答えを見つける必要がありません。同じforeachループ内で2つのPDOオブジェクトをどのように結合しますか?

私は接続している2つの異なるデータベースがあります。

try { 
    $db1= new PDO("sqlsrv:server=$server;Database = $dbname", $uid, $pwd); 
    $db2= new PDO("sqlsrv:server=$server;Database = $db2name", $db2uid, $pwd); 
} 

共通IDに基づいて各データベースのテーブルから情報を結合しようとしています。リストを印刷するために情報をループする必要があります。

$sql= 
    "SELECT tableA.name, tableB.messages 
    FROM tableA INNER JOIN tableB ON tableA.id = tableB.id"; 

foreach ($db1->query($sql) as $row) { 
//HOW CAN I QUERY DB2?? 
    $id = $row['id']; 
    $name = $row['name']; 
    $msg= $row['messages']; 

    echo $name . "etc..."; 
} 

同じforeachループで結果を出力できるように、このコードを両方のPDOにクエリするにはどうしたらよいですか?

EDIT:tableBのIDとtableAのIDを一致させ、IDが一致したときにtableBのmsgフィールドの隣のtableAに名前フィールドを表示しようとしています。

答えて

0

foreachの条件の中で照会しないでください。最初のクエリ、および結果を参加:

// Assuming your two queries are $sql1 and $sql2 
// Unless both connections use the same SQL statement... 
$res1 = $db1->query($sql1); 
$res2 = $db2->query($sql2); 

$results = array_merge($res1, $res2); 
foreach ($results as $row) { 
    // echo the results 
} 
+0

感謝。しかし、メッセージの隣に対応するIDと名前が表示されるように、結果をどのようにマージしますか? – user1

+0

@ user1 2つのデータベースをまたいだテーブル関係があることを意味しますか? –

+0

@ user1もしそうなら、あなたは同時にそれらを照会する方が良いでしょう。私はこれがPDO接続で選択されているデータベースに関係なく動作するはずだと思う: 'SELECT db1.dbo.table.column1、db2.dbo.table.column2 FROM db1.dbo.table JOIN db2.dbo.table ON .... ' –

1

は、テーブルとテーブル

Db1table 
    id_1 
    name_1 
    message_1 

とDB2と、DB1を持っている(あなたが私達にあなたのDBスキーマを提供していないので)のは、想像してみましょう

Db2table 
    id_2 
    name_2 
    message_2 

各id_1は共通の対応するid_2を参照しています。たとえば array('id_1'=>1, 'name_1'=>'smth', 'message_1'=>'smth')array('id_2'=>1, 'name_2'=>'smth', 'message_2'=>'smth')と結合する必要があります(id_1 == id_2)。

だから、あなたが必要とするコードは次のとおりです。

# make a "indexed" hash by common id column for fast access 
$hash_by_id=array(); 
foreach($db2->query($sql2) as $row2){ 
    $hash_by_id[$row2['id_2']]=$row2; 
} 

foreach($db1->query($sql1) as $row1){ 
    $joined_row2=$hash_by_id[$row1['id_1']]; #pseudo-join 
    echo $joined_row2['id_2']==$row1['id_1'] # true 
    # from db1 
    echo $joined_row2['id_2']; 
    echo $joined_row2['name_2']; 
    echo $joined_row2['message_2']; 
    # from db2 
    echo $row1['id_1']; 
    echo $row1['name_1']; 
    echo $row1['message_1']; 
} 
+0

これは動作しているようですが、各IDに対して「通知:未定義インデックス:」が表示されています。 joined_rowがデータを取得していないようです。 名前とメッセージをエコーアウトする方法を教えてください。 – user1

+0

@ user1:私の答えを更新しました – seriyPS

関連する問題