2013-10-23 76 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(); 
} 
现在

,您可以运行此修复程序代码。祝你好运

相关问题