当前位置:首页 > PHP

php实现答题

2026-02-14 21:18:51PHP

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令牌');
}

输入验证 确保用户提交的数据有效。

php实现答题

$optionId = (int)$_POST['q1']; // 强制转换为整数
if ($optionId <= 0) {
    die('无效的选项ID');
}

以上方法提供了PHP实现答题系统的基础框架,可根据实际需求进行扩展和优化。

标签: php
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…

php 实现面包屑导航

php 实现面包屑导航

实现面包屑导航的方法 面包屑导航(Breadcrumb Navigation)是一种常见的网站导航方式,用于显示用户当前页面的路径。以下是几种在 PHP 中实现面包屑导航的方法。 基于 URL 路径…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…