PHP:确定是否选中了复选框

时间:2010-11-15 12:53:33

标签: php

我的复选框如下所示:

<input type="checkbox" name="activate[]" class="setSetting" value="<?php echo $row["id"]; ?>">

然后我有一个foreach:

$activate = $_POST['activate']; 
        foreach($activate as $a){
        echo $a ."<br>";
        }

正常工作以获得价值。但是,我如何确定是否已选中复选框?

$activate = $_POST['activate']; 
        foreach($activate as $a){
        $query_email = mysql_query("SELECT id FROM lp_email_settings ORDER BY id ASC");
            while($ro = mysql_fetch_row($query_email)){
            $getUserSettings = mysql_query("SELECT * FROM users_email_settings WHERE uID = '$USER' AND eSetting = '$ro[0]'");
                if($ro[0] == $a){
                    if(mysql_num_rows($getUserSettings) != 1){
                    mysql_query("INSERT INTO users_email_settings (uID, eSetting) VALUES ($USER, $ro[0])");
                    }
                }else{
                mysql_query("DELETE FROM users_email_settings WHERE uID = '$USER' AND eSetting = '$ro[0]'");
                }
            }
            echo $a."<br>";
        }

4 个答案:

答案 0 :(得分:3)

仅提交被视为successful(即已选中)的复选框。这意味着$_POST['activate']只有选中的复选框可用。

要确定是否已选中复选框,您可以使用array_search检查特定ID值是否在$_POST['activate']中:

array_search('12345', $_POST['activate'], true)

如果您更改控件的名称,则将ID用作关键字:

<input type="checkbox" name="activate[<?php echo $row["id"]; ?>]" class="setSetting" value="<?php echo $row["id"]; ?>">

然后,您只需在$_POST['activate']上使用issetarray_key_exists

isset($_POST['activate']['12345'])
array_key_exists('12345', $_POST['activate'])

编辑正如评论中已经说过的那样,您应该迭代可用选项并检查每个选项是否已经激活并需要激活或停用。您可以按如下方式执行此操作:

$activate = array_flip($_POST['activate']);
$query = "SELECT t1.id, t2.eSetting
          FROM lp_email_settings t1 LEFT OUTER JOIN users_email_settings t2 ON (t1.id = t2.eSetting)
          ORDER BY t1.id ASC";
$result = mysql_query($query);
$insert = array();
$delete = array();
while ($row = mysql_fetch_row($result)) {
    if ($row[1] === null) {
        // option is not set yet
        if (isset($activate[$row[0]])) {
            // option needs to be set
            $insert[] = $row[0];
        }
    } else {
        // option is already set
        if (!isset($activate[$row[0]])) {
            // option needs to be unset
            $delete[] = $row[0];
        }
    }
}
if (!empty($insert)) {
    $query = "INSERT INTO users_email_settings (uID, eSetting)
              VALUES ($USER, " . implode("), ($USER, ", $insert) . ")";
    mysql_query($query);
}
if (!empty($delete)) {
    $query = "DELETE FROM users_email_settings
              WHERE uID = $USER AND eSetting IN (" . implode(", ", $delete) . ")";
    mysql_query($query);
}

第一个查询将选择所有可用选项的左连接和已经激活的选项。因此,结果集是第一列中选​​项的ID,如果选项未激活,则第二列是 NULL ,否则再次是ID。因此,如果有三个选项(例如1,2和3)并且只设置了选项1和3,则结果应如下所示:

 id | eSetting
----+----------
  1 |        1
  2 |     NULL
  3 |        3

因此,如果$row[1] null (非活动选项),则$row[0]中的ID会添加到$insert数组中,如果在请求($activate[$row[0]]keys/values are flipped可以直接访问)。对于那些已经激活但未在请求中设置的选项也是如此。

最后,我会插入$insert中收集的选项,并移除$delete中的选项。

答案 1 :(得分:1)

如果你得到一个值,它已被检查,否则你什么也得不到......

这是一个非常好的教程,解释它是如何工作的:http://www.html-form-guide.com/php-form/php-form-checkbox.html

答案 2 :(得分:1)

如果勾选了复选框,则只会提交复选框。如果它们未被攻击,PHP将不会在$ _POST中看到它们。

我假设你使用方括号(即activate[]),你有不止一个都使用相同的名称。这将使得很难分辨出哪些被勾选,因为你将获得一系列被勾选的数组;你会知道有多少,但不知道哪些。

要解决此问题,您需要为它们指定所有不同的名称,或者为HTML代码中的每个名称指定数组键 - 即name="activate[4]"name="activate[bob]"。根据上下文,这可能是您要激活的数据的ID,或功能的名称,或您决定的任何其他内容,只要它对每个字段都是唯一的。

然后,您仍然会获得仅包含已勾选的数组的数组,但您可以通过查看数组键来确定它们在foreach循环中的位置。

希望有所帮助。

答案 3 :(得分:-1)

您可以检查每个提交的值($ activate),看看它是否确实包含任何/符合您的条件:

        $activate = $_POST['activate']; 
        foreach($activate as $a){
           if($activate){
              echo $a ."<br>";
           }
        }

虽然数组只应包含已检查的值。