0

そのため、選択した行をあるテーブルから別のデータベースの別のテーブルに「移動」しようとしています。

理論的には機能します(ただし、誰かが意見を述べたい場合は、私はPDOを初めて使用します。ただし、「SQLSTATE [HY000]:一般エラー」エラーが発生し続けます。

何かアドバイス?

  private function broken() {
    try {
        $sql = "SELECT * FROM `calls` WHERE `calls`.`status`=0 AND `calls`.`stage` < 4 AND `calls`.`answer` < (NOW() + INTERVAL 10 MINUTE)";
        $query = $this->staging->query($sql);
        while($row = $query->fetch(PDO::FETCH_ASSOC)) {

            // Insert in production database:
            $sql = "INSERT INTO `ivr_incomplete` (`id`,`sip_id`,`extension`,`caller_id`,`stage`,`status`,`survey_id`,`start`,`answer`,`hangup`,`end`) VALUES (:id, :sip_id, :extension, :caller_id, :stage, :status, :survey_id, :start, :answer, :hangup, :end)";
            $query = $this->production->prepare($sql);
            $query->execute($row);

            // Delete from staging:
            $sql = "DELETE FROM `calls` WHERE `id`='".$row['id']."'";
            $this->staging->query($sql);

        }
    }
    catch(PDOException $e) {
        $this->informer("FATAL", "Unable to process broken IVR surveys. Error: ".$e->getMessage());
    }
}
4

1 に答える 1

2

2 つのポイント:

  1. 繰り返しごとに準備しINSERTています。これにより、準備されたステートメントを使用するポイントの半分が排除されます-使用しているのはエスケープだけです。プリペアド ステートメントのポイントの 1 つは、クエリが 1 回だけ解析されることです。そのため、同じクエリを異なる値で繰り返し実行する必要がある場合は、prepare()1 回呼び出してから別のデータ セットで呼び出すだけexecute()で、パフォーマンスが大幅に向上します。

  2. このすべてを 2 つのクエリで実行できます: 2 つの別個の DB 接続を使用するため削除されました

編集

このコードを試してください:

操作全体を中断INSERTし、正常に処理された行をソーステーブル。

private function broken() {

    try {

        // Fetch records to move
        $sql = "
          SELECT *
          FROM `calls`
          WHERE `status` = 0
            AND `stage` < 4
            AND `answer` < (NOW() + INTERVAL 10 MINUTE)
        ";
        $query = $this->staging->query($sql);
        if (!$query) {
            $errorInfo = $this->staging->errorInfo();
            throw new Exception("MySQL error at SELECT: $errorInfo[1] ($errorInfo[0]): $errorInfo[2]");
        }

        // Prepare the INSERT statement
        $sql = "
          INSERT INTO `ivr_incomplete`
            (`id`,`sip_id`,`extension`,`caller_id`,`stage`,`status`,`survey_id`,`start`,`answer`,`hangup`,`end`)
          VALUES
            (:id, :sip_id, :extension, :caller_id, :stage, :status, :survey_id, :start, :answer, :hangup, :end)
        ";
        if (!$stmt = $this->production->prepare($sql)) {
            $errorInfo = $this->production->errorInfo();
            throw new Exception("MySQL error at prepare INSERT: $errorInfo[1] ($errorInfo[0]): $errorInfo[2]");
        }

        // A list of the row IDs we are working with
        $rowIds = array();

        // Loop the results and insert them
        for ($i = 1; $row = $query->fetch(PDO::FETCH_ASSOC); $i++) {

            if (!$stmt->execute($row)) {
                $errorInfo = $stmt->errorInfo();
                throw new Exception("MySQL error at INSERT row $i (id: {$row['id']}): $errorInfo[1] ($errorInfo[0]): $errorInfo[2]");
            }

            $rowIds[] = (int) $row['id'];

        }

        // Delete from staging:
        if ($rowIds) {

            $sql = "
              DELETE FROM `calls`
              WHERE `id` IN (".implode(', ', $rowIds).")
            ";
            if (!$this->staging->query($sql)) {
                $errorInfo = $this->staging->errorInfo();
                throw new Exception("MySQL error at DELETE: $errorInfo[1] ($errorInfo[0]): $errorInfo[2]");
            }

        }

    } catch(PDOException $e) {

        $this->informer("FATAL", "Unable to process broken IVR surveys (PDO). Error: ".$e->getMessage());

    } catch (Exception $e) {

        $this->informer("FATAL", "Unable to process broken IVR surveys (MySQL). Error: ".$e->getMessage());

    }

}
于 2012-06-18T12:25:40.663 に答える