Как соединить два объекта PDO в одном цикле foreach? - PullRequest
2 голосов
/ 08 августа 2011

Простите меня, потому что я новичок в PDO.Я не уверен, есть ли простое решение.Я искал в Интернете в течение некоторого времени и до сих пор не нашел ответа.

У меня есть две разные базы данных, к которым я подключаюсь.

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

Я пытаюсь объединить информацию из таблицы в каждой базе данных на основе общего идентификатора.Мне нужно просмотреть информацию, чтобы распечатать список.

$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?

EDIT: я пытаюсь сопоставить идентификатор в таблице Aс идентификатором в tableB, а затем напечатайте поле имени в tableA рядом с полем msg в tableB, когда идентификаторы совпадают.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Давайте представим (поскольку вы не предоставляете нам свою схему БД), что у вас есть 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'];
}
0 голосов
/ 08 августа 2011

Не запрашивать внутри условия 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...