2012-07-11 58 views
1

這裏的陣列我通過POST得到,運行插入在重複的更新與爲每個陣列

Array 
(
    [event_id] => 1 
    [fights] => Array 
     (
      [0] => Array 
       (
        [fight_id] => 1 
        [fighter_a_id] => 1 
        [fighter_b_id] => 2 
        [winner_id] => 
       ) 

      [1] => Array 
       (
        [fight_id] => 2 
        [fighter_a_id] => 4 
        [fighter_b_id] => 3 
        [winner_id] => 3 
       ) 

     ) 

) 

這裏是我現在想要的PHP代碼,但它返回23000 PDO錯誤,我不明白。我讀到這是一個重複的輸入錯誤,但這不應該與ON DUPLICATE KEY UPDATE發生。我認爲foreach可能會導致錯誤?有什麼建議麼?

if (isset($_POST['fights'])){ 
    $event_id = $_POST['event_id']; 
    foreach ($_POST['fights'] as $field){ 
     if ($field['fight_id'] != '') $fight_id = $field['fight_id']; else $fight_id = ''; 
     if ($field['fighter_a_id'] != '') $fighter_a_id = $field['fighter_a_id']; else $fighter_a_id = ''; 
     if ($field['fighter_b_id'] != '') $fighter_b_id = $field['fighter_b_id']; else $fighter_b_id = ''; 
     if ($field['winner_id'] != '') $winner_id = $field['winner_id']; else $winner_id = ''; 
     $set_fights = $DBH->prepare(' 
     INSERT INTO 
      fights (
       fight_id, 
       fighter_a, 
       fighter_b, 
       winner, 
       event   
       ) 
     VALUES (
      :fight_id, 
      :fighter_a, 
      :fighter_b, 
      :winner, 
      :event 
     ) 
     ON DUPLICATE KEY UPDATE 
      fighter_a = :fighter_a, 
      fighter_b = :fighter_b, 
      winner = :winner, 
      event = :event 
     '); 
     $set_fights->bindParam(':fight_id', $fight_id, PDO::PARAM_INT); 
     $set_fights->bindParam(':fighter_a', $fighter_a, PDO::PARAM_INT); 
     $set_fights->bindParam(':fighter_b', $fighter_b, PDO::PARAM_INT); 
     $set_fights->bindParam(':winner', $winner, PDO::PARAM_INT); 
     $set_fights->bindParam(':event', $event_id, PDO::PARAM_INT); 
     $set_fights->execute(); 
    } 
} 
try { 

} 
catch (PDOException $e) { 
    echo $e->getMessage(); 
} 
+1

你能告訴我們關於表的結構?哪些字段是關鍵字,哪些是唯一的? – 2012-07-11 01:03:56

+0

@JohnC fight_id是獨一無二的。 Event,fighter_a,fighter_b和winner都是不同表格的外鍵。這四個字段在這些不同的表格中也是獨一無二的,但這不應該影響它。 – zen 2012-07-11 01:23:05

回答

0

我認爲你需要使用LAST_INSERT_ID這樣的:

INSERT INTO fights (fight_id, fighter_a, fighter_b, winner, event) 
VALUES (:fight_id, :fighter_a, :fighter_b, :winner, :event) 
ON DUPLICATE KEY UPDATE 
    fight_id = LAST_INSERT_ID(fight_id), 
    fighter_a = :fighter_a, 
    fighter_b = :fighter_b, 
    winner = :winner, 
    event = :event 
+0

謝謝。我補充說,但沒有區別。我正在另一個地方運行一個類似的INSERT ... UPDATE ON DUPLICATE查詢,它工作正常。但主要區別在於它只添加/更新1行,而這是一次完成多個操作。 – zen 2012-07-11 02:33:53