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

PHP:确定是否选中了复选框,php,Php,我的复选框如下所示: <input type="checkbox" name="activate[]" class="setSetting" value="<?php echo $row["id"]; ?>"> <input type="checkbox" name="activate[<?php echo $row["id"]; ?>]" class="setSetting" value="<?php echo $row["id"]; ?>

我的复选框如下所示:

<input type="checkbox" name="activate[]" class="setSetting" value="<?php echo $row["id"]; ?>">
<input type="checkbox" name="activate[<?php echo $row["id"]; ?>]" class="setSetting" value="<?php echo $row["id"]; ?>">
 id | eSetting
----+----------
  1 |        1
  2 |     NULL
  3 |        3

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


这里有一个很好的教程解释它是如何工作的:

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


下面是一个很好的教程,解释了它的工作原理:

只有那些被考虑(即选中)的复选框才会被提交。这意味着只有选中的复选框在
$\u POST['activate']
中可用

要确定是否选中了复选框,可以使用检查特定ID值是否位于
$\u POST['activate']

array_search('12345', $_POST['activate'], true)
isset($_POST['activate']['12345'])
array_key_exists('12345', $_POST['activate'])
如果更改控件的名称以使用ID作为键,如下所示:

<input type="checkbox" name="activate[]" class="setSetting" value="<?php echo $row["id"]; ?>">
<input type="checkbox" name="activate[<?php echo $row["id"]; ?>]" class="setSetting" value="<?php echo $row["id"]; ?>">
 id | eSetting
----+----------
  1 |        1
  2 |     NULL
  3 |        3

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

$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已设置,则结果应如下所示:

<input type="checkbox" name="activate[]" class="setSetting" value="<?php echo $row["id"]; ?>">
<input type="checkbox" name="activate[<?php echo $row["id"]; ?>]" class="setSetting" value="<?php echo $row["id"]; ?>">
 id | eSetting
----+----------
  1 |        1
  2 |     NULL
  3 |        3
因此,如果
$row[1]
为空(非活动选项),则
$row[0]
中的ID将添加到
$insert
数组中,前提是请求中设置了相应的选项(
$activate[$row[0]]
,以直接访问)。对于那些已激活但未在请求中设置的选项,也会执行相同的操作


最后插入
$insert
中收集的选项,删除
$delete
中的选项。

仅提交已考虑(即已选中)的复选框。这意味着只有选中的复选框在
$\u POST['activate']
中可用

要确定是否选中了复选框,可以使用检查特定ID值是否位于
$\u POST['activate']

array_search('12345', $_POST['activate'], true)
isset($_POST['activate']['12345'])
array_key_exists('12345', $_POST['activate'])
如果更改控件的名称以使用ID作为键,如下所示:

<input type="checkbox" name="activate[]" class="setSetting" value="<?php echo $row["id"]; ?>">
<input type="checkbox" name="activate[<?php echo $row["id"]; ?>]" class="setSetting" value="<?php echo $row["id"]; ?>">
 id | eSetting
----+----------
  1 |        1
  2 |     NULL
  3 |        3

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

$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已设置,则结果应如下所示:

<input type="checkbox" name="activate[]" class="setSetting" value="<?php echo $row["id"]; ?>">
<input type="checkbox" name="activate[<?php echo $row["id"]; ?>]" class="setSetting" value="<?php echo $row["id"]; ?>">
 id | eSetting
----+----------
  1 |        1
  2 |     NULL
  3 |        3
因此,如果
$row[1]
为空(非活动选项),则
$row[0]
中的ID将添加到
$insert
数组中,前提是请求中设置了相应的选项(
$activate[$row[0]]
,以直接访问)。对于那些已激活但未在请求中设置的选项,也会执行相同的操作


最后,
$insert
中收集的选项被插入,
$delete
中的选项被删除。

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

        $activate = $_POST['activate']; 
        foreach($activate as $a){
           if($activate){
              echo $a ."<br>";
           }
        }
$activate=$\u POST['activate'];
foreach($a激活){
如果($activate){
回声$a.“
”; } }

尽管数组应仅包含已检查的值。

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

        $activate = $_POST['activate']; 
        foreach($activate as $a){
           if($activate){
              echo $a ."<br>";
           }
        }
$activate=$\u POST['activate'];
foreach($a激活){
如果($activate){
回声$a.“
”; } }

虽然数组应该只包含那些选中的值。

复选框只有勾选后才会提交。如果它们被取消勾选,PHP将不会在$u POST中看到它们

由于使用方括号(即
activate[]
),我假设您有多个名称相同的方括号。这将使它很难分辨哪些被勾选,因为您只会得到一个被勾选的数组;你会知道有多少,但不知道是哪一个

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

然后,您仍将获得仅包含勾选的数组,但通过查看数组键,您将能够知道它们在
foreach
循环中


希望对您有所帮助。

复选框只有在勾选后才会提交。如果它们被取消勾选,PHP将不会在$u POST中看到它们

由于使用方括号(即
activate[]
),我假设您有多个名称相同的方括号。这将使它很难分辨哪些被勾选,因为您只会得到一个被勾选的数组;你会知道有多少,但不知道是哪一个

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

然后仍然会得到仅包含w的数组