You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现仅提示未入库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);
}
?>

核心逻辑说明

  1. 合法前缀解析:拆分用户输入的IP段,仅保留0-255的合法数值,避免生成错误IP
  2. 已入库IP排查:一次性查询当前前缀下所有已存在的IP,存入数组实现快速校验
  3. 智能IP生成:
    • 三段带点输入:生成第四段完整IP,自动排除已入库的地址
    • 1-2段带点输入:生成下一级前缀,引导用户逐步输入完整IP
    • 不带点输入:补全当前octet的合法数值,确保不超出IPv4范围
  4. 结果限制:限制输出10条结果,保证自动补全的流畅性

前端代码说明

newip.php无需修改,保持原有的autocomplete配置即可正常工作。

内容的提问来源于stack exchange,提问作者AminCoD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:24:30