2017-07-09 39 views
3

我有一個用戶窗體設置單個記錄「當前」。一次只能將一條記錄設置爲最新。因此,我向用戶展示一個下拉列表,他們選擇他們想要設置當前的項目,並在窗體底部點擊「更新」。如何在執行查詢後使用mysqli/php更新所有記錄?

的PHP/mysqli的需要去和所有記錄欄「當前」設置爲0的值,然後更新表單中的一個「1」的值。

起初,我只是做了簡單的計算行數,並運行了一堆查詢到列更新爲0或1,如果循環計數器=該行的ID。那麼......當我開始在其他部分進行測試並且索引數字高於行總數時,這種情況很快就破裂了。是的,愚蠢的做法,最初!

這就是我試圖與PHP/MySQL代碼:

// $link is the database link defined elsewhere. This does work as I use it all over the place 
 
$setCurrent = X; // This is the number passed from my form 
 

 
$init_query = "SELECT id, current FROM myTable"; 
 

 
if ($stmt = $link->$prepare($init_query) { 
 
    $stmt->execute() or die ($stmt->error); 
 
    $stmt ->bind_result($id, $current) 
 
    while ($stmt->fetch()){ 
 
    if ($id == $setCurrent){ 
 
    
 
    $update_sql = "UPDATE myTable SET current ='1' WHERE id='".$setCurrent."'"; 
 
    $stmt2 = $link->prepare($update_sql); 
 
    $stmt2->execute; 
 
    
 
    } 
 
    
 
    else { 
 
    $update_sql = "UPDATE myTable SET current ='0' WHERE id='".$id."'"; 
 
    $stmt2 = $link->prepare($update_sql); 
 
    $stmt2->execute; 
 
} 
 
$stmt->close();

這種失敗,給了我一個致命錯誤:未捕獲的錯誤:調用一個成員函數執行布爾在.....

我傷透我的大腦在這個並不能弄清楚到底是怎麼回事。自從我在PHP/MySql中工作了幾年後,這是我第一次寫入OO Mysqli。請溫柔:)

+0

可以方便您的腳本無法提線。哪個查詢給出錯誤? –

+0

這可能是prepare()中額外的$? –

+0

我調換了來自不同系統的代碼。該語法適用於開發系統。額外的$和curleys只是胖胖的指法。 – user3723090

回答

1

你就失去了右大括號。一個用於第一if(),另一個用於while()

1

爲什麼他們一次一個?你能做到在一個查詢

$setCurrent = X; 
$query = 'UPDATE myTable 
      SET `current` = (id = :current)'; 
$stmt = $link->prepare($query); 
$stmt->bindValue(':current', $setCurrent); 
$stmt->execute(); 

(和濫用的事實,如果ID等於$的setCurrent之間的部分()解析爲真,這是1)

一些解釋:

SELECT 10=10;會給出一種「真」。但隨着MySQL不給真實的,它給1 也是如此:

SELECT 10=20;這是假的,所以給你0

現在回到你的查詢:你想獲得一個0值所有記錄的id不等於某個數字。並且在相等時需要1: 因此,您必須將列ID的值與$ setCurrent進行比較。當它們匹配時,您得到1,然後將該1放入「當前」列中 當它們不匹配時,所有其他情況下,則會得到0,並且0將進入列Current。

是的,這也可以這樣做的:

UPDATE mytable 
SET `current` = CASE id 
       WHEN $setCurrent THEN 1 
       ELSE 0 
       END CASE 

或使用IF, 但他們其他的語法方式較短

編輯 backtics需要周圍的列名,因爲目前的是保留字

+0

你可以提供更多的上下文'(和濫用的事實,如果ID等於$ setCurrent,之間的部分解決爲真,這是1.)「 – user3723090

+0

我的表設置,使得 ID,名稱,日期,目前 該表單提供了一個下拉菜單,以便用戶可以找到「名稱」,並說,這就是我想要的最新!去! 表單處理程序採取與該名稱關聯的ID並將其傳遞給整體功能,將與該id的'current'列關聯的行設置爲值1,然後將所有其他行的當前列設置爲「0」 – user3723090

+0

@ user3723090我在上面添加了一些解釋 –

相關問題