2013-03-30 30 views
0

我在這個網頁上了解到,foreach是快速的,對數據庫的查詢不是。所以我試圖做一個UPDATE查詢,但它不工作:我試圖不要讓與foreach犯同樣的錯誤,但現實不會讓我(拉霍伊風格)

$array = ''; 
foreach ($myar as $key => $value) { 
    $array .= " (name='$value' WHERE lid='$key'), "; 
} 

$link1 = $db->prepare("UPDATE leyes SET $array"); 
$link1->execute(); 

我得到一個錯誤:致命錯誤:未捕獲的異常「PDOException」有消息「SQLSTATE [42000]:語法錯誤或訪問衝突:1064您在您的SQL語法錯誤

一個解決方案:

$array = ''; 

    foreach ($myarr as $key => $value) { 
     $array .= " WHEN '$key' THEN '$value' "; 
    } 
    $array .= " ELSE name 
    END"; 

    $link1 = $db->prepare("UPDATE table SET name = CASE id $array"); 
    $link1->execute(); 
+3

如果你使用準備好的語句*它不工作*是沒有問題的一個非常有用的描述... – Quasdunk

+0

,實際上__use__準備的語句,而不是建立一個SQL語句字符串 –

+0

這似乎不是正確的語法。你可以在UPDATE語句中只有一個WHERE子句:http://dev.mysql.com/doc/refman/5.0/en/update.html – Quasdunk

回答

0

我以前從來沒有見過這種語法的UPDATE的,我有以確定我懷疑它不會那樣工作。據我所知,你不能在UPDATE中使用多個WHERE子句。你不能在一個聲明中做你正在尋找的東西。

也就是說,您可以使用優化策略。從這裏開始: http://www.kavoir.com/2009/05/mysql-update-multiple-rows-with-one-single-query.html

+0

謝謝!我在搜索一個解決方案的網絡中看到這個語法:S –

0

嘗試像

$array = ''; 
$i = 1; 
foreach ($myar as $key => $value) { 
    $array .= " name='$value' WHERE lid='$key'"; 
    if(count($myar) != $i++) 
     $srray .= ','; 
} 
$link1 = $db->prepare("UPDATE leyes SET $array"); 
$link1->execute(); 

我覺得你有額外的問題「」在過去的Where語句

+0

它工作嗎? – Gautam3164

+0

它沒有工作,同樣的錯誤:致命錯誤:帶有消息'SQLSTATE [42000]的未捕獲異常'PDOException':語法錯誤或訪問衝突:1064您的SQL語法中有錯誤 –

0

只有加入這一行

$array = ''; 
foreach ($myar as $key => $value) { 
    $array .= " (name='$value' WHERE lid='$key'), "; 
} 

//Add this 
$array = substr($array, 0, -2); 

$link1 = $db->prepare("UPDATE leyes SET $array"); 
$link1->execute(); 
+0

此行將刪除最後一個逗號和空間無需檢查每次迭代中的條件 –

+0

我的答案是代碼少的替代方案 –

+0

它不起作用,同樣的錯誤。 –

相關問題