2013-10-23 150 views
0

我正在使用MySQL查詢插入,或更新記錄(如果它已存在)。INSERT ... ON DUPLICATE KEY UPDATE - 不更新特定字段?

問題是,我不想更新我的'created' datetime字段。

我的事件數據:

$event = [ 
    'userId'  => $this->userId, 
    'googleEventId' => $googleEventId, 
    'isAppointment' => $isAppointment, 
    'eventTitle'  => $title, 
    'eventLocation' => $location, 
    'eventDescription' => $description, 
    'eventStart' => $start, 
    'eventEnd'  => $end, 
    'created'  => date('Y-m-d H:i:s'), // This field should be ignored when updating 
    'updated'  => date('Y-m-d H:i:s') 
]; 

我使用這個功能來插入,或插入更新的重複鍵($update參數):

public function insert($table, $data, $update = 0) 
{ 
    ksort($data); 

    $fieldNames = implode(', ', array_keys($data)); 
    $fieldValues = ':' . implode(', :', array_keys($data)); 

    $updateOnDuplicate = ''; 

    if ($update) 
    { 
     $updateOnDuplicate = ' ON DUPLICATE KEY UPDATE '; 

     foreach ($data as $key=> $value) { 
      $updateOnDuplicate .= "$key=:$key,"; 
     } 
     $updateOnDuplicate = rtrim($updateOnDuplicate, ','); 
    } 

    $stmt = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues) $updateOnDuplicate"); 

    foreach ($data as $key => $value) 
    { 
     $stmt->bindValue(":$key", $value); 
    } 

    $stmt->execute(); 

    return $stmt->rowCount(); 
} 

我想我需要檢測莫名其妙地在這個函數裏面有'created'字段。

+0

獲取已存儲的信息,然後將該值作爲更新後的值 – NoLiver92

+0

表中您嘗試插入的鍵和您當前擁有的INSERT語句? – Ashalynd

+0

未更新($ event [$ created])?你如何強制你的查詢..我們不能猜到看到只有1陣列..顯示查詢如何 – Svetoslav

回答

3

if($key!='created'){}聲明是解決方案,

public function insert($table, $data, $update = 0) 
{ 
    ksort($data); 

    $fieldNames = implode(', ', array_keys($data)); 
    $fieldValues = ':' . implode(', :', array_keys($data)); 

    $updateOnDuplicate = ''; 

    if ($update) 
    { 
     $updateOnDuplicate = ' ON DUPLICATE KEY UPDATE '; 

     foreach ($data as $key=> $value) { 
      if($key!='created'){ // Here you can do what you want 
      $updateOnDuplicate .= "$key=:$key,"; 
      } // Here you can do what you want 
     } 
     $updateOnDuplicate = rtrim($updateOnDuplicate, ','); 
    } 

    $stmt = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues) $updateOnDuplicate"); 

    foreach ($data as $key => $value) 
    { 
     $stmt->bindValue(":$key", $value); 
    } 

    $stmt->execute(); 

    return $stmt->rowCount(); 
} 
現在

,您可以運行此修復程序代碼。祝你好運

相關問題