Wie kann ich ON DUPLICATE KEY UPDATE in PDO mit MySQL verwenden?

EINZELHEITEN

Ich mache eine einzelne Beilage für den Ablauf einer neuen oder erneuerten Lizenz. Die Frist für das Ablaufen beträgt 2 Jahre ab dem Datum der Einfügung. Wenn ein Duplikat erkannt wird, wird der Eintrag so aktualisiert, dassDer Verfall entspricht dem verbleibenden Verfall plus 2 Jahre.

In Bezug auf Duplikate sollte es im folgenden Beispiel nur eine Zeile geben, die user_id = 55 und license = commercial enthält.

TABELLE: licence_expiry

--------------------------------------------------------
|   user_id   |   licence   |           expiry         |  
--------------------------------------------------------
|     55      |  commercial |     2013-07-04 05:13:48  |  
---------------------------------------------------------

user_id (int11), license (varchan50), expiry (DATETIME)

Ich denke, in MySQL würden Sie so etwas schreiben. (Bitte beachten Sie, dass ich nicht überprüft habe, ob der Code in MySQL funktioniert.)

INSERT INTO `licence_expiry`
(`user_id`, `licence`, `expiry`)
VALUES
(55, commercial, NOW()+ INTERVAL 2 YEAR)
ON DUPLICATE KEY UPDATE
`expiry` = `expiry` + INTERVAL 2 YEAR

FRAGE: Wie kann ich das mit PDO machen? Ich habe einen groben Überblick darüber geschrieben, was ich meiner Meinung nach verwenden werde, bin mir aber nicht sicher, was ich für den Ablaufwert für das schreiben sollON DUPLICATE KEY UPDATE.

$sql = "INSERT INTO $table (user_id, licence, expiry)
                        VALUES (
                        :user_id,  
                        :licence,
                        :expiry)
    ON DUPLICATE KEY UPDATE expiry = Something"; 


try {
    $dbh = new PDO('login info here');
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':user_id', $userID, PDO::PARAM_INT);     
    $stmt->bindParam(':licence',$licence, PDO::PARAM_STR);
    $stmt->bindParam(':expiry',$expiry, PDO::PARAM_STR);                            
    $stmt->execute();
    //$stmt->closeCursor(); //use this instead of $dbh = null   if you will continue with another DB function
    $dbh = null; 
    }

    catch(PDOException $e)
    {
    $error=$e->getMessage();        
    }

Jede Hilfe wird sehr geschätzt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage