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的数组