2013-07-02 110 views
4

我有2个不同的数据库(我可以访问这两个数据库),并且它们有一个具有相同结构的表。这是一张名为events的表格。我想连接到这两个数据库并从events获得结果,因此我可以显示日期是否大于或等于今天。PDO在一个查询中使用2个数据库连接

$db1 = new PDO('mysql:host='.$db_host1.';dbname='.$db_name1,$db_username1,$db_pass1); 
$db2 = new PDO('mysql:host='.$db_host2.';dbname='.$db_name2,$db_username2,$db_pass2); 

$db1->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
$db2->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 

$today = date("Y-m-d"); 
$stmt1 = $db1->query("SELECT * FROM events WHERE event_start >= $today ORDER BY event_start ASC"); 
$stmt2 = $db2->query("SELECT * FROM events WHERE event_start >= $today ORDER BY event_start ASC"); 

//this works for only one of the database. in this case $stmt1 which connects to db1 
while($row = $stmt1->fetch()) { 
//echo'd data will go here 
} 
+1

为什么不把所有数据放在一个数据库的一个表中? –

回答

5

做这里你试图做的最好的方法是创建第三个数组来合并结果然后使用它。像这样:

$db1 = new PDO('mysql:host='.$db_host1.';dbname='.$db_name1,$db_username1,$db_pass1); 
$db2 = new PDO('mysql:host='.$db_host2.';dbname='.$db_name2,$db_username2,$db_pass2); 

$db1->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
$db2->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 

$today = date("Y-m-d"); 
$query = "SELECT * FROM events WHERE event_start >= $today ORDER BY events ASC"; 
$stmt1 = $db1->query($query); 
$stmt2 = $db2->query($query); 

$results = array_merge($stmt1->fetchAll(PDO::FETCH_ASSOC), $stmt2->fetchAll(PDO::FETCH_ASSOC)); 

// Then sort the new array, perhaps something like this 
$events = array(); 
foreach ($results as $key => $row){ 
    $events[$key] = $row['events']; 
} 

array_multisort($key, SORT_ASC, $results); 

print_r($results); 

我不确定您在您的活动字段中排序的内容;但是,按照相同的标准来订购新的$ results数组应该相对容易。查看PHP Array Sorting以获得适当的排序算法。

+0

不错,也许使用$查询变量更好的编程习惯? – eatonphil

+0

$ query =“SELECT * FROM events WHERE event_start> = $ today ORDER BY events ASC” – eatonphil

-1

您可能想要做好准备的陈述。但是,您可以在查询后根据需要合并结果。下面的示例(未经测试):

$stmt1 = $db1->query("SELECT * FROM events WHERE event_start >= :today ORDER BY events ASC"); 
$stmt2 = $db2->query("SELECT * FROM events WHERE event_start >= $today ORDER BY events ASC"); 
$combined = array_merge($stmt1->fetchAll(PDO::FETCH_ASSOC), $stmt2->fetchAll(PDO::FETCH_ASSOC)); 

ksort($combined); // or some other ordering, maybe on date key? 

foreach($combined as $record) { 
    // use $record['column'] access 
}