我正在网站上工作,我想在其中添加一个新部分,其中包含用于存储该数据的高级表单。将有大约20-30个字段,其中很少会用多个选项复选框表示从这些选项提交的eq数组值。这些字段将有一定数量的选择永远不会改变,并且永远不会在其中添加新的选择。例如,字段1将具有choice1,choice2,choice3。第二场将有10场,第三场将有5场。
不是为它们创建单独的数据库表,并通过它的id引用它们有点矫枉过正吗?保存它们不是更好,例如varchar field eq implode下的逗号分隔值,每当我想要访问或存储新的时,它们都会发布吗?
此外,我稍后会弄清楚如何使用它。因为如果我将它们保存为单独的表并通过其id引用它,那么我的查询将输出这些字段的每个组合。这将导致例如一条记录的150行。如何将其转换回具有嵌套数组的单个数组值,以用于此子多个值?例如'id'=>1, 'title' => 'Lorem Ipsum', 'choices' => array('choice2','choice2').....
更新:为了更好地说明我想要做什么,我在这里创建了一个简化的表单模型 - > http://www.anony.ws/i/2013/08/13/SsD5A.gif 我将使用它不是真正的形式,因为我还没有构建它,但它足够接近。您可以忽略我已经知道如何保存或以后使用它们的其他字段。
我需要帮助的是复选框组。我需要存储选定的值,稍后我将需要使用它们。我需要能够搜索它们,我需要能够显示该数据。我还需要能够创建一些评论系统(我之前已经这样做了基本上我只需要能够通过其数据库ID从这个表单中引用数据。可能是一些更新和/或其他基本的东西。
主要的是保存这个选择并搜索/显示其数据。如果我可以从1个数组中获取数据库中的数据/使用一些嵌套数组来获取此多个选项,那将是真正的geat。在更新之前,我已经在这篇文章的最后草拟了一些内容。
答案 0 :(得分:2)
问自己以下问题: 我是否需要评估客户做出的选择?
如果你这样做,将它们放在普通的逗号分隔列表中将是一个非常难看的操作。 如果您真的只想记录选项,可以继续进行内爆/爆炸。
按规范化方式进行:
你的餐桌计划:
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`
答案 1 :(得分:-3)
D'ont打扰你自己序列化你的Array /对象并将其存储在一个简单的varchar行中 例如,您有以下数组:
$ selection = array('selection1'=>'value1','selection2'=> array('selectionn'=>'valuen')....
$ serialized = serialize($ selection);
然后在您检索记录并将其反序列化以恢复整个数组/对象后将其存储到数据库中。