PHP实现简易投票系统:Cookie防刷与文件存储教程
本文介绍如何使用PHP构建一个简单的网页投票系统。通过结合Cookie机制限制用户重复投票,并采用本地文本文件进行数据持久化,实现了无需数据库的轻量级投票功能。
结果或目标
构建一个基于PHP的简易投票系统,具备以下核心功能:
- 前端展示:提供单选按钮供用户选择观点(如“信息量更大”、“网页更精美”等)。
- 防重复投票:利用Cookie记录用户投票状态,防止同一用户在短时间内重复投票。
- 数据存储:使用本地文本文件存储投票计数,无需配置复杂的数据库环境。
- 结果统计:自动计算各选项占比并以文字形式展示统计结果。
准备条件
- 运行环境:支持PHP的Web服务器(如Apache/Nginx),需确保PHP版本兼容基础语法(示例代码基于较早版本的PHP编写,现代环境中建议适当调整语法风格)。
- 文件权限:用于存储投票数据的文本文件(如
data.pol)必须对Web服务进程具有写入权限。若权限不足,将无法更新统计数据。 - 浏览器支持:需启用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步:读取现有投票数据
目的:加载历史投票记录,初始化或更新计数数组。
操作:
- 定义数据存储文件名
$coutfile = "data.pol"。 - 使用
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开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









