php 实现投票
PHP 实现投票功能
数据库设计
创建投票相关的数据库表结构,通常需要至少两个表:一个存储投票主题,另一个存储投票选项和结果。
CREATE TABLE `polls` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`question` varchar(255) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
CREATE TABLE `poll_options` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`poll_id` int(11) NOT NULL,
`option_text` varchar(255) NOT NULL,
`votes` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
FOREIGN KEY (`poll_id`) REFERENCES `polls` (`id`)
);
创建投票表单
构建一个简单的HTML表单让用户进行投票选择。

<form action="vote.php" method="post">
<h3><?php echo htmlspecialchars($poll['question']); ?></h3>
<?php foreach ($options as $option): ?>
<div>
<input type="radio" name="vote" value="<?php echo $option['id']; ?>" id="option<?php echo $option['id']; ?>">
<label for="option<?php echo $option['id']; ?>"><?php echo htmlspecialchars($option['option_text']); ?></label>
</div>
<?php endforeach; ?>
<button type="submit">投票</button>
</form>
处理投票逻辑
创建vote.php文件处理用户提交的投票。
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');
// 获取投票选项ID
$optionId = $_POST['vote'];
// 更新投票计数
$stmt = $db->prepare("UPDATE poll_options SET votes = votes + 1 WHERE id = ?");
$stmt->execute([$optionId]);
// 重定向回投票页面
header('Location: poll.php');
exit();
显示投票结果
创建一个页面显示当前投票结果。

// 获取投票数据
$pollStmt = $db->prepare("SELECT * FROM polls WHERE id = ?");
$pollStmt->execute([$pollId]);
$poll = $pollStmt->fetch();
// 获取投票选项
$optionsStmt = $db->prepare("SELECT * FROM poll_options WHERE poll_id = ?");
$optionsStmt->execute([$pollId]);
$options = $optionsStmt->fetchAll();
// 计算总票数
$totalVotes = array_sum(array_column($options, 'votes'));
// 显示结果
foreach ($options as $option) {
$percentage = $totalVotes > 0 ? ($option['votes'] / $totalVotes) * 100 : 0;
echo '<div>';
echo htmlspecialchars($option['option_text']) . ': ' . $option['votes'] . ' 票 (' . round($percentage, 2) . '%)';
echo '</div>';
}
防止重复投票
实现IP限制或Cookie机制防止用户重复投票。
// 使用Cookie防止重复投票
if (isset($_COOKIE['voted_' . $pollId])) {
die('您已经投过票了');
}
// 处理投票后设置Cookie
setcookie('voted_' . $pollId, '1', time() + 86400); // 24小时有效期
安全考虑
确保投票系统的安全性,防止SQL注入和XSS攻击。
// 使用预处理语句防止SQL注入
$stmt = $db->prepare("INSERT INTO poll_options (poll_id, option_text) VALUES (?, ?)");
$stmt->execute([$pollId, $optionText]);
// 输出时使用htmlspecialchars防止XSS
echo htmlspecialchars($userInput);
以上代码提供了PHP实现投票功能的基本框架,可以根据实际需求进行扩展和完善。






