0

PDO (mysql) を使用して 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());
    }
}
4

1 に答える 1

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()

考慮すべきことの 1 つは、例外が発生した場合の対処方法です。何度も挿入しているので、例外が発生しない場合PDO::beginTransation()は最初に使用し、例外が発生した場合は変更をキャンセルすることを検討してください。このようにして、すべてが転送されるか、何も転送されないことを確認できます。PDO::commit()PDO::rollBack()

于 2012-06-14T14:49:02.067 に答える