将复选框更改保存到DB

时间:2013-01-24 19:32:46

标签: php database checkbox

我正在寻找将更改保存到数据库复选框列表的最佳方法。这是我的设置:

根据某些数据库条目,我有一个选中或取消选中的复选框列表,如下所示:

Animals I like: 
0 Cats 
X Dogs
0 Birds
X Elefants

现在,用户可以完全改变主意并选择Birds并取消选择Dogs,我希望尽可能高效地将此更改保存在数据库中。

db的结构方式,我有一个用户表(带有user_id)和一个动物表(带有animal_id)。在“数据透视表”中跟踪“喜欢”(因为它是多对多关系)。

以下是我考虑过的一些方法,但我对其他/更好/更有效的方法感兴趣:

1)在保存时,删除此用户的数据透视表中的所有条目,并仅输入选中的条目。

这样做的好处是我不需要比较之前/之后的选择。缺点是我删除了一个没有改变的条目(即上例中的元素)。如果我将创建时间戳附加到例如elefant,它会每次都改变,即使我不改变那个选择

2)在保存时,我查询数据库以获取所有原始喜欢的列表。我将此列表与新喜欢的新列表进行比较。每当我遇到原始的,不在新列表中时,我将其删除。如果我遇到原始列表中没有的新内容,我会添加它。

这样做的好处是只更改了db的更改,但它似乎是一个非常多的查询。如果动物列表很长并且进行了许多更改,则循环可能会导致大量的数据库事务。

那么,解决这个问题的最佳做法是什么。我的意思是,这一定是一个常见的问题,我不想在这里重新发明轮子。

2 个答案:

答案 0 :(得分:1)

选项1将是最好的,但由于您不希望时间戳受到干扰,因此您可以使用比“单独检查每条记录”更高效的系统。

1)从db,$ original。

中获取用户选择的列表

2)从提交的表格中提取选项列表,$ submitted。

3)使用array_diff()来确定改变了什么以及你需要对数据库做什么:

e.g。

$original = array(2,4,6,8);
$submitted = array(4,7,8);
// so 2 and 6 have been removed, and 7's been added.

$unchanged = array_intersect($original, $submitted); // 4, 8
$removed = array_diff($original, $submitted); // 2, 6
$added = array_diff($submitted, $original); // 7

$sql = "DELETE FROM pivot_table WHERE animal_id IN (2, 6);"; // remove 2&6
$sql = "INSERT INTO (animal_id, ...) VALUES (7, ...)"; // insert 7

答案 1 :(得分:0)

当您最初向用户显示选项时,您已完成数据库查询以显示他/她已检查的内容。现在,您可以将更改与原始更改进行比较。如果发生了变化,请更新,否则,请不要管它。