php实现答题
PHP 实现答题系统的基本方法
数据库设计
创建数据库表存储题目、选项和用户答案。常见表包括questions(题目表)、options(选项表)和user_answers(用户答案表)。
CREATE TABLE questions (
id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT NOT NULL
);
CREATE TABLE options (
id INT PRIMARY KEY AUTO_INCREMENT,
question_id INT,
content TEXT NOT NULL,
is_correct BOOLEAN DEFAULT false,
FOREIGN KEY (question_id) REFERENCES questions(id)
);
CREATE TABLE user_answers (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
question_id INT,
option_id INT,
FOREIGN KEY (question_id) REFERENCES questions(id),
FOREIGN KEY (option_id) REFERENCES options(id)
);
显示题目 从数据库获取题目和选项并展示给用户。
$pdo = new PDO('mysql:host=localhost;dbname=quiz', 'username', 'password');
$stmt = $pdo->query("SELECT * FROM questions");
$questions = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($questions as $question) {
echo "<h3>{$question['content']}</h3>";
$stmt = $pdo->prepare("SELECT * FROM options WHERE question_id = ?");
$stmt->execute([$question['id']]);
$options = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<form method='post'>";
foreach ($options as $option) {
echo "<input type='radio' name='q{$question['id']}' value='{$option['id']}'> {$option['content']}<br>";
}
echo "</form>";
}
处理用户提交 接收用户提交的答案并存储到数据库。
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
foreach ($_POST as $key => $value) {
if (strpos($key, 'q') === 0) {
$questionId = substr($key, 1);
$optionId = $value;
$stmt = $pdo->prepare("INSERT INTO user_answers (user_id, question_id, option_id) VALUES (?, ?, ?)");
$stmt->execute([1, $questionId, $optionId]); // 假设用户ID为1
}
}
echo "答案已提交!";
}
计算分数 根据正确答案计算用户得分。

$score = 0;
$stmt = $pdo->query("SELECT COUNT(*) as total FROM questions");
$totalQuestions = $stmt->fetch(PDO::FETCH_ASSOC)['total'];
$stmt = $pdo->prepare("
SELECT COUNT(*) as correct
FROM user_answers ua
JOIN options o ON ua.option_id = o.id
WHERE ua.user_id = ? AND o.is_correct = true
");
$stmt->execute([1]); // 假设用户ID为1
$correctAnswers = $stmt->fetch(PDO::FETCH_ASSOC)['correct'];
$score = ($correctAnswers / $totalQuestions) * 100;
echo "您的得分: {$score}%";
高级功能实现
随机出题 从题库中随机抽取指定数量的题目。
$limit = 10; // 抽取10题
$stmt = $pdo->query("SELECT * FROM questions ORDER BY RAND() LIMIT $limit");
$randomQuestions = $stmt->fetchAll(PDO::FETCH_ASSOC);
倒计时功能 使用JavaScript实现答题倒计时。
<div id="timer">剩余时间: 30:00</div>
<script>
let timeLeft = 30 * 60; // 30分钟
setInterval(() => {
timeLeft--;
let minutes = Math.floor(timeLeft / 60);
let seconds = timeLeft % 60;
document.getElementById('timer').innerText = `剩余时间: ${minutes}:${seconds.toString().padStart(2, '0')}`;
if (timeLeft <= 0) {
alert('时间到!');
document.forms[0].submit();
}
}, 1000);
</script>
结果分析 展示每道题的正确与否和答案解析。

$stmt = $pdo->prepare("
SELECT q.content as question, o.content as user_answer,
o.is_correct, c.content as correct_answer
FROM user_answers ua
JOIN questions q ON ua.question_id = q.id
JOIN options o ON ua.option_id = o.id
JOIN options c ON c.question_id = q.id AND c.is_correct = true
WHERE ua.user_id = ?
");
$stmt->execute([1]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $result) {
$status = $result['is_correct'] ? '正确' : '错误';
echo "<p>题目: {$result['question']}</p>";
echo "<p>您的答案: {$result['user_answer']} ($status)</p>";
echo "<p>正确答案: {$result['correct_answer']}</p><hr>";
}
安全注意事项
防止SQL注入 使用预处理语句处理所有用户输入。
$stmt = $pdo->prepare("INSERT INTO user_answers (user_id, question_id, option_id) VALUES (?, ?, ?)");
$stmt->execute([$userId, $questionId, $optionId]);
CSRF防护 在表单中添加CSRF令牌。
session_start();
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 在表单中
echo "<input type='hidden' name='csrf_token' value='{$_SESSION['csrf_token']}'>";
// 处理提交时验证
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('无效的CSRF令牌');
}
输入验证 确保用户提交的数据有效。
$optionId = (int)$_POST['q1']; // 强制转换为整数
if ($optionId <= 0) {
die('无效的选项ID');
}
以上方法提供了PHP实现答题系统的基础框架,可根据实际需求进行扩展和优化。






