【问题标题】:What is the best way to store multiple checkbox values in the database and work with it later on在数据库中存储多个复选框值并稍后使用它的最佳方法是什么
【发布时间】:2013-08-24 02:19:09
【问题描述】:

我正在开发一个网站,我想向其中添加一个新部分,其中包含用于存储该数据的高级表单。将有大约 20-30 个字段,其中很少有多个选项复选框表示这些选项提交时的 eq 数组值。该字段将具有固定数量的选择,这些选择永远不会改变,也永远不会添加新的选择。例如字段一将有choice1、choice2、choice3。字段 2 将有 10 个,字段 3 将有 5 个。

为它们创建单独的数据库表并通过其 id 引用它们不是有点矫枉过正吗?将它们保存为例如 varchar 字段 eq implode 下的逗号分隔值并在我每次想要访问或存储新值时将它们 eplode 保存不是更好吗?

我也很难弄清楚以后如何使用它。因为如果我将它们保存为单独的表并通过其 id 引用它,那么我的查询将输出这些字段的每个组合。例如,这将导致一条记录有 150 行。对于这个子多个值,我如何将它转换回具有嵌套数组的单个数组值?例如'id'=>1, 'title' => 'Lorem Ipsum', 'choices' => array('choice2','choice2').....


更新:为了更好地说明我想要做什么,我在这里创建了一个简化的表单模型 -> http://www.anony.ws/i/2013/08/13/SsD5A.gif 它不是我将使用的实际表单因为我还没有建造它,但它已经足够接近了。您可以忽略我已经知道以后如何保存或使用它们的其他字段。

我确实需要一些帮助是复选框组。我需要存储选定的值,稍后我将需要使用它们。我需要能够搜索它们,我需要能够显示该数据。我还需要能够创建一些评论系统(我之前已经这样做了,所以基本上我只需要能够通过其数据库 ID 引用此表单中的数据。可能是一些更新或其他基本内容。

主要是保存这些选择并搜索/显示其数据。如果我可以从 1 个数组/obect 中的数据库中获取数据,并使用一些嵌套数组来进行多种选择,那将是非常棒的。就像我在更新之前在这篇文章的末尾画的那样。

【问题讨论】:

  • 在遇到这种情况时,我通常会使用varchar,即10的字符串,我可以随意使用implodeexplode
  • 如果您的选择将被修复,为什么不能将每个复选框存储在同一个表的不同列中?
  • 我认为这不是一个好主意,因为它会使搜索这些记录变得困难,而且表格看起来很乱。

标签: php mysql database arrays checkbox


【解决方案1】:

问自己以下问题: 我需要评估客户的选择吗?

如果你这样做,将它们放在简单的逗号分隔列表中将是一个非常丑陋的操作。 如果你真的只是想记录选择,你可以继续 implode/explode。

以标准化的方式进行:

您的餐桌方案:

checkbox_id | customer_id | value

当客户提交他的选择时,您只会插入选中的复选框:

foreach (checkbox in POST) {
    INSERT IGNORE INTO `table` (`checkbox_id`, `customer_id`, `value`) VALUES (checkbox, customer, 1)
}

如果您想稍后阅读客户的选择,请选择:

SELECT `checkbox_id`, `value` FROM `table` WHERE `customer_id` = ? ORDER BY `checkbox_id`, `value`

这将为您提供指定客户所做的所有选择的列表。 如果您需要将它们放在数组中,请使用一些功能:

function array returnChoicesAsArray(query, checkbox_id) {
    array = [];

    foreach (row in query) {
        if (row.checkbox_id == checkbox_id)
            array.add(row.value);
    }

    return array;
}

并为您的每个复选框调用它们。

如果您想评估复选框的选择,您可以轻松地对其进行查询:

SELECT COUNT(*) FROM `table` GROUP BY `checkbox_id`

【讨论】:

  • 谢谢,但我仍然不清楚这一切将如何运作。你的意思是像这样将它存储在 3 个单独的表中:复选框可用选择表、实际表单数据表,而不是一些可以连接复选框 id 和表单数据行的数据透视表?如果是这样,我将如何将整个表单数据返回到一个对象中?我将如何根据其他字段的特定值+这些复选框选择来搜索表单记录?这是我几个月来一直在努力解决的问题,但它仍然有点模糊。加入表格也有点令人困惑,但我过去曾使用它。
  • 不,一张桌子供所有人使用。您将为每个复选框指定一个唯一 ID。但我想你需要提供一个复选框标记的例子来澄清一些事情。到目前为止,我们只能猜测您计划实现的目标。
  • 我已经更新了第一篇文章,我已经尽力做到清楚,但如果您需要更多信息,请直说。
【解决方案2】:

不要打扰您的自我序列化您的数组/对象并将其存储在一个简单的 varchar 行中 例如,您有以下数组:

$selection = array ('selection1'=>'value1','selection2'=>array('selectionn'=>'valuen') ....

$serialized = 序列化($selection);

然后在您可以检索记录并对其进行反序列化以恢复整个数组/对象后将其存储到数据库中。

【讨论】:

  • “D'ont”——这是一个新的。
  • 您的意思是要将所有内容都存储在一个字段中吗?我认为这不是一个好的解决方案,因为我以后需要使用它。我需要能够搜索它等等,但感谢您的回复。
  • 因为序列化的数组或对象是长字符串,所以可以随时搜索
  • 我知道,但我需要能够在特定字段中搜索特定值,如果它全部在一个列中,则很难重现。而且它也更慢(例如整数比较总是比字符串快)。
猜你喜欢
  • 2017-02-11
  • 2021-04-21
  • 2010-11-25
  • 2011-06-07
  • 1970-01-01
  • 2021-02-03
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多