我有一个用户在为我们网站上发现的错误创建故障单时填写的表单。在表单中,当前存在输入字段,用户将在其中输入错误影响的设计(例如,“Design1,Design2,Design3,Design4”......等)。提交表单时,该值存储在名为affectedDesigns
的表列中。
我想要做的是创建几个复选框(我们拥有的每个设计的一个复选框),用户将选择而不是使用输入字段。他们可以选择所有适用的。如果可能,我仍然希望将所有值存储到一个记录中的affectedDesigns
列中。我想我可以收集选定的复选框值并创建一个包含所有选定项的数组或逗号分隔值,并将其提交到affectedDesigns
列中的一条记录中的数据库。我怎样才能做到这一点?
另外,如果他们想稍后再回来编辑故障单,我将如何提取该数据并重新填充复选框?谢谢你的帮助!
答案 0 :(得分:2)
我会避免将所有值存储在单个字段中。一旦你不得不进行一些查询,你就会遇到很多问题,因为你违反了规范化规则。
答案 1 :(得分:1)
从你的$ _POST值创建一个数组,键入每个复选框的名称,然后在插入之前序列化该数组....然后你可以在重新加载它时反序列化它
答案 2 :(得分:0)
答案 3 :(得分:0)
你需要我正在寻找的答案。
基本语言中的Sprites使用该系统为您选择每列所需的ON或OFF位(每个sprite 3个cols:24个bites),所有8个值的总和给出了唯一的值,只有那个元素组合开/关可以给。
KEY是每个元素添加的值总是大于所有其他先前值相加的值。
I.g。复选框值为1,2,4,8,16,32,64,128。
E.g。如果选择第3和第5个元素(值4 + 16),结果20将仅由这些元素获得,因为下一个值32大于和本身,即使您将所有值汇总到5元素(值16)结果永远不会达到32(它总是比下一个可能值小1,在这种情况下加起来为31)
用于自动执行此操作的基本语言,因为最大值已修复,所以很容易。每个总和只有8个值。您需要输入最大值才能限制脚本尝试“尝试”的尝试。
所以,这就是你所需要的,我只是不知道这个名字。
一旦找到这个技术/数学运算的名称,我就会在这里发布一个工作函数。
您还可以使用选项获取二进制数字,例如01001001011然后只需使用字符位置来确定该复选框是打开还是关闭。
PS。什么样的答案是“你最终会使用爆炸或内爆”?这是懒惰财富读者的答案。 “在你死之前,你会吃掉并发出哔哔声”:S
答案 4 :(得分:0)
懒惰解决方案:假设其他任何内容都不依赖于affectedDesigns中条目的ID,只需删除该故障单的所有条目,然后重新输入提交的$_POST
值。
答案 5 :(得分:0)
答案在二元期权中是正确的。
恰好是转换为二进制的十进制数字,完全为您提供所需选项的组合。 “已选择”选项的选项和未选择的选项的Ceroes(从右向左阅读)
所以保存它们的诀窍很容易。 为每个复选框分配值2 ^ index,其中index是您的复选框ID / order
… and you'll get
2^index0 = 1
2^index1 = 2
2^index2 = 4
2^index3 = 8
…and so on.
然后,你总结你的复选框值,比如说
$options_dec = sum($_POST['options']); //outputs 5 if options 0 and 2 are selected
转换为二进制的十进制和数显示您确切选择了哪些复选框:
$options_bin = base_convert ( $options_dec, 10, 2 ); //outputs 0101 (reads right to left)
现在您可以将其转换为数组,反转它,并使用您的复选框调用每个匹配其索引。
$options_arr = array_reverse( str_split( $options_bin, 1 ) ); //returns array containing "0,1,0,1"
现在用循环填充复选框。假设复选框的顺序与存储的值相同,并且每个复选框都有一个2 ^ $ i。
for($i = 0; $i < sizeof($options_arr); ++$i) {
$checkbox_value = pow ( 2 , $i );
$checked_val = ( $options_arr[$i] ? 'checked' : '');
echo "<input type='checkbox' value='$checkbox_value' $checked_val />\n";
}
未经测试,因为我在JavaScript中创建了我的版本。
另一种解决方案是从二进制字符串
中直接获取选项$checked_val = (boolean) substr( $options_bin , -($i+1), 1 );// +1 because neg substr counts from 1, not 0
答案 6 :(得分:0)
如果数据库中的人类可读性并不重要,您可以使用PHP序列化函数将所有行组合成一个可存储的字符串对象。
如果您希望数据库中的数据可读,您可以使用implode / explode将数组转换为单个字符串,并以char数据类型存储。
或者如果您希望数据更易于管理并且能够对其进行查询,我会使用mysql SET数据类型而不是字符串来存储复选框。