【问题标题】:$_POST as $key => $value using checkboxes$_POST as $key => $value 使用复选框
【发布时间】:2010-11-24 05:14:58
【问题描述】:

我在获取表单以更新从复选框传递的信息时遇到问题。我得到了这个代码。

$one = isset($_POST['one']) ? 'on' : 'off'; 

只要我分别调用每个复选框,这将非常有效。我的问题是我总共有大约 200 个复选框。

这是我用于UPDATE 的代码。谁能帮我弄清楚在哪里将我得到的代码插入到我的当前代码中?我尝试了各种变体。

if($_POST['submit']){
    if(!empty($applicant_id)){
        $sql = "UPDATE play SET ";
        foreach($_POST as $key => $value){
                if(($key != 'submit') && ($key != 'applicant_id')){
                    $sql .=  $key. " = '$value',";
                }
        }
        $sql = substr($sql, 0, -1);
        $sql .= " WHERE ".$applicant_id." = $applicant_id";
        $result = mysql_query($sql,$db) or die(mysql_error(). "<br />SQL: $sql");   
    } 
} 

【问题讨论】:

  • 所以您的数据库中有一个 200 列的表? O_O
  • 这段代码也只是在尖叫 SQL 注入......

标签: php http checkbox


【解决方案1】:

你应该使用一个数组名,它会是 PHP 中的一个数组。

正如ndp所说,如果未选中复选框,则不会传输其值。所以你需要在复选框输入字段之前使用一个同名的隐藏输入字段,并带有“off”值。

<label for="one">One</label> 
<input type="hidden" name="checkboxes[one]" value="off"/>
<input type="checkbox" name="checkboxes[one]" id="one" value="on"/>

如果它应该默认打开,请记住 checked="checked"。

您现在可以使用 POST 或 GET 循环复选框

foreach ($_POST['checkboxes'] as $key => $value) {
    //something
}

【讨论】:

    【解决方案2】:

    删除以上所有内容 :-) 将所有复选框命名为 在 foreach 中使用 $_POST['out'] 但!不要忘记黄金法则:不要相信用户。在写入数据库之前重新检查每个键=>值。

    【讨论】:

      【解决方案3】:

      您可能会遇到 HTML 复选框行为:复选框仅在打开时才会发送到服务器;如果它们关闭,则不发送名称/值对。使用上面的代码关闭值会遇到问题。

      因此,您需要遍历已知的值列表并在 $_POST 参数中检查它们。

      【讨论】:

        【解决方案4】:

        解决方案是从array() 或类似文件中已知的可能复选框列表开始。我可以假设您使用这样的列表生成表单吗?如果没有,你可能应该。然后,您可以对相同的数据使用循环来检查每个复选框是否存在。

        其他一些提示:

        isset($array[$key]) 不推荐。虽然它在大多数情况下都是可靠的,但如果 $array[$key]null,它就会失败。正确的调用是array_key_exists($key, $array)

        当为 SQL 组装字符串片段时,就像您正在做的那样,执行以下操作会更优雅:

         $sqlvalues = array();
         foreach( $options as $field ) {
            if( array_key_exists('checkbox_'.$field, $_POST) )
                $sqlvalues[] = $field.' = \'on\'';
            else
                $sqlvalues[] = $field.' = \'off\'';
         }
         mysql_query('UPDATE '.$table.' SET '.implode(', ', $sqlvalues).' WHERE applicant_id = '.$applicant_id);
        

        【讨论】:

        • 我一直在使用 isset($array[$key])。我从来不知道它在 $array[$key] === null 时返回 false!
        • 如果变量存在但实际记录为 NULL,它也会返回 false。
        【解决方案5】:
        if($_POST['submit']){
            if(!empty($applicant_id)){
                    $sql = "UPDATE play SET ";
                    foreach($_POST as $key => $value){
                        if(($key != 'submit') && ($key != 'applicant_id')){
                             $sql .=  $key . " = '" . ($value ? 'on' : 'off') . "',";
                        }
                    }
                    $sql = substr($sql, 0, -1);
                    $sql .= " WHERE ".$applicant_id." = $applicant_id";
                    $result = mysql_query($sql,$db) or die(mysql_error(). "<br />SQL: $sql");   
            } 
        }
        

        以上假设您的所有输入都是复选框。如果不是,您需要制定一个约定来区分它们。

        顺便说一句,您当前运行的UPDATE 代码容易受到SQL injection 的攻击,因为您没有使用mysql_real_escape_string() 清理您的输入。干杯。

        【讨论】:

        • 所以该表有 200 列具有某种 CHAR 数据类型?
        猜你喜欢
        • 2013-12-31
        • 2013-08-31
        • 2011-03-19
        • 1970-01-01
        • 2022-12-27
        • 1970-01-01
        • 2011-08-16
        • 2017-02-01
        • 2012-03-23
        相关资源
        最近更新 更多