【问题标题】:How to store checkbox values in db table如何在数据库表中存储复选框值
【发布时间】:2013-10-13 11:44:56
【问题描述】:

我创建了一个带有复选框的表单:

<input type="checkbox" name="cars[]" value="Toyota" /> Toyota
<input type="checkbox" name="cars[]" value="Honda" /> Honda
<input type="checkbox" name="cars[]" value="Nissan" /> Nissan

在 php 部分,我读取数组并将其插入如下:

$carvalue = "";
foreach($_POST['cars'] as $single){
    $carvalue .= $single;
    $carvalue .= ", ";
}

我将$carvalue 变量分隔值(例如Toyota、Honda、Nissan)插入到我的mysql db 表中。这是正确的吗?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这可能会使其更具可读性,并且您将去掉结尾的逗号:

    $carvalue = implode(",", $_POST['cars']);
    

    当然,先检查$_POST['cars']是否存在且不为空等

    但是,由于您将其存储到数据库中,您可能需要考虑使用逗号分隔值以外的其他值,例如 JSON。

    【讨论】:

      【解决方案2】:

      如果您遵循范式,那将是一个坏主意,因为它会违反第一个范式(Bcoz 单个字段已被允许包含多个值)。否则我看不出有什么问题。

      范式参考:http://en.wikipedia.org/wiki/First_normal_form

      【讨论】:

        【解决方案3】:

        什么是正确的取决于您对数据的使用,但是在将这些值连接到字符串时需要注意一些事项。例如,如果您想查找所有包含“Honda”的行(您可能会),这可能是存储数据的一种不好的方式。

        我可能会制作一些额外的表格:car_make、car_make_group 和 car_make_to_group。我会放

        car_make (make_id, make_desc)
        ------------------
        1, "Toyota"
        2, "Honda"
        3, "Nissan"
        

        我会像位标志枚举一样对我的组进行编号,但这并不是很重要..它只是一种以不冲突的方式将编号分配给组的方法。它还具有一切都是相加的特性(group2 + group4 = group6)。不过,我总是提供关联表。

        car_make_group (make_group_id, make_group_desc)
        ------------------
        1, "Toyota"
        2, "Honda"
        3, "Toyota, Honda"
        4, "Nissan"
        5, "Toyota, Nissan"
        6, "Honda, Nissan"
        7, "Toyota, Honda, Nissan"
        

        最后,我会制作一个关联表来帮助查询:

        car_makes_to_group (make_id, make_group_id)
        ------------------
        1, 1
        1, 3
        1, 5
        1, 7
        2, 2
        2, 3
        2, 6
        2, 7
        3, 4
        3, 5
        3, 6
        3, 7    
        

        使用多个表格可以让您灵活应对未来的更改。例如,您稍后可能会意识到您想使用 JSON 并更改 make_group_desc 以保存 JSON 字符串而不是逗号分隔的字符串。

        您将能够运行临时查询,在该查询中还可以找到包含“Toyota”的每一行:

        Select m.make_id, m.make_desc, g.make_group_id, g.make_group_desc
        FROM car_make_to_group t
        INNER JOIN car_make_group g
        ON (t.make_group_id = g.make_group_id)
        INNER JOIN car_make m
        ON (t.make_id = m.make_id)
        WHERE m.make_desc = "Toyota" 
        

        【讨论】:

          【解决方案4】:

          试试这个:

          <?php
          $carvalue = '';
          if(!empty($_POST['cars']))
          {
                $carvalue = implode(",", $_POST['cars']);
                $carvalue = rtrim($carvalue, ",");
          }
          ?>
          

          使用 $carvalue 在数据库中插入值

          【讨论】:

            【解决方案5】:

            使用 json_encode 创建一个 json 字符串并将其存储在数据库中可能会更好。如果以后需要,这将更容易将数据转回可用格式(转回数组)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-08-13
              • 2019-02-26
              • 1970-01-01
              • 1970-01-01
              • 2011-08-12
              • 1970-01-01
              • 2013-08-11
              • 1970-01-01
              相关资源
              最近更新 更多