基于PHP与JSON文件实现投票计数功能的技术求助
基于PHP和JSON文件的投票系统实现方案
需求说明
现有votes.json文件,内容如下:
{ "main": { "choice1": "0", "choice2": "0", "choice3": "0" }, "alternative": { "choice1": "0", "choice2": "0", "choice3": "0" } }
需要实现:当用户投票给指定选项(例如main下的choice1)时,该选项的计数累加,其余选项数值保持不变。
原代码存在的问题
你提供的代码未达到预期效果,主要问题包括:
- 多余的
foreach循环:遍历整个JSON数组完全没必要,直接操作目标节点即可 - 类型处理疏漏:JSON中的投票数是字符串类型(如
"0"),虽然PHP会自动转换,但显式转换为整数更稳妥 - 写入变量错误:
file_put_contents中使用了foreach的临时变量$value,而非修改后的完整数组$json_arr
正确实现代码
以下是实现需求的完整PHP代码:
// 1. 读取JSON文件内容 $jsonFile = 'votes.json'; $data = file_get_contents($jsonFile); if (!$data) { die('无法读取投票文件'); } // 2. 解码为关联数组 $votes = json_decode($data, true); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解析失败'); } // 3. 指定要投票的选项(可根据实际需求动态传入,比如通过GET/POST参数) $targetCategory = 'main'; $targetChoice = 'choice1'; // 4. 累加投票数:先将字符串转为整数,再加1 if (isset($votes[$targetCategory][$targetChoice])) { $votes[$targetCategory][$targetChoice] = (int)$votes[$targetCategory][$targetChoice] + 1; } else { die('指定的投票选项不存在'); } // 5. 重新编码为JSON并写入文件(这里覆盖原文件,也可改为写入新文件) if (file_put_contents($jsonFile, json_encode($votes, JSON_PRETTY_PRINT))) { echo '投票成功'; } else { echo '投票失败,无法写入文件'; }
补充说明
- 如果需要让用户选择投票选项,可以通过表单的
GET或POST参数传递targetCategory和targetChoice,比如$_POST['category']和$_POST['choice'] - 若存在高并发投票场景,建议添加文件锁避免数据冲突,可使用
flock()函数实现
内容的提问来源于stack exchange,提问作者Shehab Mohamed
相关产品推荐
相关产品推荐

