当前位置:首页 > PHP

php 实现投票系统

2026-03-13 06:41:57PHP

创建数据库表结构

设计一个简单的投票系统数据库,包含投票主题和选项表。使用MySQL示例:

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)
);

连接数据库

使用PDO连接MySQL数据库:

$host = 'localhost';
$dbname = 'voting_system';
$username = 'root';
$password = '';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}

创建投票表单

构建前端投票表单:

<form method="post" action="vote.php">
    <h3><?php echo htmlspecialchars($voteTitle); ?></h3>
    <?php foreach ($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; ?>
    <input type="hidden" name="vote_id" value="<?php echo $voteId; ?>">
    <button type="submit">Submit Vote</button>
</form>

处理投票提交

处理投票逻辑并防止重复投票:

session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $voteId = $_POST['vote_id'];
    $optionId = $_POST['vote_option'];

    // 检查用户是否已投票
    if (!isset($_SESSION['voted_'.$voteId])) {
        // 更新投票计数
        $stmt = $pdo->prepare("UPDATE vote_options SET vote_count = vote_count + 1 WHERE id = ?");
        $stmt->execute([$optionId]);

        // 标记用户已投票
        $_SESSION['voted_'.$voteId] = true;
        $message = "Vote submitted successfully!";
    } else {
        $message = "You have already voted in this poll.";
    }
}

显示投票结果

生成投票结果可视化:

$stmt = $pdo->prepare("SELECT option_text, vote_count FROM vote_options WHERE vote_id = ?");
$stmt->execute([$voteId]);
$options = $stmt->fetchAll(PDO::FETCH_ASSOC);

$totalVotes = array_sum(array_column($options, 'vote_count'));

foreach ($options as $option) {
    $percentage = $totalVotes > 0 ? ($option['vote_count'] / $totalVotes) * 100 : 0;
    echo '<div>';
    echo '<span>'.htmlspecialchars($option['option_text']).'</span>';
    echo '<div style="background:#ddd;height:20px;width:'.$percentage.'%"></div>';
    echo '<span>'.$option['vote_count'].' votes ('.round($percentage,1).'%)</span>';
    echo '</div>';
}

安全增强措施

实施额外的安全防护:

// 验证输入
$voteId = filter_input(INPUT_POST, 'vote_id', FILTER_VALIDATE_INT);
$optionId = filter_input(INPUT_POST, 'vote_option', FILTER_VALIDATE_INT);

// 检查选项是否属于该投票
$stmt = $pdo->prepare("SELECT id FROM vote_options WHERE id = ? AND vote_id = ?");
$stmt->execute([$optionId, $voteId]);
if (!$stmt->fetch()) {
    die("Invalid vote option");
}

// 使用CSRF令牌
if (empty($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("Invalid CSRF token");
}

管理员功能

添加创建新投票的功能:

php 实现投票系统

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_vote'])) {
    $title = $_POST['title'];
    $options = explode("\n", $_POST['options']);

    $pdo->beginTransaction();
    try {
        $stmt = $pdo->prepare("INSERT INTO votes (title) VALUES (?)");
        $stmt->execute([$title]);
        $voteId = $pdo->lastInsertId();

        foreach ($options as $option) {
            $option = trim($option);
            if (!empty($option)) {
                $stmt = $pdo->prepare("INSERT INTO vote_options (vote_id, option_text) VALUES (?, ?)");
                $stmt->execute([$voteId, $option]);
            }
        }
        $pdo->commit();
    } catch (Exception $e) {
        $pdo->rollBack();
        throw $e;
    }
}

标签: 投票系统php
分享给朋友:

相关文章

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节点。每个…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…