php实现投票
PHP 实现投票功能
数据库设计
创建投票相关的数据表,通常需要包含投票主题、选项、用户投票记录等。以下是一个简单的表结构示例:
CREATE TABLE votes (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE vote_options (
id INT AUTO_INCREMENT PRIMARY KEY,
vote_id INT NOT NULL,
option_text VARCHAR(255) NOT NULL,
vote_count INT DEFAULT 0,
FOREIGN KEY (vote_id) REFERENCES votes(id)
);
CREATE TABLE vote_records (
id INT AUTO_INCREMENT PRIMARY KEY,
vote_id INT NOT NULL,
user_id INT NOT NULL,
option_id INT NOT NULL,
voted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (vote_id) REFERENCES votes(id),
FOREIGN KEY (option_id) REFERENCES vote_options(id)
);
创建投票表单
在 PHP 中创建一个表单,允许用户选择投票选项并提交:
<form action="submit_vote.php" method="post">
<h3><?php echo htmlspecialchars($vote_title); ?></h3>
<?php foreach ($vote_options as $option): ?>
<label>
<input type="radio" name="vote_option" value="<?php echo $option['id']; ?>">
<?php echo htmlspecialchars($option['option_text']); ?>
</label><br>
<?php endforeach; ?>
<button type="submit">提交投票</button>
</form>
处理投票提交
在 submit_vote.php 中处理用户提交的投票数据:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['vote_option'])) {
$option_id = (int)$_POST['vote_option'];
$user_id = $_SESSION['user_id'] ?? 0; // 假设用户已登录
// 检查用户是否已投票
$stmt = $pdo->prepare("SELECT * FROM vote_records WHERE user_id = ? AND vote_id = ?");
$stmt->execute([$user_id, $vote_id]);
if ($stmt->rowCount() > 0) {
die("您已经投过票了");
}
// 记录投票并更新选项计数
$pdo->beginTransaction();
try {
$pdo->prepare("INSERT INTO vote_records (vote_id, user_id, option_id) VALUES (?, ?, ?)")
->execute([$vote_id, $user_id, $option_id]);
$pdo->prepare("UPDATE vote_options SET vote_count = vote_count + 1 WHERE id = ?")
->execute([$option_id]);
$pdo->commit();
echo "投票成功";
} catch (Exception $e) {
$pdo->rollBack();
echo "投票失败: " . $e->getMessage();
}
}
显示投票结果
创建一个页面显示投票结果:
$options = $pdo->query("SELECT option_text, vote_count FROM vote_options WHERE vote_id = $vote_id")->fetchAll();
$total_votes = array_sum(array_column($options, 'vote_count'));
foreach ($options as $option) {
$percentage = $total_votes > 0 ? ($option['vote_count'] / $total_votes) * 100 : 0;
echo "<div>
<strong>{$option['option_text']}</strong>
<div class='progress-bar' style='width: {$percentage}%'>{$percentage}%</div>
<span>({$option['vote_count']} 票)</span>
</div>";
}
安全注意事项
- 使用预处理语句防止 SQL 注入
- 对用户输入进行验证和过滤
- 实施 CSRF 保护
- 限制每个用户的投票次数
- 考虑使用验证码防止机器人刷票
扩展功能
- 添加多选投票功能
- 实现匿名投票
- 添加投票截止时间
- 支持图片选项
- 添加评论功能







