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

PHP+AJAX实现下拉框联动:选课程后从数据库加载学期数据

嘿,作为PHP新手搞联动下拉框确实容易踩坑,我来帮你把这个课程-学期联动的逻辑理清楚,直接上可运行的修正代码,再给你讲关键要点~

完整实现步骤

1. HTML 结构

先写两个下拉框,课程框预先加载选项(可以从数据库查询生成,这里先写示例选项),学期框初始提示用户先选课程:

<div>
  <label for="course">选择课程:</label>
  <select id="course" name="course">
    <option value="">请选择课程</option>
    <option value="1">PHP基础入门</option>
    <option value="2">MySQL数据库实战</option>
    <option value="3">Vue.js前端框架</option>
  </select>
</div>
<div style="margin-top: 10px;">
  <label for="semester">选择学期:</label>
  <select id="semester" name="semester">
    <option value="">请先选择课程</option>
  </select>
</div>

2. AJAX 逻辑(原生JS)

监听课程下拉框的change事件,一旦用户选了课程,就发请求到PHP后台拿对应的学期数据,然后动态渲染学期下拉框:

// 获取DOM元素
const courseSelect = document.getElementById('course');
const semesterSelect = document.getElementById('semester');

// 绑定change事件
courseSelect.addEventListener('change', function() {
  const selectedCourseId = this.value;

  // 如果没选课程,重置学期框
  if (!selectedCourseId) {
    semesterSelect.innerHTML = '<option value="">请先选择课程</option>';
    return;
  }

  // 创建AJAX请求
  const xhr = new XMLHttpRequest();
  xhr.open('GET', `GETUSER1.php?course_id=${selectedCourseId}`, true);

  // 请求成功后的处理
  xhr.onload = function() {
    if (this.status === 200) {
      try {
        // 解析后台返回的JSON数据
        const semesters = JSON.parse(this.responseText);
        
        // 清空学期框,添加默认选项
        semesterSelect.innerHTML = '<option value="">请选择学期</option>';
        
        // 遍历学期数据,生成下拉选项
        semesters.forEach(semester => {
          const option = document.createElement('option');
          option.value = semester.id;
          option.textContent = semester.name;
          semesterSelect.appendChild(option);
        });
      } catch (err) {
        console.error('数据解析失败:', err);
        semesterSelect.innerHTML = '<option value="">加载失败,请重试</option>';
      }
    } else {
      semesterSelect.innerHTML = '<option value="">加载失败,请重试</option>';
    }
  };

  // 网络错误处理
  xhr.onerror = function() {
    semesterSelect.innerHTML = '<option value="">网络异常,请检查连接</option>';
  };

  // 发送请求
  xhr.send();
});

3. PHP 后台(GETUSER1.php)

负责连接数据库,根据传过来的课程ID查询对应的学期,然后返回JSON格式的数据:

<?php
// 数据库配置(替换成你的实际信息)
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'your_password';
$dbName = 'your_database';

// 建立数据库连接
$conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);

// 检查连接是否成功
if ($conn->connect_error) {
  // 返回错误信息(JSON格式)
  die(json_encode(['error' => '数据库连接失败: ' . $conn->connect_error]));
}

// 获取前端传过来的课程ID,转成整数防止注入
$courseId = isset($_GET['course_id']) ? intval($_GET['course_id']) : 0;

// 如果课程ID无效,返回空数组
if ($courseId === 0) {
  die(json_encode([]));
}

// 预处理SQL语句,绝对不要直接把用户输入拼进SQL!
$stmt = $conn->prepare("SELECT id, semester_name FROM semesters WHERE course_id = ?");
// 绑定参数(i表示整数类型)
$stmt->bind_param("i", $courseId);
// 执行查询
$stmt->execute();
// 获取结果集
$result = $stmt->get_result();

// 把查询结果转成数组
$semesterList = [];
while ($row = $result->fetch_assoc()) {
  $semesterList[] = [
    'id' => $row['id'],
    'name' => $row['semester_name']
  ];
}

// 设置响应头为JSON格式
header('Content-Type: application/json');
// 输出JSON数据
echo json_encode($semesterList);

// 关闭资源
$stmt->close();
$conn->close();
?>
关键注意事项
  • SQL注入防护:一定要用预处理语句(prepare + bind_param),绝对不能直接把$_GET['course_id']拼进SQL里,这是新手最容易犯的安全错误!
  • 数据格式:后台返回JSON比返回HTML片段更灵活,前端处理起来也更可控。
  • 错误处理:要考虑各种异常情况(网络错误、数据库连接失败、数据解析失败),给用户明确的提示,避免页面卡住。
  • DOM操作:动态生成选项时,记得先清空原来的选项,再添加新的,避免重复渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:10:33