2013-10-24 145 views
0

基本上我有一個包含幾個複選框(屬於同一個組)的表單,這些是類別選擇。PHP/MySQL - 更新數據庫中的複選框選擇

當用戶想要更新他們的選擇時,他們可以查看此表單 - 已經有CURRENT選項打勾。

用戶然後更改他們的選擇並提交表單。我現在需要在數據庫中更新這些選擇。這裏是我此刻的代碼:

// $old_selections contains an ARRAY of IDs - I use this to pre-select the checkboxes 
$old_selections = Listing::getSelections(); 

if(isset($_POST['update'])) 
{ 
     // $_POST['selections'] is an ARRAY of posted IDs 
     $new_selections = $_POST['selections']; 

     foreach($new_selections as $selection) 
     { 
       // insert a new record using $selection 
     } 
} 

所以目前這增加了新的選擇到數據庫中,但不會刪除任何現有的。理想情況下,這應該有點聰明 - 而不是隻刪除所有現有的條目,它應該比較兩個數組,並根據需要刪除/插入。

此外,如果用戶剔除所有選擇,那麼顯然需要刪除所有現有條目。

什麼是最有效的實現方式?

+0

我認爲你的想法「過度」。我真的認爲先刪除所有條目會更有效,因爲那樣你就不必擔心比較了。 – bestprogrammerintheworld

回答

1

補充@ManZzup答案。

當您提交表單,更新可以做這樣的:

// You no longer need this 
// $old_selections = Listing::getSelections(); 

if(isset($_POST['update'])) 
{ 
    // $_POST['selections'] is an ARRAY of posted IDs 
    $new_selections = $_POST['selections']; 

    $list; 
    foreach($new_selections as $selection) 
    { 
     $list .= $selection + ","; 
    } 
    $list = substr($list, 0, strlen($list)); 

    $query = "DELETE FROM tablename WHERE selection_id NOT IN (" . $list .") AND user_id = " . $id; 
    mysqli_query($con, $query); 

    foreach($new_selections as $selection) 
    { 
     $query = "INSERT INTO tablename VALUES (" . $id . "," . $selection . ")"; 
     mysqli_query($con, $query); 
    } 
... 
} 

嘗試這樣的事情。

0

在這種情況下,我通常有一個帶有UserID,SelectionID和'Y'或'N'的單獨表格 - 或者更簡單的放下Y/N位,並假設是否有用戶/選擇對的記錄,他們已經勾選了它,如果沒有的話。

我刪除用戶X的所有記錄,當他們更新,並寫上新的記錄。有沒有點檢查是否一個記錄已經存在..

如果選項簡單,你甚至可以只儲存在用戶的記錄中的字符串 - 也許用|來分隔ID或類似的,所以他們很容易分裂出來。我只是重寫了這個記錄。

我更喜歡第一種方法,如果您需要以其他方式訪問數據 - 例如在這裏「找到所有選擇了選項x的用戶」 - 使用表格解決方案很容易。同樣,如果您在將來刪除其中一個選擇,您可以輕鬆地從表格中刪除具有該ID的所有記錄。

0

變化表結構有點

有一個單獨的表來存儲選項詳情 例如:

selection_id selection_name 
1   New Selection 

和另一個表,以保持其用戶加入該選擇 例如:表選擇

user_id selection_id 
10   1 

所以更新選擇意味着向表中添加新記錄並插入新記錄[simple sql功能可以使用]