实现仅提示未入库IPv4地址的自动补全文本框
解决IPv4地址自动补全提示未入库IP的问题
问题说明
开发IP地址管理系统时,现有文本框自动补全仅提示数据库中已存在的IPv4地址,需要修改为仅提示未存入dspia_main表中的合法IPv4地址:当用户输入前几段octet(如168.0.0.)时,自动补全展示该段下所有未入库的可选IP。当前代码存在两个核心问题:
- 未验证拼接后的IP是否已入库
- 直接拼接数值会生成错误IP(如
192.1001),未限制范围到单个octet
解决方案
修改fetchData.php的逻辑,实现合法IP前缀解析、已入库IP排查、未入库IP生成的完整流程:
修改后的fetchData.php
<?php if(!empty($_GET['term'])) { include('db_conn.php'); $term = trim($_GET['term']); $term = mysqli_real_escape_string($conn, $term); $output = array(); // 拆分输入为octet,过滤出合法的0-255数值段 $octets = explode('.', $term); $validOctets = array_filter($octets, function($octet) { return is_numeric($octet) && $octet >= 0 && $octet <= 255; }); $prefixLength = count($validOctets); // 仅处理1-3段合法octet的输入 if ($prefixLength >= 1 && $prefixLength <= 3) { $prefix = implode('.', $validOctets) . '.'; // 查询当前前缀下已入库的所有IP $query = "SELECT ip_v4 FROM dspia_main WHERE ip_v4 LIKE '" . $prefix . "%' AND state_id = '1'"; $result = $conn->query($query); // 存储已存在的IP,用于快速排除 $existingIps = array(); while ($row = mysqli_fetch_array($result)) { $existingIps[] = $row['ip_v4']; } // 生成当前段所有合法的octet值(0-255) foreach(range(0, 255) as $val) { $newIp = ''; // 根据输入的前缀类型生成对应的IP或IP前缀 if (substr($term, -1) === '.') { if ($prefixLength == 3) { // 输入为三段带点(如168.0.0.),生成完整IPv4地址 $newIp = $prefix . $val; } else { // 输入为1-2段带点,生成下一级前缀(如192.168.0.) $newIp = $prefix . $val . '.'; } } else { // 输入不带点,补全当前octet的合法数值 $currentOctet = end($validOctets); $possibleOctet = $currentOctet . $val; if ($possibleOctet >= 0 && $possibleOctet <= 255) { array_pop($validOctets); $validOctets[] = $possibleOctet; $newIp = implode('.', $validOctets); // 若已到第三段,添加点号方便继续输入第四段 if (count($validOctets) == 3) { $newIp .= '.'; } } } // 验证生成的IP/前缀合法性,排除已入库的完整IP if (!empty($newIp)) { if (filter_var($newIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if (!in_array($newIp, $existingIps)) { $output[] = $newIp; } } elseif (substr($newIp, -1) === '.' && count(explode('.', $newIp)) <= 4) { $output[] = $newIp; } } } } // 限制输出数量,避免补全列表过长 $output = array_slice($output, 0, 10); mysqli_close($conn); echo json_encode($output); } ?>
核心逻辑说明
- 合法前缀解析:拆分用户输入的IP段,仅保留0-255的合法数值,避免生成错误IP
- 已入库IP排查:一次性查询当前前缀下所有已存在的IP,存入数组实现快速校验
- 智能IP生成:
- 三段带点输入:生成第四段完整IP,自动排除已入库的地址
- 1-2段带点输入:生成下一级前缀,引导用户逐步输入完整IP
- 不带点输入:补全当前octet的合法数值,确保不超出IPv4范围
- 结果限制:限制输出10条结果,保证自动补全的流畅性
前端代码说明
newip.php无需修改,保持原有的autocomplete配置即可正常工作。
内容的提问来源于stack exchange,提问作者AminCoD
相关产品推荐
相关产品推荐

