2012-06-14 2 views
0

Я использую PDO (mysql) для создания двух разных соединений с базой данных. Я хочу передать строку данных из одной таблицы в другую в другой базе данных. Это не дублирование строки, выбраны только определенные строки.Дублирующие строки в двух разных базах данных с использованием PDO

Я не могу заставить его работать, любые идеи?

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(), чтобы отменить любые изменения, если произошло исключение. Таким образом, вы можете быть уверены, что все переносит или ничего не делает.

Смежные вопросы