当前位置:首页 > 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 "答案已提交!";
}

计算分数 根据正确答案计算用户得分。

php实现答题

$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>

结果分析 展示每道题的正确与否和答案解析。

php实现答题

$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实现答题系统的基础框架,可根据实际需求进行扩展和优化。

标签: php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaS…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php实现购物车

php实现购物车

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

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…