ajax实现无刷新省市县三级联动

  实现无刷新的省市县三级联动可以使用 Ajax 技术,通过前端 JavaScript 发送异步请求,从后端获取数据并动态更新页面内容。以下是一个简单的例子,假设你已经有一个包含省市县数据的数据库。

  数据库表结构

  假设有三个表:provinces、cities、counties 分别存储省、市、县的数据。

CREATE TABLE provinces (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL
);

CREATE TABLE cities (
    id INT PRIMARY KEY AUTO_INCREMENT,
    province_id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    FOREIGN KEY (province_id) REFERENCES provinces(id)
);

CREATE TABLE counties (
    id INT PRIMARY KEY AUTO_INCREMENT,
    city_id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    FOREIGN KEY (city_id) REFERENCES cities(id)
);

  HTML 页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>省市县三级联动</title>
    <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
</head>
<body>
    <label for="province">省:</label>
    <select id="province" name="province" onchange="getCities()">
        <!-- 省份选项将通过Ajax填充 -->
    </select>

    <label for="city">市:</label>
    <select id="city" name="city" onchange="getCounties()">
        <!-- 城市选项将通过Ajax填充 -->
    </select>

    <label for="county">县:</label>
    <select id="county" name="county">
        <!-- 县选项将通过Ajax填充 -->
    </select>

    <script>
        $(document).ready(function() {
            getProvinces(); // 页面加载时获取省份列表
        });

        function getProvinces() {
            $.ajax({
                url: 'get_data.php',
                type: 'POST',
                data: { action: 'get_provinces' },
                success: function(response) {
                    $('#province').html(response);
                }
            });
        }

        function getCities() {
            var provinceId = $('#province').val();
            $.ajax({
                url: 'get_data.php',
                type: 'POST',
                data: { action: 'get_cities', province_id: provinceId },
                success: function(response) {
                    $('#city').html(response);
                }
            });
        }

        function getCounties() {
            var cityId = $('#city').val();
            $.ajax({
                url: 'get_data.php',
                type: 'POST',
                data: { action: 'get_counties', city_id: cityId },
                success: function(response) {
                    $('#county').html(response);
                }
            });
        }
    </script>
</body>
</html>

  数据库配置(config.php)

<?php
// 数据库连接配置
define('DB_HOST', 'your_db_host');
define('DB_USER', 'your_db_user');
define('DB_PASS', 'your_db_password');
define('DB_NAME', 'your_db_name');

// 创建数据库连接
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

// 检查连接是否成功
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

  获取省份、城市、县数据的 PHP 脚本(get_data.php)

<?php
include 'config.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = $_POST['action'];

    if ($action === 'get_provinces') {
        $provinces = getProvinces();
        echo generateOptions($provinces);
    } elseif ($action === 'get_cities') {
        $provinceId = $_POST['province_id'];
        $cities = getCities($provinceId);
        echo generateOptions($cities);
    } elseif ($action === 'get_counties') {
        $cityId = $_POST['city_id'];
        $counties = getCounties($cityId);
        echo generateOptions($counties);
    }
}

function getProvinces() {
    global $conn;
    $sql = "SELECT * FROM provinces";
    $result = $conn->query($sql);
    $provinces = [];

    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $provinces[] = $row;
        }
    }

    return $provinces;
}

function getCities($provinceId) {
    global $conn;
    $sql = "SELECT * FROM cities WHERE province_id = $provinceId";
    $result = $conn->query($sql);
    $cities = [];

    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $cities[] = $row;
        }
    }

    return $cities;
}

function getCounties($cityId) {
    global $conn;
    $sql = "SELECT * FROM counties WHERE city_id = $cityId";
    $result = $conn->query($sql);
    $counties = [];

    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $counties[] = $row;
        }
    }

    return $counties;
}

function generateOptions($data) {
    $options = '';
    foreach ($data as $item) {
        $options .= '<option value="' . $item['id'] . '">' . $item['name'] . '</option>';
    }
    return $options;
}

  上述代码中,通过 Ajax 发送请求到 get_data.php,get_data.php 根据请求的动作(action)获取相应的省市县数据并返回 HTML 选项,然后在前端使用 JavaScript 更新对应的 <select> 元素。替换上述代码中的数据库连接配置信息,并根据实际的数据库表结构进行调整。

