【问题标题】:How do I insert the value from a checkbox into MySQL?如何将复选框中的值插入 MySQL?
【发布时间】:2011-09-08 18:56:31
【问题描述】:

MySQL

`field1` tinyint(1) NOT NULL default '1',
`field2` tinyint(1) NOT NULL default '1',
`field3` tinyint(1) NOT NULL default '1',
`field4` tinyint(1) NOT NULL default '1',
`field5` tinyint(1) NOT NULL default '1',

HTML

<form method="post">
<input type="hidden" name="blah" value="blah">

<input type="checkbox" name="field1" value="1">
<input type="checkbox" name="field2" value="1">
<input type="checkbox" name="field3" value="1">
<input type="checkbox" name="field4" value="1">
<input type="checkbox" name="field5" value="1">

<button type="submit">Submit</button>

</form>

PHP

mysql_query("UPDATE `table` SET `field1` = '$_POST[field1]', .......");

所以,我想做的是:

a) 如果复选框被选中,我想用1更新相应的字段

b) 如果未选中该复选框,我想用0 更新该字段

现在,请告诉我,我不必这样做,还有更好的方法:

$field1 = isset($_POST['field1']) ? 1 : 0;
$field2 = isset($_POST['field2']) ? 1 : 0;
$field3 = isset($_POST['field3']) ? 1 : 0;
$field4 = isset($_POST['field4']) ? 1 : 0;
$field5 = isset($_POST['field5']) ? 1 : 0;

mysql_query("UPDATE `table` SET `field1` = '$field1', `field2` = '$field2' ....");

【问题讨论】:

  • 推荐您的方式,因为它通过不将$_POST(或$_GET或任何其他用户输入值)直接放入SQL查询来避免SQL注入。
  • 好吧,那是有道理的。谢谢。

标签: php mysql checkbox


【解决方案1】:

您可以使用field[]

<input type="checkbox" name="field[0]" value="1">
<input type="checkbox" name="field[1]" value="1">

所以你可以做一个简单的循环:

for($i=0;$i<5;$i++)
   $field[$i] = isset($_POST['field'][$i]) ? 1 : 0;

然后构建你的 SQL

如果您想跳过 isset 部分,您可以使用单选类型,因此您始终设置了 1 值或 0 值。

【讨论】:

  • 也许它适合这里的预期用例,但总的来说我发现这个解决方案有问题。这仅提供检查输入的总数,但不告诉那些是哪些。为了获得预期的结果,您还应该为输入名称添加索引,例如name="field[1]"。在当前示例中,如果我选择第一个和第三个复选框,在 PHP 中您只会看到Array([0] =&gt; 1, [1] =&gt; 1),因为field[] 表示法意味着附加到数组,并且未检查的输入不会被附加,就像它们不会针对非数组情况发送一样。
【解决方案2】:

你有一个 SQL 注入漏洞:

编码恐怖

mysql_query("UPDATE `table` SET `field1` = '$_POST[field1]', .......");

改成:

$field1 = mysql_real_escape_string('$_POST[field1]');
....
mysql_query("UPDATE `table` SET `field1` = '$field1', .......");
/*                                         ^       ^ these quotes are vital */

不要忘记在查询中的 $vars 周围加上单引号。

【讨论】:

    【解决方案3】:

    您可以在每个复选框之前有一个隐藏的输入,例如

    <input type="hidden" name="field1" value="0">
    <input type="checkbox" name="field1" value="1">
    <input type="hidden" name="field2" value="0">
    <input type="checkbox" name="field2" value="1">
    

    这样,当未选中复选框时,将发送先前的值(由隐藏的输入提供),因此您将收到0 未选中的复选框。

    但是,在将输入数据插入 SQL 查询之前,您仍然必须在 PHP 中过滤/验证/清理输入数据(作为一个危害最小的示例,假设我使用 Firebug 将复选框更改为 value="2",然后提交表单)

    【讨论】:

    • 亲爱的投反对票的人,我愿意接受批评,所以如果/当你决定投反对票时,请分享你的想法。因为现在我没有从中学到任何东西,只是有人心情不好;)
    【解决方案4】:

    很遗憾,没有其他办法。

    您必须检查该值并将 1 或 0 分配给查询中使用的 var 以传递复选框的响应。

    这是因为如果复选框未选中,PHP $_POST var 不包含该复选框作为变量

    【讨论】:

      【解决方案5】:

      如果未选中复选框,则不会与表单一起发送,因此 $_POST 数组中没有它。

      您可以使用隐藏输入和一些 javascript,但如果您使用 PHP 部分,代码会更少。

      【讨论】:

        【解决方案6】:

        我认为您想要的是避免编写这么多行代码来检查复选框的值。
        也许你可以试试这个(不过我还没试过):

        $field = 'field';
        
        for(int i=1; i<=5, ++i){
            $($field.1) = isset($_POST['field'.i]) ? 1 : 0;
        
        }
        

        【讨论】:

          【解决方案7】:

          我认为这就是 SET 类型存在的原因。

          <input type="checkbox" name="field[0]" value="3">
          <input type="checkbox" name="field[1]" value="1">
          <input type="checkbox" name="field[2]" value="2">
          

          然后就内爆:

          $insert = implode(",",$_POST['field']); // 1,2,3
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-15
            • 2012-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多