PHP / MySQL - 更新数据库中的复选框选择


PHP / MySQL - updating checkbox selections in database

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

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

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

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

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

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

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

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

尝试这样的事情。

在这种情况下,我通常有一个单独的表,其中包含UserID,SelectionID和"Y"或"N" - 甚至更简单的是删除 Y/N 位并假设如果有用户/选择对的记录,那么他们已经勾选了它,如果没有,他们还没有。

当用户 x 更新

并写入新记录时,我会删除用户 x 的所有记录。 检查记录是否已存在是没有意义的。

如果选项很简单,您甚至可以只在用户的记录中存储一个字符串 - 也许用 | 或类似的东西分隔 id,以便它们易于拆分。 再一次,我只是覆盖了记录。

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

稍微改变一下表结构

有一个单独的表来存储选择详细信息前任:

selection_id selection_name
1            New Selection

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

user_id   selection_id
10          1

因此,更新选择意味着向表添加新记录并插入新记录 [可以使用简单的 SQL 函数]