关于投票ip限制的一种手段

项目中有这样的一个功能,截图如下:

1、不用多说大家都应该明白这是一个什么样的功能,其实就是一个投票。
2、要求是要限制用户的ip,一个用户只能投一次。
3、用户第一次投票提示投票成功并且所支持方的票数要累计一,再次投票提示用户您已经投过了。
4、页面在加载完以后如果用户投过票,所支持方是active状态,反对方是gray状态。

经过分析,要获取用户的两个数据:ip和他支持方的标记,获取数据简单关键是怎么存储数据,本文采用了文件存储的方式,在项目里建立一个ini文件(如:ip.ini),把获取的数据按‘ip=flag;’(如:127.0.0.1=1;其中127.0.0.1是ip、1标记用户支持图中的蓝方)这种格式保存起来如下图:


剩下的就是对这个文件进行处理了,可以采用parse_ini_file()array_key_exists(),关于这两个函数的介绍如下:

parse_ini_file:
格式:array parse_ini_file ( string $filename [, bool $process_sections ] );
    $filename是要解析的ini文件。
    $process_sections设置获取数组的维数,如果是true可以获取多维数组,默认的是false。
    函数的返回值是联合数组。
array_key_exists:
格式:boolean array_key_exists(string $key,array $array);
    $key要检测的键名。
    $array被检测的数组。

    函数返回boolean值,true存在,false不存在。


该功能中用到的函数如下:

/**
* 读取客户端ip
*/
function rrip(){
    return $_SERVER['REMOTE_ADDR'];
}
/**
* 读取ip集合
*/
function rips(){
    return parse_ini_file('ip.ini');
}
/**
* ip 地址记录
* @param string $ip ip地址
* @param int $f 1表示赞成 0表示反对
*/
function wip($ip, $f){
    $str = $ip . '=' . $f . ";\r\n";
    file_put_contents('ip.ini', $str, FILE_APPEND);
}
/**
* 读取 pk 数据
*/
function rpk(){
    //标记用户是否pk过 true是false不是
    $success = false;
    //用户ip
    $ip = rrip();   
    //已经记录的ip
    $ips = rips();
    //用户支持方的标记
    $f = 0;
    //ips集合非空 并且ip存在ips中 说明用户投过票
    if(!empty($ips) && array_key_exists($ip, $ips)){
        $success = true;
        $f = $ips[$ip];
    }
    //蓝方支持数
    $zc = file_get_contents('zancheng.txt');
    //红方支持数
    $fd = file_get_contents('fandui.txt');
    echo $_GET['rpk'] . '(' . json_encode(array('zc' => $zc, 'fd' => $fd, 'success' => $success, 'f' => $f)) . ')';
}
/**
* 更新 pk 数据
*/
function upk(){
    //标记是否统计 true是 false是否
    $success = true;
    //用户ip
    $ip = rrip();
    //已经记录的ip
    $ips = rips();
    //ips集合非空 并且ip存在ips中 不能统计
    if(!empty($ips) && array_key_exists($ip, $ips)){
        $success = false;
    }else{
        $success = true;
    }
    if($success){
        //标记是 赞成 还是 反对 1赞成 0反对
        $f = $_GET['f'];
        //赞成
        if($f){
            $count = file_get_contents('zancheng.txt');
            $count = intval($count) + 1;
            file_put_contents('zancheng.txt', $count);
        }else{
            $count = file_get_contents('fandui.txt');
            $count = intval($count) + 1;
            file_put_contents('fandui.txt', $count);
        }
        //记录ip 和 标记
        wip($ip, $f);
        echo $_GET['upk'] . '(' . json_encode(array('success' => true)) . ')';
    }else{
        echo $_GET['upk'] . '(' . json_encode(array('success' => false)) . ')';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值