【问题标题】:Posting lots of checkboxes发布很多复选框
【发布时间】:2011-07-18 18:22:52
【问题描述】:

更新 2:

无论选中哪些选项,以下内容都会给我UDPATE table SET db_field1=0, dbfield2=0, dbfield3=0, dbfield4=0 WHERE 1=1

<?php
    if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

        $fields = array('db_field1'=>'cb1', 'dbfield2'=>'cb2', 'dbfield3'=>'cb3', 'dbfield4'=>'cb4');

        $update = '';

        foreach($fields as $dbfield => $field) {
            if ($update) $update.= ',';

            $update.= ' '.$dbfield.'=';

            if (isset($_POST[field])) {
                $update.= 1;
            } else {
                $update.= 0;
            }
        }

        echo 'UDPATE table SET'.$update.' WHERE 1=1';

    }
?>

<html>
    <head>
        <title></title>
    </head>

    <body>
        <form method="post">
            <input type="checkbox" name="cb1" />
            <input type="checkbox" name="cb2" />
            <!-- all the way to 50 -->
            <input type="checkbox" name="cb3" />
            <input type="checkbox" name="cb4" />

            <input type="submit" value="submit" />
        </form>
    </body>
</html>

更新 1:

<?php
    if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

        if( isset( $_POST["cb"] ) ) {

            $update = "";

            foreach ($_POST['cb'] as $key => $value) {

                if ( $update ) $update.= ', ';

                $update .= $key . " = 1";

            }

            echo "update table1 set " . $update . " where uid = 10";

        }

    }
?>

<html>
    <head>
        <title></title>
    </head>

    <body>
        <form method="post">
            <input type="checkbox" name="cb[col1]" />
            <input type="checkbox" name="cb[col2]" />
            <!-- all the way to 50 -->
            <input type="checkbox" name="cb[col3]" />
            <input type="checkbox" name="cb[col4]" />

            <input type="submit" value="submit" />
        </form>
    </body>
</html>

原始问题:

我有一个带有许多复选框的 PHP 表单,允许用户选择打开或关闭哪些选项。

返回选中的复选框的最佳方法是什么,以便我可以将数据作为 0 或 1 插入数据库?

我有以下代码,但如果我对所有 50 个复选框都使用此方法,这似乎有点过分:

<?php
    if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
        if( isset( $_POST["cb1"] ) ) {
            // insert 1 in relevant database table cell
            echo 1;         
        } else {
            // insert 0 in relevant database table cell
            echo 0;
        }

        if( isset( $_POST["cb2"] ) ) {
            // insert 1 in relevant database table cell
            echo 1;         
        } else {
            // insert 0 in relevant database table cell
            echo 0;
        }

        // all the way to 50

        if( isset( $_POST["cb49"] ) ) {
            // insert 1 in relevant database table cell
            echo 1;         
        } else {
            // insert 0 in relevant database table cell
            echo 0;
        }

        if( isset( $_POST["cb50"] ) ) {
            // insert 1 in relevant database table cell
            echo 1;         
        } else {
            // insert 0 in relevant database table cell
            echo 0;
        }
    }
?>

<html>
    <head>
        <title></title>
    </head>

    <body>
        <form method="post">
            <input type="checkbox" name="cb1" />
            <input type="checkbox" name="cb2" />
            <!-- all the way to 50 -->
            <input type="checkbox" name="cb49" />
            <input type="checkbox" name="cb50" />

            <input type="submit" value="submit" />
        </form>
    </body>
</html>

【问题讨论】:

    标签: php html post http-post


    【解决方案1】:

    定义复选框名称(POST数组条目名称)和mysql表名称之间的映射;使用它来构造你的 SQL 来进行值插入。

    【讨论】:

    • 请参阅更新 1。我正在尝试将复选框名称与数据库列名称进行映射,但不确定如何处理未选择或取消选择的选项?另外,这不会允许 sql-injections 吗?
    • @oshirowanen:根据变量是否设置来设置值时,您不必担心sql注入。
    【解决方案2】:

    创建一个包含所有不同字段的数组:

    $fields = array('db_field1'=>'cb1', 'dbfield2'=>'cb2', 'dbfield3'=>'etc', );
    
    $update = '';
    
    foreach($fields as $dbfield => $field) {
        if ($update) $update.= ',';
    
        $update.= ' '.$dbfield.'=';
    
        if (isset($_POST[$field])) {
          $update.= 1;
        } else {
          $update.= 0;
        }
    }
    
    $query = 'UDPATE table SET'.$update.' WHERE 1=1';
    

    其中 db_field 是表中列的名称,cd 是 html 字段名称

    编辑

    添加了更好的示例代码

    编辑 2

    固定后置变量

    【讨论】:

    • 我有点困惑如何将它与选中的复选框和未选中的复选框链接起来?
    • @oshirowanen:那只是我是个白痴并试图输入:) $_POST[field] 应该是 $_POST[$field]where 1=1 只是一个例子,你应该用正确的语句替换它
    • @oshirowaren:太好了。别客气。很抱歉造成混乱:)
    【解决方案3】:

    在 HTML 中执行以下操作:

    <input type="checkbox" name="checkboxeslist[1]" />
    <input type="checkbox" name="checkboxeslist[2]" />
    <input type="checkbox" name="checkboxeslist[49]" />
    <input type="checkbox" name="checkboxeslist[50]" />
    

    在 PHP 中执行以下操作:

    <?php
         if (isset($_POST['checkboxeslist'])) {
              //one is at least selected; hence start looping
              foreach ($_POST['checkboxeslist'] as $key => $value) {
                   echo $key; //this will print 1,2,49,50 etc... ONLY IF they have been selected
                   //do the DB call here
              }
         }
    ?>
    

    为了获得未选中的复选框,请执行以下操作(仅当您想要 1 和 50 之间的所有数字时:

    <?php
         if (isset($_POST['checkboxeslist'])) {
              //one is at least selected; hence start looping
              for ($i = 1; $i <= 50; $i++) {
                   if (isset($_POST['checkboxeslist'][$i])) {
                       echo "1";
                   } else {
                       echo "0";
                   }
              }
         }
    ?>
    

    【讨论】:

    • 未选中或未选中的选项如何设置为0?
    【解决方案4】:

    对于 HTML,您也可以遍历这些字段。在某处有一个列列表;使用 MVC 模型,您可以从模型中获取它们。否则一个数组就足够了,或者查询数据库关于表的内容。

    用于从数据库中获取列名:

     SELECT name FROM syscolumns 
     WHERE id = (SELECT id FROM sysobjects 
     WHERE name= 'MyTableName') 
     ORDER by colorder
    

    那么,

    foreach($columns as $column) {
         echo '<input type="text" name="cb['. $column .']" />' . "\n";
    }
    

    打印列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 2013-01-24
      • 2010-12-06
      • 2016-04-01
      相关资源
      最近更新 更多