当前位置:首页 > PHP

php选课实现

2026-01-29 17:30:09PHP

PHP选课系统实现要点

数据库设计

创建课程表(courses)和学生表(students)是基础。课程表应包含课程ID、名称、容量等字段,学生表包含学号、姓名等信息。需要中间表(student_courses)记录选课关系。

CREATE TABLE courses (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    capacity INT NOT NULL,
    credit INT
);

CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    student_id VARCHAR(20) UNIQUE NOT NULL,
    name VARCHAR(50) NOT NULL
);

CREATE TABLE student_courses (
    student_id INT,
    course_id INT,
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(id),
    FOREIGN KEY (course_id) REFERENCES courses(id)
);

连接数据库

使用PDO或MySQLi扩展连接MySQL数据库。PDO提供更好的安全性和兼容性。

$dsn = 'mysql:host=localhost;dbname=course_system';
$username = 'username';
$password = 'password';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

选课功能实现

检查课程容量和避免重复选课是关键逻辑。需要事务处理保证数据一致性。

php选课实现

function enrollCourse($studentId, $courseId) {
    global $pdo;

    try {
        $pdo->beginTransaction();

        // 检查是否已选
        $stmt = $pdo->prepare("SELECT COUNT(*) FROM student_courses 
                              WHERE student_id = ? AND course_id = ?");
        $stmt->execute([$studentId, $courseId]);
        if ($stmt->fetchColumn() > 0) {
            throw new Exception("已选过该课程");
        }

        // 检查课程容量
        $stmt = $pdo->prepare("SELECT COUNT(*) FROM student_courses WHERE course_id = ?");
        $stmt->execute([$courseId]);
        $current = $stmt->fetchColumn();

        $stmt = $pdo->prepare("SELECT capacity FROM courses WHERE id = ?");
        $stmt->execute([$courseId]);
        $capacity = $stmt->fetchColumn();

        if ($current >= $capacity) {
            throw new Exception("课程已满");
        }

        // 执行选课
        $stmt = $pdo->prepare("INSERT INTO student_courses (student_id, course_id) VALUES (?, ?)");
        $stmt->execute([$studentId, $courseId]);

        $pdo->commit();
        return true;
    } catch (Exception $e) {
        $pdo->rollBack();
        return $e->getMessage();
    }
}

前端界面

简单的HTML表单可以让学生选择课程。课程列表应从数据库动态获取。

<form action="enroll.php" method="post">
    <select name="course_id">
        <?php
        $stmt = $pdo->query("SELECT id, name FROM courses");
        while ($row = $stmt->fetch()) {
            echo "<option value='{$row['id']}'>{$row['name']}</option>";
        }
        ?>
    </select>
    <input type="hidden" name="student_id" value="1"> <!-- 实际应从会话获取 -->
    <button type="submit">选课</button>
</form>

安全性考虑

防止SQL注入需要使用预处理语句。XSS防护需要对输出进行转义。

php选课实现

// 使用预处理语句防止SQL注入
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);

// 输出转义防止XSS
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

用户认证

实现登录系统确保只有注册学生能选课。使用会话管理用户状态。

session_start();

function login($studentId, $password) {
    // 验证学生信息...
    $_SESSION['student_id'] = $studentId;
}

function isLoggedIn() {
    return isset($_SESSION['student_id']);
}

扩展功能

选课系统可添加退课功能、课程查询、冲突检测等。分页显示大量课程数据提升用户体验。

// 分页查询
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;

$stmt = $pdo->prepare("SELECT * FROM courses LIMIT ? OFFSET ?");
$stmt->bindValue(1, $perPage, PDO::PARAM_INT);
$stmt->bindValue(2, $offset, PDO::PARAM_INT);
$stmt->execute();

以上实现提供了PHP选课系统的基本框架,可根据实际需求进一步扩展和完善。

标签: php
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。…

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (…

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开:…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="uploa…