2015-04-20 2 views
2

Предположим, у меня есть пользователей база данных и base_u_group default будет 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 из группы

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."'"); 
} 
?> 

EDIT: удаление групп

$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_id и group_id. Сделайте уникальный ключ, состоящий из обоих из них. Теперь добавьте группу, только INSERT в эту таблицу, и уникальный ключ не позволит вам вставить одну и ту же группу дважды. Удаление из группы теперь также столь же тривиально, как удаление из этой таблицы. Чтобы получить все группы для пользователя, просто выполните SELECT group_id FROM user_groups WHERE user_id=$user_id (ну, с правильным экранированием или с помощью подготовленного оператора).

Вы также можете сделать user_id внешним ключом к вашей текущей таблице, чтобы он не разрешал вставлять неверные user_id s. Кроме того, если у вас есть таблица для групп, добавление внешнего ключа из user_groups в эту таблицу поможет избежать недопустимых идентификаторов групп.

EDIT: По-видимому, я неправильно понял часть вашего вопроса. Я думал, что у вас уже есть рабочее решение, и они просили лучшего. Я могу сразу увидеть проблему в вашем решении, которое вызывает дубликаты, это легко исправить, просто внести следующие изменения в код:

$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} и $gid - 2 (в этом случае вы, очевидно, не хотите его добавлять). Вы перебираете каждый элемент $data, поэтому на первой итерации ваш $data[i] - 11 != 2, вы обновите таблицу и добавить еще 2 в конце

С моими изменениями, я первый перебрать все элементы data, и убедитесь, что ни один из них не равно $gid, и только если это так я бегу запрос один раз для добавления $gid в конце.

К сожалению, из вашего кода неясно, какой запрос вы высылаете для удаления, но логика будет аналогичной. Вы бы прошли каждый элемент data, и если какой-либо из них равен тому, что вы хотите удалить, просто удалите его с data и перерыв из цикла. Затем implode ваш data и сохраните его в базе данных с запросом UPDATE.

+0

спасибо. Я получил вашу мысль, и этот метод действительно полезен и решает мою проблему. Но есть ли какие-либо другие решения вместо изменения конфигурации моей базы данных из-за неопределенности и непредсказуемого риска. – Sollo

+0

Почему вам не нравится ваше текущее решение? – Ishamael

+0

У меня проблемы с использованием моего текущего решения, которое было указано выше. Я не могу решить какое-либо решение моих проблем. – Sollo

Смежные вопросы