将列字段的值与列行中的值进行比较,并按照检查和未检查的复选框进行打印



我有一个带有2个表的简单DB:

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

i使用Active_services中的服务列的值作为复选框的形式,该表格将将检查值发布到表设备,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属性添加到输入字段来标记复选框"已检查"。因此,如果您从数据库中检索选定项目的列表,则可以使用这些列表来确定是否应将检查的属性添加到输入字段中。

它将成为这样的东西:

<?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>

我还为您提供了一些额外的改进点,这与您的问题有些相关:

  • 正如其他人已经在评论中提到的那样,您应该将表标准化(即不将所有活动服务放入一个列中,而是使用一个单独的表格,其中包含device,service Pairs)
  • 而不是在设备表中使用服务的名称,您可以更好地参考active_services表中的服务ID并将其设置为外键。这将提高性能并保证表中的一致性(即,如果正确设置,则无法在设备表中使用不存在的服务)。

相关内容

  • 没有找到相关文章

最新更新