php选课实现
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());
}
选课功能实现
检查课程容量和避免重复选课是关键逻辑。需要事务处理保证数据一致性。

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防护需要对输出进行转义。

// 使用预处理语句防止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选课系统的基本框架,可根据实际需求进一步扩展和完善。