本站原创内容,如需转载请注明来源:https://www.liutonghui.com/136.html

上一篇 2016-06-25
下一篇 2016-09-16

评论列表(0条)

  • 暂时没有评论!

发表评论

captcha

相关推荐

  • JavaScrpit中异步请求Ajax实现,多个Ajax请求数据交互

      在前端页面开发的过程中,经常使用到Ajax请求,异步提交表单数据,或者异步刷新页面。   一般来说,使用Jquery中的ReferenceError: katex is not defined.post,$.getJSON,非常方便,但是有的时候,我们只需要ajax功能,这样引入Jquery比较不划算。   所以接下来便用原生JavaScrpit实现一个简单的Ajax请求,并说明ajax请求中的跨域访问问题,以及多个ajax请求的数......

    2017-07-19
    9720
  • 高效jQuery的奥秘

      讨论jQuery和javascript性能的文章并不罕见。然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码。好的代码会带来速度的提升。快速渲染和响应意味着更好的用户体验。   首先,在脑子里牢牢记住jQuery就是javascript。这意味着我们应该采取相同的编码惯例,风格指南和最佳实践。   首先,如果你是一个javascript新手,我建议您阅读 《JavaScri......

    2015-12-09
    15080
  • HTML5中article元素与section元素有什么区别

      在HTML5中,为了使文档的结构更加清晰明确,追加了几个与页眉、页脚、内容区块等文档结构相关联的结构元素。内容区块是指将HTML页面按逻辑分割后的单位。例如对于书籍来说,章、节可以称为内容区块;对于博客网站来说,导航菜单、文章正文、文章的评论等每一个部分都可称为内容区块。   在HTML5中新增的主体结构元素中有两个元素分别article元素与section元素,这两个元素是什么意思?通常用于哪些内容区块?何时用article元素......

    2014-10-27
    18700
  • Ajax实现页面无刷新添加数据

      使用 Ajax 可以实现页面无刷新添加数据。Ajax(Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下与服务器进行通信的技术。以下是一个简单的例子,演示了如何使用 Ajax 在页面中添加数据而不刷新整个页面。 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Ajax添加数据示例&lt;/ti......

    2020-04-16
    15660
  • Mysql中utf8和utf8mb4区别

      一、简介   MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。   二、内容描述   那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢?原来mysql支持的utf8编码最大......

    2020-07-10
    15060
  • jQuery Ajax实现批量删除数据

      在 jQuery 中使用 Ajax 实现批量删除的基本思路如下:   在前端,使用 jQuery 监听&ldquo;批量删除&rdquo;按钮的点击事件,收集用户选择的要删除的项目的标识(例如,ID)。   使用 Ajax 发送异步请求到后端,将要删除的项目标识传递给服务器。   在后端,接收到请求后,根据接收到的项目标识进行删除操作,并返回相应的结果给前端。   以下是一个简单的示例代码:   HTML &lt;!DOCTYPE ......

    2015-06-15
    17190
  • 再谈PHP错误与异常处理

      请一定要注意,没有特殊说明:本例 PHP Version &lt; 7   说起PHP异常处理,大家首先会想到try-catch,那好,我们先看一段程序吧:有一个test.php文件,有一段简单的PHP程序,内容如下,然后命令行执行:php test.php &lt;?php $num = 0; try { echo 1/$num; } catch (Exception $e){ ......

    2017-06-12
    14010
  • 华为Mate60手机开售,麒麟5G芯片回归,遥遥领先!

      没开发布会,没有预告就直接开卖备受关注的旗舰手机,华为Mate60系列算是开了个头。这几天华为登上了热搜,这次是因为华为Mate60手机携带&ldquo;麒麟芯片&rdquo;提前开售,瞬间售罄,同时也标志着麒麟5G芯片的正式回归。这一消息在各大主流媒体平台上迅速引发热议,网友们纷纷发表意见,自媒体人也争相蹭热度,提出各自观点。   如果你打开华为商城app,可以看到华为已经在自家商城上架了华为Mate60系列手机,而这些手机已经......

    2023-08-31
    7570