0

基本上我有一个包含几个复选框(属于同一组)的表单,这些是类别选择。

当用户想要更新他们的选择时,他们可以查看此表单 - 已经勾选了他们的当前选择。

然后用户更改他们的选择并提交表单。我现在需要更新数据库中的这些选择。这是我目前拥有的代码:

// $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
        }
}

所以目前这会将新的选择添加到数据库中,但不会删除任何现有的选择。理想情况下,这应该有点聪明 - 而不是仅仅删除所有现有条目,它应该比较两个数组并根据需要删除/插入。

此外,如果用户取消选中所有选择,那么显然需要删除所有现有条目。

实现这一目标的最有效方法是什么?

4

3 回答 3

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

尝试这样的事情。

于 2013-10-24T12:59:31.337 回答
0

在这种情况下,我通常有一个单独的表,其中包含 UserID、SelectionID 和“Y”或“N” - 或者更简单地删除 Y/N 位并假设是否有用户/选择对的记录然后他们打勾它,如果没有,他们没有。

当用户 x 更新和写入新记录时,我删除了他们的所有记录。检查记录是否已经存在是没有意义的。

如果选项很简单,您甚至可以在用户记录中存储一个字符串——也许用 | 分隔 ID。或类似的,因此它们很容易拆分。我再次覆盖记录。

如果您需要以相反的方式访问数据,我更喜欢第一种方法——例如,这里的“查找所有选择了选项 x 的用户”——使用表格解决方案很容易。此外,如果您将来删除其中一个选择,您可以轻松地从表中删除具有该 ID 的所有记录。

于 2013-10-24T12:27:56.817 回答
0

稍微改变一下表结构

有一个单独的表来存储选择详细信息,例如:

selection_id selection_name
1            New Selection

和另一个表格来保存哪个用户添加了哪个选择例如:表格选择

user_id   selection_id
10          1

所以更新选择意味着向表中添加新记录并插入新记录[可以使用简单的sql函数]

于 2013-10-24T12:39:51.923 回答