php实现竞猜
实现竞猜功能的基本步骤
竞猜功能通常包括用户提交猜测、验证答案、记录结果等环节。以下是一个简单的PHP实现方案:
数据库设计 创建数据库表存储竞猜问题和用户答案:
CREATE TABLE guesses (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
question_id INT,
user_answer VARCHAR(255),
is_correct BOOLEAN,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
提交猜测表单 构建HTML表单让用户提交猜测:
<form method="POST" action="process_guess.php">
<input type="hidden" name="question_id" value="1">
<label for="guess">你的答案:</label>
<input type="text" name="user_answer" required>
<button type="submit">提交</button>
</form>
处理猜测逻辑 在process_guess.php中处理用户提交:
// 获取用户输入
$userAnswer = $_POST['user_answer'];
$questionId = $_POST['question_id'];
$userId = $_SESSION['user_id']; // 假设用户已登录
// 验证答案(从数据库获取正确答案)
$correctAnswer = getCorrectAnswer($questionId);
// 检查是否正确
$isCorrect = (strtolower(trim($userAnswer)) === strtolower(trim($correctAnswer)));
// 存储结果
$stmt = $pdo->prepare("INSERT INTO guesses (user_id, question_id, user_answer, is_correct) VALUES (?, ?, ?, ?)");
$stmt->execute([$userId, $questionId, $userAnswer, $isCorrect]);
// 返回结果给用户
if($isCorrect) {
echo "恭喜你答对了!";
} else {
echo "很遗憾,正确答案是:".htmlspecialchars($correctAnswer);
}
高级功能实现
多问题随机抽取 从题库中随机选择问题:
function getRandomQuestion() {
$stmt = $pdo->query("SELECT * FROM questions ORDER BY RAND() LIMIT 1");
return $stmt->fetch(PDO::FETCH_ASSOC);
}
积分系统 根据正确率奖励积分:

function updateUserScore($userId, $isCorrect) {
$points = $isCorrect ? 10 : 0;
$stmt = $pdo->prepare("UPDATE users SET score = score + ? WHERE id = ?");
$stmt->execute([$points, $userId]);
}
限时竞猜 使用JavaScript实现倒计时:
let timeLeft = 30;
const timer = setInterval(() => {
timeLeft--;
document.getElementById('timer').textContent = timeLeft;
if(timeLeft <= 0) {
clearInterval(timer);
document.forms[0].submit();
}
}, 1000);
安全注意事项
输入验证 对所有用户输入进行过滤:
$userAnswer = filter_input(INPUT_POST, 'user_answer', FILTER_SANITIZE_STRING);
防刷机制 限制用户提交频率:

$lastGuess = $pdo->query("SELECT created_at FROM guesses WHERE user_id = $userId ORDER BY created_at DESC LIMIT 1")->fetchColumn();
if(time() - strtotime($lastGuess) < 10) {
die("提交过于频繁,请稍后再试");
}
结果加密 敏感答案使用哈希存储:
$hashedAnswer = password_hash($correctAnswer, PASSWORD_DEFAULT);
性能优化建议
缓存热门问题 使用Redis缓存高频访问数据:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
if(!$question = $redis->get('question_'.$questionId)) {
$question = getQuestionFromDB($questionId);
$redis->setex('question_'.$questionId, 3600, serialize($question));
}
异步处理 耗时操作使用队列:
$queue->push([
'type' => 'process_guess',
'data' => [
'user_id' => $userId,
'question_id' => $questionId,
'answer' => $userAnswer
]
]);
数据库索引 为常用查询字段添加索引:
CREATE INDEX idx_user_question ON guesses (user_id, question_id);
CREATE INDEX idx_correct ON guesses (is_correct);






