php实现在线考试
PHP实现在线考试系统
数据库设计
在线考试系统需要设计合理的数据库结构。常见表包括用户表、试题表、考试记录表等。
用户表(users)示例结构:
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,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
试题表(questions)示例结构:
CREATE TABLE questions (
id INT AUTO_INCREMENT PRIMARY KEY,
question_text TEXT NOT NULL,
option_a VARCHAR(255) NOT NULL,
option_b VARCHAR(255) NOT NULL,
option_c VARCHAR(255) NOT NULL,
option_d VARCHAR(255) NOT NULL,
correct_answer CHAR(1) NOT NULL,
score INT NOT NULL,
created_by INT,
FOREIGN KEY (created_by) REFERENCES users(id)
);
用户认证
实现基于session的用户登录系统:
session_start();
function login($username, $password) {
// 数据库验证
$user = $db->query("SELECT * FROM users WHERE username = '$username'");
if(password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['role'] = $user['role'];
return true;
}
return false;
}
试题管理
管理员或教师可以添加试题:
function addQuestion($data) {
$stmt = $db->prepare("INSERT INTO questions
(question_text, option_a, option_b, option_c, option_d, correct_answer, score, created_by)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->execute([
$data['question_text'],
$data['option_a'],
$data['option_b'],
$data['option_c'],
$data['option_d'],
$data['correct_answer'],
$data['score'],
$_SESSION['user_id']
]);
}
考试功能
随机抽取试题生成试卷:
function generateExam($num_questions) {
$questions = $db->query("SELECT * FROM questions ORDER BY RAND() LIMIT $num_questions");
return $questions;
}
记录考生答案和计算分数:
function submitExam($answers) {
$total_score = 0;
foreach($answers as $qid => $answer) {
$question = $db->query("SELECT * FROM questions WHERE id = $qid");
if($question['correct_answer'] == $answer) {
$total_score += $question['score'];
}
}
$stmt = $db->prepare("INSERT INTO exam_results
(user_id, score, submitted_at) VALUES (?, ?, NOW())");
$stmt->execute([$_SESSION['user_id'], $total_score]);
return $total_score;
}
安全考虑
- 使用预处理语句防止SQL注入
- 密码使用password_hash()存储
- 重要操作进行权限验证
- 考试时间限制处理
前端交互
使用Ajax实现无刷新答题体验:
$('.answer-btn').click(function() {
var qid = $(this).data('qid');
var answer = $(this).data('answer');
$.post('save_answer.php', {
question_id: qid,
answer: answer
}, function(response) {
// 更新界面
});
});
计时功能
JavaScript实现考试倒计时:
var examTime = 60 * 30; // 30分钟
var timer = setInterval(function() {
examTime--;
var minutes = Math.floor(examTime / 60);
var seconds = examTime % 60;
$('#timer').text(minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
if(examTime <= 0) {
clearInterval(timer);
alert('时间到!');
submitExam();
}
}, 1000);
以上代码提供了PHP实现在线考试系统的基本框架,可根据实际需求进行扩展和完善。







