【问题标题】:PHP MySQL insert values from multiple checkboxes into one column in tablePHP MySQL将多个复选框中的值插入表中的一列
【发布时间】:2011-09-06 14:37:58
【问题描述】:

我有一个表单,用户在为他们在我们网站上发现的错误创建票证时会填写该表单。在表单中,当前有一个输入字段,用户可以在其中输入错误影响的设计(例如,“Design1、Design2、Design3、Design4”...等)。提交表单时,该值存储在名为 affectedDesigns 的表列中。

我想要做的是创建几个复选框(我们拥有的每个设计一个复选框),用户将选择而不是使用输入字段。他们将能够选择所有适用的。如果可能的话,我仍然希望将所有值存储到一条记录中的affectedDesigns 列中。我在想我可以收集选定的复选框值并创建一个数组或一些逗号分隔的值,其中包含所有选定的项目,并将其提交到affectedDesigns 列中的一条记录中的数据库。我怎样才能做到这一点?

另外,如果他们想稍后返回并编辑票证,我将如何提取该数据并重新填充复选框?感谢您的帮助!

【问题讨论】:

  • 如果您稍后需要按设计搜索错误,这个“一体化”字段会让事情变得困难。一个 db 字段应该只包含一个值。多个值应存储在单独的表中。
  • 嗯,越想越觉得这样会更好。感谢您的意见。
  • 如果您打算添加编辑功能,我不建议您使用复选框。复选框在未选中时不会发送任何值,这可能会导致覆盖问题。如果用户只输入一次就可以了,否则我会使用选择元素。
  • @AR 那时您只需假设未检查任何未传输的值并从那里继续。稍后更新时,您只需删除旧的复选框数据并插入新数据。这消除了任何“悬空”复选框。
  • 是的,我同意@Marc。使用选择可能不是最适合 UI...我担心 CTRL 单击每个项目可能会导致错误输入信息。

标签: php mysql checkbox


【解决方案1】:

如果数据库中的人类可读性并不重要,您可以使用 PHP 序列化函数将所有行组合成一个可存储的字符串对象。

如果您希望数据库中的数据可读,可以使用 implode/explode 将数组转换为单个字符串并按原样存储在 char 数据类型中。

或者,如果您希望数据更易于管理并能够对其进行查询,我将使用 mysql SET 数据类型而不是字符串来存储复选框。

【讨论】:

    【解决方案2】:

    答案在二元选项中是正确的。

    恰好是十进制数转换为二进制数,为您提供了所需的选项组合。用于“已选择”选项的选项和未选择选项的 Ceroes(从右到左阅读)

    因此,保存它们的技巧很简单。 为每个复选框分配 2^index 的值,其中 index 是您的复选框 ID/顺序

    … 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
    

    【讨论】:

      【解决方案3】:

      懒惰的解决方案:假设没有其他依赖于受影响设计中条目的 ID,只需删除该票的所有条目,然后重新输入提交的 $_POST 值。

      【讨论】:

        【解决方案4】:

        你需要我正在寻找的相同答案。

        Basic 语言中的 Sprites 使用该系统为您选择每列的 ON 或 OFF 位(每个 sprite 3 列:24 位),所有 8 个值的总和正好给出唯一值,只有元素组合开/关可以给出。

        关键是每个元素相加的值总是大于所有其他先前值相加的值。

        I.g.复选框值为 1、2、4、8、16、32、64、128。

        例如如果选择了第 3 个和第 5 个元素(值 4 + 16),则结果 20 将仅由这些元素获得,因为下一个值 32 大于总和本身,即使您将所有值相加到第 5 个元素(值 16)结果永远不会达到 32(它总是比下一个可能的值小 1,在这种情况下加起来是 31)

        以前的基本语言是自动完成的,因为最大值是固定的,所以很容易。每个总和只有 8 个值长。您需要将最大值输入到您的函数中,以限制脚本“尝试”的尝试。

        所以,这就是你需要的,我只是不知道名字。

        一旦我找到这项技术/数学运算的名称,我就会在这里发布一个工作函数。

        您还可以通过选项获取二进制数,例如01001001011 然后只需使用字符位置来确定该复选框是打开还是关闭。

        PS。什么样的答案是“你最终会使用爆炸或内爆”?这是懒惰的算命读者的答案。 “你会大吃大喝直到死去”:S

        【讨论】:

          【解决方案5】:

          我会避免将所有值存储在单个字段中。一旦你因为违反了规范化规则而不得不做一些查询,你就会遇到很多问题。

          【讨论】:

          • 谢谢,@nick。我想我会先尝试创建一个单独的表。
          【解决方案6】:

          从您的 $_POST 值创建一个数组,键入每个复选框的名称,然后在插入之前序列化该数组....然后您可以在再次加载它时取消序列化它

          【讨论】:

          • 感谢您的帮助,@trey!我可能会先尝试创建一个单独的表。在一些帖子之后,我意识到我以后可能会后悔只使用单列来存储数据。
          【解决方案7】:

          您最终将使用explode() 和implode() 在字符串和数组之间进行转换。

          【讨论】:

            猜你喜欢
            • 2015-02-19
            • 2014-10-31
            • 2012-08-20
            • 1970-01-01
            • 1970-01-01
            • 2015-07-07
            • 2017-02-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多