2015-04-20 88 views
2

假設我有用戶數據庫和base_u_group默認值爲0,它們不在任何組下。更新選中的複選框數據並刪除未選中的數據

 
1)base_users 
|base_u_id|base_u_username|base_u_group| 
------------------------------------------ 
| 1 | username 1 |  0  | 
| 2 | username 2 | 2, 3, 4 | 
| 3 | username 3 |  4  | 
| 4 | username 4 | 3,5  | 

列出所有用戶。當屬於該編輯組時,將自動檢查$checkBox

echo "<tr>"; 
echo "<td>". $count .". ".$row_User['base_u_username']. "</td>"; 
echo "<td align=\"center\"><input type=\"checkbox\" class = \"group\" name=\"userList[]\" value=".$row_User['base_u_id']." ".$checkBox."/></td>"; 
echo "</tr>"; 

我的問題是如何插入選中的複選框的數據不重複,例如:
3, 3, 4, 5 --> 3, 4, 5
當複選框選中,將刪除該組中我base_u_group,例如選中的複選框用戶名2組3

2, 3, 4 --> 2, 4 


$gid表示選定的編輯組。 這是我做過什麼至今:

<?php 
$userGroup = $_POST['userList']; 

foreach($userGroup as $a) 
{ 
    $selSQL = base_executeSQL("SELECT * FROM base_users WHERE base_u_id='".$a."'"); 
    while($row_SQL = base_fetch_array($selSQL)) 
    if($row_SQL['base_u_group'] != "0") 
    {   
     $data = explode(", ",$row_SQL['base_u_group']); 
     for($i=0; $i<count($data);$i++) 
     { 
      //insert to user group if base_u_group does not find the group ID 
      if($gid <> $data[$i]) 
       base_executeSQL("UPDATE base_users SET base_u_group='".$gid. ", ". $row_SQL['base_u_group']."' WHERE base_u_id='".$a."'"); 
     } 
    } 
    //if the user does not belong to any groups: base_u_group = 0 
    else 
     base_executeSQL("UPDATE base_users SET base_u_group='".$gid."' WHERE base_u_id='".$a."'"); 
} 
?> 

編輯:刪除組

$data = explode(", ",$row_SQL['base_u_group']); 
$ok = true; 
for($i=0; $i<count($data);$i++) 
{ 
    //insert to user group if base_u_group does not find the group ID 
    if($gid == $data[$i]) 
    { 
     $arr = array_merge(array_diff($data,array($gid))); 
     $newArray = implode(", ",$arr);  
     base_executeSQL("UPDATE base_users SET base_u_group='".$newArray."' WHERE base_u_id!='".$row_SQL['base_u_id']."' AND base_u_domain='local'"); 
     $ok = false; 
    } 
} 
if (ok) base_executeSQL("UPDATE base_users SET base_u_group='".$gid. ", ". $row_SQL['base_u_group']."' WHERE base_u_id='".$a."'"); 

回答

1

如果你想堅持使用當前的數據庫設計的,那麼你的做法實際上是你可以做最簡單的。將這個邏輯轉移到MySQL將非常困難,並且對您的解決方案沒有任何優勢。似乎你的方法已經處理了你向用戶添加一個組所發佈的所有需求,並且刪除組的方式幾乎是相同的邏輯。

但是,我會強烈建議更改您的數據庫設計。完全刪除base_u_group列,並創建一個新表user_groups,其中有兩列user_idgroup_id。製作一個由兩者組成的獨特密鑰。現在要將一個組添加到該表中,並且該唯一鍵將阻止您將兩個相同的組插入。現在從組中刪除現在也像從表中刪除一樣簡單。要獲得用戶的所有組,只需執行SELECT group_id FROM user_groups WHERE user_id=$user_id(以及恰當的轉義或通過準備好的語句)。

您可能還會使user_id成爲當前表的外鍵,因此它不允許插入無效的user_id s。另外,如果您有一個表的組,則將user_groups中的外鍵添加到該表中也有助於避免無效的組ID。

編輯:顯然我誤解了你的問題的一部分。我以爲你已經有了一個可行的解決方案,並且正在尋求一個更好的解決方案。我可以立即看到您的解決方案,導致重複的問題,很容易解決,只需做如下修改代碼:

$data = explode(", ",$row_SQL['base_u_group']); 
    $ok = true; 
    for($i=0; $i<count($data);$i++) 
    { 
     //insert to user group if base_u_group does not find the group ID 
     if($gid == $data[$i]) $ok = false; 
    } 
    if (ok) base_executeSQL("UPDATE base_users SET base_u_group='".$gid. ", ". $row_SQL['base_u_group']."' WHERE base_u_id='".$a."'"); 

要知道爲什麼你的代碼是錯誤的,認爲會發生什麼,如果$data = {1, 2}$gid2(在這種情況下,您顯然不想添加它)。你迭代每個元素$data,所以在第一次迭代中你的$data[i]1。由於1 != 2,您更新表,並添加另一個2

隨着我的變化,我第一次迭代的data所有元素,並確保他們都不等於$gid,且僅當這是我跑的情況下一次查詢,最後追加$gid

不幸的是,你的代碼並不清楚你發出什麼樣的要求進行刪除,但邏輯是相似。你會每一個元素過去的data,如果他們中任何一個等於要刪除什麼,然後纔剛剛從data刪除它,然後從迴路斷線。然後implode您的data並使用UPDATE查詢將其存儲到數據庫中。

+0

謝謝。我明白你的觀點,這種方法非常有用,解決了我的問題。但有沒有其他解決方案,而不是由於不確定性和不可預測的風險而改變我的數據庫配置。 – Sollo

+0

你爲什麼不喜歡你目前的解決方案? – Ishamael

+0

我使用我上面提到的當前解決方案時遇到問題。我找不出解決我的問題的辦法。 – Sollo