如何在同一个foreach循环中连接两个PDO对象?

时间:2011-08-08 15:24:26

标签: php sql pdo

原谅我,因为我是PDO的新手。我不确定是否有简单的解决方案。我已经在网上搜索了一段时间,还没有找到答案。

我有两个不同的数据库,我正在连接。

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...";
}

如何修改此代码以查询两个PDO,以便它可以在同一个foreach循环中打印出结果?

编辑:我正在尝试将tableA中的ID与tableB中的ID匹配,然后在ID匹配时在tableB中的msg字段旁边的tableA中打印名称字段。

2 个答案:

答案 0 :(得分:1)

让我们想象一下(因为你没有向我们提供你的数据库模式)你有db1 with table

Db1table
    id_1
    name_1
    message_1

和db2 with table

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'];
}

答案 1 :(得分: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
}