将列字段中的值与列行中的值进行比较,并打印为选中和未选中的复选框
compare values from column field with values from column rows and print as checked and unchecked checkboxes
我有一个带有 2 tables 的简单数据库:
1. active_services 2. devices
------------------ ------------------------------
id | service id | active_services_value
------------------ ------------------------------
1 | AD 1 | AD,DNS,DHCP
2 | FTP 2 | FTP,SMB
3 | DNS 3 | FTP
4 | DHCP 4 |
5 | SMB 5 | AD Backup
6 | AD Backup
我使用 active_services 中服务列的值作为表单的复选框,该表单将 post 选中的值发送到 table 设备,列 active_service_values。我的代码如下所示:
<?php
if($active_services_value != ""){
// Need to generate a list of checkboxes from active_services but
// for each value in the active_services_field coresponding
// to the searched id (e.g for id 1, value1 = AD, value2 = DNS,
// value3 = DHCP ) set the checkboxes as checked
} else {
// display the service in active_services as checkboxes
$q = "SELECT * from active_services";
$r = mysqli_query($dbc, $q);
while($list = mysqli_fetch_assoc($r)){
?>
<div class="col-xs-4"><input type="checkbox" name="checkboxvar[]" value="<?php echo $list['service']; ?>"><?php echo $list['service'];?>
</div>
<?php } } ?>
</div>
?>
我的问题是:
如何显示 "checked" 复选框,使用户可以取消选中某些复选框,同时还显示其余未选中的复选框,再次让用户可以选中新选项?
提前感谢大家的帮助。
您可以通过将 checked
属性添加到输入字段来标记复选框 "checked"。因此,如果您从数据库中检索所选项目的列表,您可以使用这些来确定是否应该将选中的属性添加到输入字段。
会变成这样:
<?php
$stmt = $dbc->prepare("SELECT active_services_value FROM devices WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($serviceList);
$stmt->fetch();
//transform the list of services into an array
$services = explode($serviceList, ",");
$q = "SELECT * from active_services";
$r = mysqli_query($dbc, $q);
while($list = mysqli_fetch_assoc($r)){
?>
<div class="col-xs-4">
<input type="checkbox" name="checkboxvar[]"
value="<?php echo $list['service'];?>"
<?php if (in_array($list['service'], $services) { echo "checked"; } ?>>
<?php echo $list['service'];?>
</div>
<?php } } ?>
</div>
我还有几点需要改进,跟你的问题有点关系:
- 正如其他人在评论中已经提到的那样,您应该规范化您的 tables(即不要将所有活动服务放在一列中,而是使用单独的 table 来包含
device,service
对)
- 与其使用设备 table 中的服务名称,不如参考
active_services
table 中的服务 ID 并将其设置为外部服务钥匙。这将提高性能并保证您 table 的一致性(即,如果设置正确,将不可能在您的设备 table 中使用不存在的服务)。
我有一个带有 2 tables 的简单数据库:
1. active_services 2. devices
------------------ ------------------------------
id | service id | active_services_value
------------------ ------------------------------
1 | AD 1 | AD,DNS,DHCP
2 | FTP 2 | FTP,SMB
3 | DNS 3 | FTP
4 | DHCP 4 |
5 | SMB 5 | AD Backup
6 | AD Backup
我使用 active_services 中服务列的值作为表单的复选框,该表单将 post 选中的值发送到 table 设备,列 active_service_values。我的代码如下所示:
<?php
if($active_services_value != ""){
// Need to generate a list of checkboxes from active_services but
// for each value in the active_services_field coresponding
// to the searched id (e.g for id 1, value1 = AD, value2 = DNS,
// value3 = DHCP ) set the checkboxes as checked
} else {
// display the service in active_services as checkboxes
$q = "SELECT * from active_services";
$r = mysqli_query($dbc, $q);
while($list = mysqli_fetch_assoc($r)){
?>
<div class="col-xs-4"><input type="checkbox" name="checkboxvar[]" value="<?php echo $list['service']; ?>"><?php echo $list['service'];?>
</div>
<?php } } ?>
</div>
?>
我的问题是:
如何显示 "checked" 复选框,使用户可以取消选中某些复选框,同时还显示其余未选中的复选框,再次让用户可以选中新选项?
提前感谢大家的帮助。
您可以通过将 checked
属性添加到输入字段来标记复选框 "checked"。因此,如果您从数据库中检索所选项目的列表,您可以使用这些来确定是否应该将选中的属性添加到输入字段。
会变成这样:
<?php
$stmt = $dbc->prepare("SELECT active_services_value FROM devices WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($serviceList);
$stmt->fetch();
//transform the list of services into an array
$services = explode($serviceList, ",");
$q = "SELECT * from active_services";
$r = mysqli_query($dbc, $q);
while($list = mysqli_fetch_assoc($r)){
?>
<div class="col-xs-4">
<input type="checkbox" name="checkboxvar[]"
value="<?php echo $list['service'];?>"
<?php if (in_array($list['service'], $services) { echo "checked"; } ?>>
<?php echo $list['service'];?>
</div>
<?php } } ?>
</div>
我还有几点需要改进,跟你的问题有点关系:
- 正如其他人在评论中已经提到的那样,您应该规范化您的 tables(即不要将所有活动服务放在一列中,而是使用单独的 table 来包含
device,service
对) - 与其使用设备 table 中的服务名称,不如参考
active_services
table 中的服务 ID 并将其设置为外部服务钥匙。这将提高性能并保证您 table 的一致性(即,如果设置正确,将不可能在您的设备 table 中使用不存在的服务)。