【问题标题】:compare values from column field with values from column rows and print as checked and unchecked checkboxes将列字段中的值与列行中的值进行比较并打印为选中和未选中的复选框
【发布时间】:2015-05-12 14:47:16
【问题描述】:

我有一个带有 2 个表的简单数据库:

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 中服务列的值作为表单的复选框,该表单将检查的值发布到表设备,列 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>

?>

我的问题是:

如何显示“选中”复选框,让用户可以取消选中某些复选框,同时还显示未选中的剩余复选框,让用户可以检查新选项?

提前感谢大家的帮助。

【问题讨论】:

  • 简单。请参阅规范化。
  • 正如@Strawberry 提到的,您应该将表(尤其是设备)标准化为:1 - 简化数据操作和 2 - 提高性能。 en.wikipedia.org/wiki/Database_normalization
  • 如果服务列表很小且固定(如示例中),那么您可以存储一个位值。
  • @Strawberry 谢谢,您对表格的规范化是正确的。这是我将来会为我所有的项目做的事情。但是,对于当前的,由于它已经是一个“生产环境”,我不能做太多。目前我只是在数据库和一些脚本中添加了一些新选项,但仅此而已......

标签: php mysql checkbox compare


【解决方案1】:

您可以通过将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>

我还有一些与您的问题有些相关的额外改进点:

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

【讨论】:

  • 感谢您提供的代码,为匹配我的脚本进行了一些更改,它可以完美运行。对于未来的项目,我也会记住您的建议。再次感谢您。
  • 关于性能的观点有点误解,但关于数据完整性的观点是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多