2012-06-14 75 views
0

我正在使用PDO(mysql)創建2個不同的數據庫連接。我想在一個不同的數據庫中將一行數據從一個錶轉移到另一個表。這不是行的重複,只有特定的行被選中。使用PDO在2個不同的數據庫中重複行

我無法得到它的工作,任何想法?

private function moveCallToProduction() { 
    try { 
     $sql = "SELECT * FROM `calls` WHERE `id`=':id'"; 
     $query = $this->staging->prepare($sql); 
     $query->execute($array); 
     $results = $query->fetchAll(PDO::FETCH_ASSOC); 
     try { 
      $sql = "INSERT INTO `calls` (`id`,`sip_id`,`extension`,`caller_id`,`stage`,`status`,`survey_id`,`start`,`answer`,`hangup`,`end`) VALUES ('?','?','?','?','?','?','?','?','?','?','?')"; 
      $query = $this->production->prepare($sql); 
      $query->execute($results); 
     } 
     catch(PDOException $e) { 
      $this->informer("FATAL","There was a problem"); 
     } 

    } 
    catch(PDOException $e) { 
     $this->informer("FATAL","We're unable to transport the call from the staging to production server. Error: ".$e->getMessage()); 
    } 
} 

回答

5

fetchAll()返回一個包含所有結果集行的數組。您需要遍歷每行並單獨插入。例如:

... 
$sql = "SELECT * FROM `calls` WHERE `id`=':id'"; 
$query = $this->staging->prepare($sql); 
$query->execute($array); 
$results = $query->fetchAll(PDO::FETCH_ASSOC); 
foreach($results as $row) { 
    try { 
     $sql = "INSERT INTO `calls` (`id`,`sip_id`,`extension`,`caller_id`,`stage`,`status`,`survey_id`,`start`,`answer`,`hangup`,`end`) VALUES ('?','?','?','?','?','?','?','?','?','?','?')"; 
     $query = $this->production->prepare($sql); 
     $query->execute($row); 
    } 
    catch(PDOException $e) { 
     $this->informer("FATAL","There was a problem"); 
    } 
} 
... 

您還可以使用作者聲明:while($result = $query->fetch(PDO::FETCH_ASSOC))代替fetchAll()遍歷結果,而無需將它們存儲在內存中。

要考慮的一件事就是如果遇到異常,你想要做什麼。由於您要插入很多次,因此您可以考慮在開始時使用PDO::beginTransation(),如果沒有發生異常,則使用PDO::commit(),如果發生異常,則使用PDO::rollBack()取消所有更改。通過這種方式,你可以確定一切都轉移或者什麼都不轉移。

相關問題