2012-10-11 223 views
1

所以我看過HERE,但它似乎有點令人費解,因爲我正在做的簡單。最多我會處理一百個項目來更新(和大部分時間它的將是更喜歡40)使用PHP在一個SQL查詢中執行多個UPDATE

目前,我有這樣的事情

$sql_update = ''; 
for($x = 0; $x < count($nodes); $x++){ 
    if($nodes[$x]['loaded'] == 'true'){ 
    if($nodes[$x]['changed'] == 'true'){ 
     $sql_update .= 'UPDATE `genetic_decomp`.`tbl_node2view` SET `x` = "'.$nodes[$x]['location']['x'].'", `y` = "'.$nodes[$x]['location']['y'].'" WHERE `tbl_node2view`.`id` = "'.$nodes[$x]['id'].'";'; 
     $sql_update .= 'UPDATE `genetic_decomp`.`tbl_nodes` SET `name` = "'.$nodes[$x]['name'].'", `type` = "'.$nodes[$x]['type'].'" WHERE `tbl_nodes`.`node_id` = "'.$nodes[$x]['id'].'";'; 
    } 
    } 
} 
if($sql_update != ''){ 
    $sql_result=mysql_query($sql_update,$connection) or exit("Sql Error".mysql_error()); 
} 

現在,當我把它打印出來的輸出,在短短的echo $sql_update然後將輸出粘貼到在MAMP中的SQL框它工作正常..通過並更新兩個表中的行我想要

然而,當我運行上面的代碼它吐出回:

Sql Error 
You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE `genetic_decomp`.`tbl_nodes` SET `name` = "lala", `type` = "p" WHERE `tbl' at line 1 

我到底做錯了什麼? 有沒有更好的方法來做到這一點?

回答

4

你的SQL看起來在語法上是正確的(除非我錯過了一些簡單的東西)。實際的問題是因爲您使用的是mysql_query() - 其中不支持多條語句;支持多條語句;因此,您無法使用此方法在一個查詢中運行兩個UPDATE查詢。

從手冊:

的mysql_query()發送一個唯一的查詢(多個查詢不 支持)

在同一個音符時,mysql_方法正在過時,所以我(和社區)會建議您更新代碼以使用mysqli_PDO方法 - 這兩種方法都支持在單個語句中執行多個查詢。

如果您需要堅持使用mysql_query()(而不是重構您的整個應用程序),只需拆分查詢並將其連續運行即可。

+0

感謝,我說好的意識到有從mysql_方法的轉移,mysqli_確實看起來好多了,我可以做到這一點 – haxxxton

+0

非常感謝!我使用'mysqli_multi_query'爲我完成工作! –

0

如果您使用的是mysql_query,則需要單獨更新它們。

0

作爲一種替代的mysqli我發現這一點: http://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a-single-sql-query/

的想法

UPDATE categories 
    SET display_order = CASE id 
     WHEN 1 THEN 3 
     WHEN 2 THEN 4 
     WHEN 3 THEN 5 
    END, 
    title = CASE id 
     WHEN 1 THEN 'New Title 1' 
     WHEN 2 THEN 'New Title 2' 
     WHEN 3 THEN 'New Title 3' 
    END 
WHERE id IN (1,2,3) 

活生生的例子

// An array containing the category ids as keys and the new positions as values 
$display_order = array(
    1 => 4, 
    2 => 1, 
    3 => 2, 
    4 => 3, 
    5 => 9, 
    6 => 5, 
    7 => 8, 
    8 => 9 
); 

$ids = implode(',', array_keys($display_order)); 
$sql = "UPDATE categories SET display_order = CASE id "; 
foreach ($display_order as $id => $ordinal) { 
    $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); 
} 
$sql .= "END WHERE id IN ($ids)"; 
echo $sql; 

我的情況下

什T I如陣列接收

Array 
(
    [0] => stdClass Object 
     (
      [movement_id] => 278 
      [leg_miles] => 3.5 
      [leg_km] => 5.63 
     ) 

    [1] => stdClass Object 
     (
      [movement_id] => 279 
      [leg_miles] => 
      [leg_km] => 
     ) 

    [2] => stdClass Object 
     (
      [movement_id] => 280 
      [leg_miles] => 
      [leg_km] => 
     ) 

) 

我的功能(有工作與sprintf的彩車)

//get ids string 
    $ids = ""; 
    foreach ($movementsData as $movement) { 
     $ids .= $movement->movement_id.","; 
    } 
    $ids = rtrim($ids, ","); 

    //MySQL query construct 
    $sql = "UPDATE movements SET movement_miles = CASE movement_id "; 

    foreach ($movementsData as $movement) { 
     $sql .= sprintf("WHEN %d THEN %.2f ", $movement->movement_id, $movement->leg_miles); 
    } 

    $sql .= "END, "; 

    $sql .= "movement_km = CASE movement_id "; 

    foreach ($movementsData as $movement) { 
     $sql .= sprintf("WHEN %d THEN %.2f ", $movement->movement_id, $movement->leg_km); 
    } 

    $sql .= "END "; 

    $sql .= "WHERE movement_id IN (".$ids.")"; 

最終查詢結果

UPDATE movements SET 
    movement_miles = CASE movement_id 
     WHEN 278 THEN 3.50 
     WHEN 279 THEN 0.00 
     WHEN 280 THEN 0.00 
    END, 
    movement_km = CASE movement_id 
     WHEN 278 THEN 5.63 
     WHEN 279 THEN 0.00 
     WHEN 280 THEN 0.00 
    END 
    WHERE movement_id IN (278,279,280) 
相關問題