2013-10-24 104 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功能可以使用]