【问题标题】:How do you join two PDO objects in the same foreach loop?如何在同一个 foreach 循环中加入两个 PDO 对象?
【发布时间】:2011-08-08 15:24:25
【问题描述】:

请原谅我,因为我是 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 中的 name 字段。

【问题讨论】:

    标签: php sql pdo


    【解决方案1】:

    让我们想象一下(因为您没有向我们提供您的数据库架构)您有 db1 和表

    Db1table
        id_1
        name_1
        message_1
    

    db2 和表

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

    【讨论】:

    • 这看起来像是在工作,但我收到了每个 id 的“通知:未定义索引:”。看起来joined_row 没有得到任何数据。你能告诉我如何呼出名字和信息吗?
    【解决方案2】:

    不要在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
    }
    

    【讨论】:

    • 谢谢。但是如何合并结果,以便在消息旁边显示相应的 id 和 name?
    • @user1 你的意思是你有跨两个数据库的表关系吗?
    • @user1 如果是这样,您最好同时查询它们。我认为无论在 PDO 连接中选择哪个数据库,这都应该有效:SELECT db1.dbo.table.column1, db2.dbo.table.column2 FROM db1.dbo.table JOIN db2.dbo.table ON ....
    • 我尝试实现此功能,但出现错误。您是否将选择调用为sql? IE: $sql = "SELECT db1.dbo.table.column1, db2.dbo.table.column2 FROM db1.dbo.table JOIN db2.dbo.table";如果是这样,您将查询哪个对象。为了澄清我的帖子:我试图将 tableA 中的 ID 与 tableB 中的 ID 匹配,然后当 ID 匹配时,在 tableB 中的 msg 字段旁边打印 tableA 中的 name 字段。非常感谢您的帮助。
    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多