php实现答题
实现答题功能的基本思路
使用PHP实现答题功能通常涉及前端表单提交、后端数据处理和结果展示三个主要部分。以下是一个基础的实现方案:
数据库设计
创建数据库表存储题目和用户答案:
CREATE TABLE questions (
id INT AUTO_INCREMENT PRIMARY KEY,
question_text TEXT NOT NULL,
option_a VARCHAR(255),
option_b VARCHAR(255),
option_c VARCHAR(255),
option_d VARCHAR(255),
correct_answer CHAR(1)
);
CREATE TABLE user_answers (
id INT AUTO_INCREMENT PRIMARY KEY,
question_id INT,
user_answer CHAR(1),
FOREIGN KEY (question_id) REFERENCES questions(id)
);
前端表单页面
创建HTML表单供用户答题:
<form action="submit_answers.php" method="post">
<?php
// 连接数据库并获取题目
$pdo = new PDO('mysql:host=localhost;dbname=quiz_db', 'username', 'password');
$stmt = $pdo->query("SELECT * FROM questions");
while ($row = $stmt->fetch()) {
echo '<div class="question">';
echo '<h3>' . htmlspecialchars($row['question_text']) . '</h3>';
echo '<input type="radio" name="q'.$row['id'].'" value="A"> ' . htmlspecialchars($row['option_a']) . '<br>';
echo '<input type="radio" name="q'.$row['id'].'" value="B"> ' . htmlspecialchars($row['option_b']) . '<br>';
echo '<input type="radio" name="q'.$row['id'].'" value="C"> ' . htmlspecialchars($row['option_c']) . '<br>';
echo '<input type="radio" name="q'.$row['id'].'" value="D"> ' . htmlspecialchars($row['option_d']) . '<br>';
echo '</div>';
}
?>
<button type="submit">提交答案</button>
</form>
答案处理脚本
创建submit_answers.php处理用户提交:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=quiz_db', 'username', 'password');
// 获取所有题目ID
$questionIds = $pdo->query("SELECT id FROM questions")->fetchAll(PDO::FETCH_COLUMN);
$correctCount = 0;
$totalQuestions = count($questionIds);
foreach ($questionIds as $qid) {
$answerKey = 'q'.$qid;
if (isset($_POST[$answerKey])) {
$userAnswer = $_POST[$answerKey];
// 存储用户答案
$stmt = $pdo->prepare("INSERT INTO user_answers (question_id, user_answer) VALUES (?, ?)");
$stmt->execute([$qid, $userAnswer]);
// 检查答案是否正确
$correctAnswer = $pdo->query("SELECT correct_answer FROM questions WHERE id = $qid")->fetchColumn();
if ($userAnswer == $correctAnswer) {
$correctCount++;
}
}
}
// 显示结果
echo "您的得分: $correctCount / $totalQuestions";
?>
安全增强措施
使用预处理语句防止SQL注入:
$stmt = $pdo->prepare("INSERT INTO user_answers (question_id, user_answer) VALUES (:qid, :answer)");
$stmt->bindParam(':qid', $qid);
$stmt->bindParam(':answer', $userAnswer);
$stmt->execute();
添加CSRF保护:

session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF验证失败');
}
}
高级功能扩展
实现随机抽题:
$stmt = $pdo->query("SELECT * FROM questions ORDER BY RAND() LIMIT 10");
添加计时功能:
// 前端JavaScript
let timeLeft = 300; // 5分钟
const timer = setInterval(() => {
timeLeft--;
document.getElementById('timer').textContent = `剩余时间: ${Math.floor(timeLeft/60)}分${timeLeft%60}秒`;
if (timeLeft <= 0) {
clearInterval(timer);
document.forms[0].submit();
}
}, 1000);
结果分析展示
生成答题统计报告:
$stmt = $pdo->query("
SELECT q.id, q.question_text,
COUNT(CASE WHEN ua.user_answer = q.correct_answer THEN 1 END) as correct_count,
COUNT(*) as total_attempts
FROM questions q
LEFT JOIN user_answers ua ON q.id = ua.question_id
GROUP BY q.id
");
while ($row = $stmt->fetch()) {
$accuracy = $row['total_attempts'] > 0 ? round($row['correct_count']/$row['total_attempts']*100, 2) : 0;
echo "题目{$row['id']}: {$row['question_text']} - 正确率: {$accuracy}%<br>";
}
这个实现提供了答题系统的基本框架,可以根据具体需求进行扩展和优化。






