PHP实现简易投票系统:Cookie防刷与文件存储教程

何川
何川
发布时间:2026-10-16| 7人浏览过
原创

本文介绍如何使用PHP构建一个简单的网页投票系统。通过结合Cookie机制限制用户重复投票,并采用本地文本文件进行数据持久化,实现了无需数据库的轻量级投票功能。

结果或目标

构建一个基于PHP的简易投票系统,具备以下核心功能:

  • 前端展示:提供单选按钮供用户选择观点(如“信息量更大”、“网页更精美”等)。
  • 防重复投票:利用Cookie记录用户投票状态,防止同一用户在短时间内重复投票。
  • 数据存储:使用本地文本文件存储投票计数,无需配置复杂的数据库环境。
  • 结果统计:自动计算各选项占比并以文字形式展示统计结果。

准备条件

  1. 运行环境:支持PHP的Web服务器(如Apache/Nginx),需确保PHP版本兼容基础语法(示例代码基于较早版本的PHP编写,现代环境中建议适当调整语法风格)。
  2. 文件权限:用于存储投票数据的文本文件(如 data.pol)必须对Web服务进程具有写入权限。若权限不足,将无法更新统计数据。
  3. 浏览器支持:需启用Cookie功能才能生效防重投机制。

真实操作顺序

第1步:设置投票状态与控制重复提交

目的:识别用户是否已进行过投票,若未投票则允许提交,并提交后设置Cookie标记。

操作:

  • 检查请求参数中是否存在 $polled 且值为 c-e。若存在,将 $status 设为1,表示已投票。
  • 若 $status 为0(即未投票),在用户提交表单时设置Cookie:
    setcookie("polled", "c-e", time()+86400, "/");。
    此Cookie有效期为24小时,路径为根目录,确保用户在该时段内无法重复投票。

第2步:构建投票表单界面

目的:向用户展示投票选项并提供提交入口。

操作:

  • 使用HTML <form> 标签,设置 action 指向当前脚本 myPolls.php,method 为 get。
  • 创建四个单选按钮(Radio Button),名称均为 poll_voteNr,分别对应值 1 至 4,代表不同的投票选项(如“信息量更大”等)。
  • 添加隐藏字段 <input type="hidden" name="poll" value="vote"> 以标识投票动作。
  • 包含查看结果的链接或直接触发提交的按钮。

第3步:读取现有投票数据

目的:加载历史投票记录,初始化或更新计数数组。

操作:

  1. 定义数据存储文件名 $coutfile = "data.pol"。
  2. 使用 file_exists() 检查文件是否存在:
  • 若存在:打开文件逐行读取,使用正则表达式 ereg("([^ ]*) *([0-9]*)", $Line, $tmp) 解析每行的键值对(选项ID和票数),存入 $curArray 并累加总票数 $poll_sum。
  • 若不存在:遍历预设选项数组 $descArray,将所有选项初始票数设为0。

第4步:处理投票提交并更新数据

目的:接收用户输入,增加对应选项计数,并刷新显示。

操作:

  • 当检测到 isset($poll) 时,获取用户选择的 $poll_voteNr。
  • 执行 $curArray[$poll_voteNr]++ 增加该选项计数,同时 $poll_sum++ 增加总票数。
  • 计算各选项的百分比:$poll_percent = 100 * $poll_optionCount / $poll_sum(若无总票数则设为0)。
  • 格式化输出结果,包括选项文本、百分比和原始票数。

第5步:保存数据并结束会话

目的:将最新的投票结果持久化到文件中。

操作:

  • 仅在新提交投票后才执行写入操作。打开 $coutfile 为写入模式("wt")。
  • 遍历 $curArray,将每个选项的ID和对应票数格式化为 %d %d 字符串,使用 fwrite() 写入文件。
  • 关闭文件句柄,完成保存。

完成判断

当用户成功提交投票后,页面应重新加载并显示包含最新统计数据的表格。同时,再次尝试提交相同IP或浏览器的投票将被Cookie机制拦截(或至少需要清除Cookie才能再次投票)。文件 data.pol 中的内容应与页面上显示的总数一致。

原文有依据的排错

  • 权限错误:如果写入失败,请检查Web服务器用户对 data.pol 文件的写权限。在Linux系统中可能需要执行 chmod 666 data.pol 或将其所有者改为Web服务用户。
  • 编码问题:示例代码中使用 gb2312 字符集,若部署在现代UTF-8环境中,建议将Meta标签及源文件编码统一调整为UTF-8,以避免中文乱码。
  • 函数弃用:代码中使用的 ereg() 和 each() 在较新版本的PHP中已被移除或标记为废弃。在生产环境中,建议使用 preg_match() 替代 ereg(),并使用foreach循环替代while(each())结构。

简要总结

本方案通过简单的文件读写和Cookie管理,实现了一个功能完整的微型投票系统。虽然它不适合高并发场景,但作为理解PHP表单处理、文件操作和基本状态管理的教学案例非常实用。以上就是PHP实现简易投票系统的详细内容,更多关于PHP Web开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。