当前位置:首页 > PHP

ajax php实现三级联动菜单

2026-04-03 06:04:54PHP

实现三级联动菜单(AJAX + PHP)

数据库准备
创建包含三级数据的表结构(例如省、市、区):

CREATE TABLE `province` (`id` INT PRIMARY KEY, `name` VARCHAR(50));  
CREATE TABLE `city` (`id` INT PRIMARY KEY, `pid` INT, `name` VARCHAR(50));  
CREATE TABLE `district` (`id` INT PRIMARY KEY, `cid` INT, `name` VARCHAR(50));  

前端HTML结构

<select id="province"></select>  
<select id="city"></select>  
<select id="district"></select>  

JavaScript(jQuery AJAX)

$(document).ready(function(){
    // 加载省份数据
    $.get("get_data.php?level=province", function(data){
        $("#province").html(data);
    });

    // 省份变化时加载城市
    $("#province").change(function(){
        var pid = $(this).val();
        $.get("get_data.php?level=city&pid="+pid, function(data){
            $("#city").html(data);
            $("#district").html('<option value="">选择区县</option>');
        });
    });

    // 城市变化时加载区县
    $("#city").change(function(){
        var cid = $(this).val();
        $.get("get_data.php?level=district&cid="+cid, function(data){
            $("#district").html(data);
        });
    });
});

PHP后端处理(get_data.php)

ajax php实现三级联动菜单

<?php
$db = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$level = $_GET['level'] ?? '';

if($level == 'province'){
    $stmt = $db->query("SELECT * FROM province");
    echo '<option value="">选择省份</option>';
    while($row = $stmt->fetch()){
        echo '<option value="'.$row['id'].'">'.$row['name'].'</option>';
    }
}
else if($level == 'city' && isset($_GET['pid'])){
    $stmt = $db->prepare("SELECT * FROM city WHERE pid = ?");
    $stmt->execute([$_GET['pid']]);
    echo '<option value="">选择城市</option>';
    while($row = $stmt->fetch()){
        echo '<option value="'.$row['id'].'">'.$row['name'].'</option>';
    }
}
else if($level == 'district' && isset($_GET['cid'])){
    $stmt = $db->prepare("SELECT * FROM district WHERE cid = ?");
    $stmt->execute([$_GET['cid']]);
    echo '<option value="">选择区县</option>';
    while($row = $stmt->fetch()){
        echo '<option value="'.$row['id'].'">'.$row['name'].'</option>';
    }
}
?>

关键优化点

  • 数据缓存:对静态数据使用Redis缓存
  • 错误处理:AJAX请求添加.fail()回调
  • 防SQL注入:使用PDO预处理语句
  • 前端体验:添加加载状态提示

扩展功能

  • 支持搜索过滤
  • 添加默认选中项
  • 多级联动数据懒加载

标签: 菜单ajax
分享给朋友:

相关文章

vue实现ajax实现注册

vue实现ajax实现注册

Vue 中通过 AJAX 实现用户注册 在 Vue 中实现用户注册功能,通常需要结合 AJAX 技术向后端发送注册请求。以下是具体实现方法: 安装 axios 依赖 axios 是 Vue 项目中常…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

uniapp 长按菜单

uniapp 长按菜单

实现长按菜单的方法 在UniApp中实现长按菜单功能,可以通过以下几种方式完成,具体取决于平台和需求。 使用@longpress事件绑定 在模板中为元素添加@longpress事件监听,触发后显示自…

vue实现悬浮菜单

vue实现悬浮菜单

实现悬浮菜单的基本思路 使用Vue实现悬浮菜单通常需要结合CSS定位和Vue的事件监听。核心是通过v-show或v-if控制菜单显隐,通过鼠标事件触发状态变化。 HTML结构示例 <templ…

vue实现横排菜单

vue实现横排菜单

实现横排菜单的方法 在Vue中实现横排菜单可以通过多种方式完成,以下是几种常见的实现方法。 使用Flex布局实现横排菜单 通过CSS Flex布局可以轻松实现横排菜单,代码简洁且兼容性好。 <…

vue实现菜单权限

vue实现菜单权限

基于路由的动态菜单权限控制 在Vue中实现菜单权限通常需要结合路由配置和用户角色/权限数据。以下是常见的实现方法: 路由配置中添加权限标识 // router.js const routes =…