php选课实现
PHP选课系统实现
实现一个PHP选课系统需要结合数据库操作、用户认证和前端交互。以下是一个基本的实现方案:
数据库设计
创建必要的数据库表结构:

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
role ENUM('admin', 'teacher', 'student') NOT NULL
);
CREATE TABLE courses (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
teacher_id INT,
max_students INT,
FOREIGN KEY (teacher_id) REFERENCES users(id)
);
CREATE TABLE enrollments (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES users(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
用户认证系统
实现基本的登录功能:
session_start();
function login($username, $password) {
$db = new PDO('mysql:host=localhost;dbname=course_system', 'username', 'password');
$stmt = $db->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['role'] = $user['role'];
return true;
}
return false;
}
选课功能实现
学生选课接口:

function enrollCourse($studentId, $courseId) {
$db = new PDO('mysql:host=localhost;dbname=course_system', 'username', 'password');
// 检查课程是否已满
$stmt = $db->prepare("SELECT COUNT(*) as count FROM enrollments WHERE course_id = ?");
$stmt->execute([$courseId]);
$result = $stmt->fetch();
$stmt = $db->prepare("SELECT max_students FROM courses WHERE id = ?");
$stmt->execute([$courseId]);
$course = $stmt->fetch();
if ($result['count'] >= $course['max_students']) {
return "课程已满";
}
// 检查是否已选
$stmt = $db->prepare("SELECT * FROM enrollments WHERE student_id = ? AND course_id = ?");
$stmt->execute([$studentId, $courseId]);
if ($stmt->fetch()) {
return "已选过该课程";
}
// 选课
$stmt = $db->prepare("INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)");
if ($stmt->execute([$studentId, $courseId])) {
return "选课成功";
}
return "选课失败";
}
课程列表展示
显示可选课程:
function getAvailableCourses() {
$db = new PDO('mysql:host=localhost;dbname=course_system', 'username', 'password');
$stmt = $db->query("
SELECT c.id, c.name, u.username as teacher,
c.max_students, COUNT(e.id) as enrolled
FROM courses c
LEFT JOIN users u ON c.teacher_id = u.id
LEFT JOIN enrollments e ON c.id = e.course_id
GROUP BY c.id
");
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
前端交互
简单的HTML选课界面:
<div class="course-list">
<?php foreach (getAvailableCourses() as $course): ?>
<div class="course">
<h3><?= htmlspecialchars($course['name']) ?></h3>
<p>教师: <?= htmlspecialchars($course['teacher']) ?></p>
<p>已选人数: <?= $course['enrolled'] ?>/<?= $course['max_students'] ?></p>
<form method="post" action="enroll.php">
<input type="hidden" name="course_id" value="<?= $course['id'] ?>">
<button type="submit">选课</button>
</form>
</div>
<?php endforeach; ?>
</div>
安全注意事项
- 使用预处理语句防止SQL注入
- 对输出内容进行HTML转义
- 密码使用password_hash()存储
- 实施CSRF防护
- 限制不同角色的权限
这个基础实现可以进一步扩展,添加课程退选、课程评价、时间冲突检查等功能。根据实际需求,可能需要增加更多的表和字段。






