php实现选课
PHP 实现选课系统的基本方法
数据库设计
创建必要的数据库表来存储课程、学生和选课记录。主要表包括:

students:存储学生信息(id, name, email等)courses:存储课程信息(id, name, capacity等)enrollments:存储选课记录(student_id, course_id, enrollment_date)
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE courses (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
capacity INT NOT NULL,
description TEXT
);
CREATE TABLE enrollments (
student_id INT,
course_id INT,
enrollment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
连接数据库
使用PDO或MySQLi建立数据库连接:

$host = 'localhost';
$db = 'course_selection';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
选课功能实现
创建选课处理脚本,检查课程容量并插入选课记录:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$studentId = $_POST['student_id'];
$courseId = $_POST['course_id'];
// 检查课程是否已满
$stmt = $pdo->prepare("SELECT COUNT(*) as enrolled, capacity FROM enrollments
JOIN courses ON enrollments.course_id = courses.id
WHERE course_id = ?");
$stmt->execute([$courseId]);
$result = $stmt->fetch();
if ($result['enrolled'] < $result['capacity']) {
try {
$stmt = $pdo->prepare("INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)");
$stmt->execute([$studentId, $courseId]);
echo "选课成功!";
} catch (PDOException $e) {
if ($e->errorInfo[1] == 1062) {
echo "您已经选修过此课程";
} else {
echo "选课失败: " . $e->getMessage();
}
}
} else {
echo "课程已满,无法选课";
}
}
显示可选课程
创建页面显示所有可选课程及当前报名情况:
$courses = $pdo->query("
SELECT c.*,
COUNT(e.course_id) as enrolled,
c.capacity - COUNT(e.course_id) as remaining
FROM courses c
LEFT JOIN enrollments e ON c.id = e.course_id
GROUP BY c.id
")->fetchAll();
foreach ($courses as $course) {
echo "<div class='course'>";
echo "<h3>{$course['name']}</h3>";
echo "<p>{$course['description']}</p>";
echo "<p>已报名: {$course['enrolled']}/{$course['capacity']}</p>";
echo "<form method='post'>";
echo "<input type='hidden' name='student_id' value='1'>";
echo "<input type='hidden' name='course_id' value='{$course['id']}'>";
echo "<button type='submit'" . ($course['remaining'] <= 0 ? " disabled" : "") . ">";
echo $course['remaining'] <= 0 ? "已满" : "选课";
echo "</button>";
echo "</form>";
echo "</div>";
}
安全性考虑
- 使用预处理语句防止SQL注入
- 对用户输入进行验证和过滤
- 实现用户认证系统(登录/注销)
- 添加CSRF保护令牌
扩展功能
- 添加退课功能
- 实现课程时间冲突检查
- 添加课程评分和评价系统
- 开发管理员界面管理课程
- 实现选课时间段限制
以上代码提供了PHP实现选课系统的基本框架,可根据实际需求进行扩展和修改。






