php实现题库答题
PHP实现题库答题系统
数据库设计
创建数据库表存储题目和答案信息,基本结构如下:
CREATE TABLE questions (
id INT AUTO_INCREMENT PRIMARY KEY,
question_text TEXT NOT NULL,
question_type ENUM('single', 'multiple', 'true_false') NOT NULL,
difficulty TINYINT DEFAULT 1
);
CREATE TABLE options (
id INT AUTO_INCREMENT PRIMARY KEY,
question_id INT NOT NULL,
option_text TEXT NOT NULL,
is_correct BOOLEAN DEFAULT false,
FOREIGN KEY (question_id) REFERENCES questions(id)
);
题目展示功能
通过PHP从数据库随机抽取题目并展示:
$pdo = new PDO('mysql:host=localhost;dbname=quiz_db', 'username', 'password');
$stmt = $pdo->query("SELECT * FROM questions ORDER BY RAND() LIMIT 10");
while ($question = $stmt->fetch()) {
echo '<div class="question">';
echo '<h3>'.$question['question_text'].'</h3>';
$options = $pdo->query("SELECT * FROM options WHERE question_id = ".$question['id']);
while ($option = $options->fetch()) {
echo '<input type="radio" name="q'.$question['id'].'" value="'.$option['id'].'">';
echo '<label>'.$option['option_text'].'</label><br>';
}
echo '</div>';
}
答案验证处理
提交后检查用户答案的正确性:

$score = 0;
foreach ($_POST as $key => $value) {
if (strpos($key, 'q') === 0) {
$questionId = substr($key, 1);
$optionId = $value;
$stmt = $pdo->prepare("SELECT is_correct FROM options WHERE id = ?");
$stmt->execute([$optionId]);
$isCorrect = $stmt->fetchColumn();
if ($isCorrect) {
$score++;
}
}
}
echo "您的得分:$score/10";
高级功能实现
添加题目分类和难度筛选:
$category = $_GET['category'] ?? null;
$difficulty = $_GET['difficulty'] ?? null;
$query = "SELECT * FROM questions WHERE 1=1";
if ($category) {
$query .= " AND category_id = $category";
}
if ($difficulty) {
$query .= " AND difficulty = $difficulty";
}
$query .= " ORDER BY RAND() LIMIT 10";
安全防护措施
防止SQL注入和使用预处理语句:

$stmt = $pdo->prepare("SELECT * FROM questions WHERE category_id = :cat AND difficulty = :diff");
$stmt->execute([
':cat' => $category,
':diff' => $difficulty
]);
性能优化建议
使用缓存减少数据库查询:
$cacheKey = "questions_{$category}_{$difficulty}";
if (!apcu_exists($cacheKey)) {
$questions = $pdo->query($query)->fetchAll();
apcu_store($cacheKey, $questions, 3600);
} else {
$questions = apcu_fetch($cacheKey);
}
扩展功能
添加用户答题历史记录:
CREATE TABLE user_answers (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
question_id INT NOT NULL,
option_id INT NOT NULL,
is_correct BOOLEAN,
answer_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);






