php实现签到功能
首先我在数据库里建了两张表,一个是用户的积分表,一个是签到状态表,分来用来记录用户的积分数和先到状态


在用户签到状态表中我们有一个字段,last_sign_time,即上一次签到时间,每次可以签到的时候把这个时间与当前时间进行比较 如果相差为0天,则说明今天已签到(这个签到是24小时内只能签到一次,即两次签到时间要相差24小时以上).如果等于一天则今日可以签到,如果2天及其以上则说明漏签了.
通过时间戳的判断,及时更新状态表,并且当可以签到的时候则对用户积分表进行操作,即更新用户积分.
具体代码如下:
<?php
$user_id=@$_REQUEST['user_id'];
//功能:计算两个时间戳之间相差的日时分秒
//$begin_time 开始时间戳
//$end_time 结束时间戳
function timediff($begin_time,$end_time)
{
if($begin_time < $end_time){
$starttime = $begin_time;
$endtime = $end_time;
}else{
$starttime = $end_time;
$endtime = $begin_time;
} //计算天数
$timediff = $endtime-$starttime;
$days = intval($timediff/86400);
//计算小时数
$remain = $timediff%86400;
$hours = intval($remain/3600);
//计算分钟数
$remain = $remain%3600;
$mins = intval($remain/60);
//计算秒数
$secs = $remain%60;
$res = array("day" => $days,"hour" => $hours,"min" => $mins,"sec" => $secs);
return $res;
} function upuserscore($current_total_day){
$user_id=@$_REQUEST['user_id'];
//读取数据库配置信息的ini文件
$ary=parse_ini_file('db.ini');
$db_login_name=base64_decode($ary['db_login_name']);
$db_login_password=base64_decode($ary['db_login_password']);
$db_host=base64_decode($ary['db_host']);
$db_name=base64_decode($ary['db_name']);
//链接数据库
$scorelink=mysqli_connect($db_host,$db_login_name,$db_login_password); mysqli_select_db($scorelink,$db_name); //选择数据库 //检查积分表里是否有该用户 有的话则更新数据 没有的话则插入数据
$scoreq = "SELECT * FROM user_score WHERE user_id=$user_id"; //SQL插入语句
mysqli_query($scorelink,"SET NAMES utf8"); $rs = mysqli_query($scorelink,$scoreq); //获取数据集
if(!$rs){
exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($scorelink))));
} if(mysqli_num_rows($rs)){//该用户有数据 则更新其积分信息
$total_score="";
while($row = mysqli_fetch_row($rs)) {
$total_score=$row[4];
}
$scoreusdateq = "UPDATE user_score SET user_total_score ='98' WHERE user_id=$user_id;"; //更新
mysqli_query($scorelink,"SET NAMES utf8");
$ustaters = mysqli_query($scorelink,$scoreusdateq); //获取数据集
if($ustaters ==1){
exit(json_encode(array('status'=>"success",'code'=>"100")));
mysqli_close($scorelink);//关闭连接
exit();
}else{
exit(json_encode(array('status'=>"success",'code'=>"1")));
mysqli_close($scorelink);//关闭连接
exit();
}
}else{//没有该用户数据 则插入其积分信息
$scoreinsertq = "insert into user_score (user_id,user_total_score)values($user_id,10)"; //SQL插入语句
mysqli_query($scorelink,"SET NAMES utf8"); $rs = mysqli_query($scorelink,$scoreinsertq); //获取数据集 if(!$rs){
exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($scorelink))));
}
if(strpos($q,"SELECT") === false){
exit(json_encode(array('status'=>"success",'code'=>"100")));
} mysqli_close($scorelink);//关闭连接 } } //读取数据库配置信息的ini文件
$ary=parse_ini_file('db.ini');
$db_login_name=base64_decode($ary['db_login_name']);
$db_login_password=base64_decode($ary['db_login_password']);
$db_host=base64_decode($ary['db_host']);
$db_name=base64_decode($ary['db_name']); //链接数据库
$link=mysqli_connect($db_host,$db_login_name,$db_login_password); mysqli_select_db($link,$db_name); //选择数据库 //检查签到表里是否有该用户 有的话则更新数据 没有的话则插入数据
$q = "SELECT * FROM user_signin WHERE user_id=$user_id"; //SQL插入语句
mysqli_query($link,"SET NAMES utf8"); $rs = mysqli_query($link,$q); //获取数据集
if(!$rs){
exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($link))));
} if(mysqli_num_rows($rs)){//该用户有数据 则更新其签到信息
$last_time="";
$total_day="";
while($row = mysqli_fetch_row($rs)) {
$last_time=$row[4]."<br/>";
$total_day=$row[5];
}
//根据上次签到时间和这次签到时间作比较判断有没有漏签和今日是否已签到
$current_total_day=intval($total_day)+1;
$current_day=time();
$ary = timediff($last_time,$current_day);
if($ary[day]==0){//今天已签到
exit(json_encode(array('status'=>"success",'code'=>"5")));
mysqli_close($link);//关闭连接
exit();
}else if($ary[day]==1){//没有漏签
$usdateq = "UPDATE user_signin SET last_sign_time='$current_day', total_day='$current_total_day' WHERE user_id=$user_id;"; //更新
mysqli_query($link,"SET NAMES utf8");
$ustaters = mysqli_query($link,$usdateq); //获取数据集
if($ustaters ==1){
upuserscore($current_total_day);
//exit(json_encode(array('status'=>"success",'code'=>"100")));
mysqli_close($link);//关闭连接
exit();
}else{
exit(json_encode(array('status'=>"success",'code'=>"1")));
mysqli_close($link);//关闭连接
exit();
}
}else{//漏签过
$usdateq = "UPDATE user_signin SET last_sign_time='$current_day', total_day=1 WHERE user_id=$user_id;"; //更新
mysqli_query($link,"SET NAMES utf8");
$ustaters = mysqli_query($link,$usdateq); //获取数据集
if($ustaters ==1){
upuserscore($current_total_day);
//exit(json_encode(array('status'=>"success",'code'=>"100")));
mysqli_close($link);//关闭连接
exit();
}else{
exit(json_encode(array('status'=>"success",'code'=>"1")));
mysqli_close($link);//关闭连接
exit();
}
} }else{//没有该用户记录则插入
$current_day=time();
$insertq = "insert into user_signin (user_id,last_sign_time,total_day)values($user_id,'$current_day',1)"; //SQL插入语句 mysqli_query($link,"SET NAMES utf8");
$insertrs = mysqli_query($link,$insertq); //获取数据集 if(strpos($insertrs,"SELECT") === false){//出入数据成功
upuserscore('1');
//exit(json_encode(array('status'=>"success",'code'=>"100"))); } } mysqli_close($link);//关闭连接 ?>
php实现签到功能的更多相关文章
- 使用 UICollectionView 实现日历签到功能
概述 在 App 中,日历通常与签到功能结合使用.是提高用户活跃度的一种方式,同时,签到数据中蕴含了丰富的极其有价值的信息.下面我们就来看看如何在 App 中实现日历签到功能. 效果图 ..... 思 ...
- (三)开始在OJ上添加签到功能
在了解完OJ文件下的各个文件夹的主要作用后,我们开始往里面添加东西(其实只要知道各文件夹是干什么的后,添加东西也变得非常简单了) 一 在数据库中添加对应功能的字段. 我们这个学期才刚开数据库这门课,所 ...
- Redis位图实现用户签到功能
场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...
- 基于Redis位图实现用户签到功能
场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...
- TP5实现签到功能
基于tp5 模型的一个签到功能: 由于存储所有的签到日期数据库会非常庞大,所以签到日期只存储近三个月的. 具体功能: 1.记录最近一次的签到时间 2.每次签到都会添加15积分 3.有连续签到的记录 C ...
- 使用flask搭建微信公众号:实现签到功能
终于到了实战阶段.用微信公众号实现一个简单的签到功能. 前情提要: 微信公众号token验证失败 使用flask搭建微信公众号:完成token的验证 使用flask搭建微信公众号:接收与回复消息 程序 ...
- Redis实战篇(二)基于Bitmap实现用户签到功能
很多应用上都有用户签到的功能,尤其是配合积分系统一起使用.现在有以下需求: 签到1天得1积分,连续签到2天得2积分,3天得3积分,3天以上均得3积分等. 如果连续签到中断,则重置计数,每月重置计数. ...
- H5 签到功能
Introduce(介绍) 用户签到的H5例子(css+jquery,无图片),由于网上找的的用户签到例子都不好,要不就是好多图片组成的,要不就大量冗余代码,所以特意做了个签到界面(移动端). Use ...
- 签到功能,用 MySQL 还是 Redis ?
现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜. 如移动app ,签到送流量等活动. 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看看常 ...
随机推荐
- UVA 11983 Weird Advertisement(线段树求矩形并的面积)
UVA 11983 题目大意是说给你N个矩形,让你求被覆盖k次以上的点的总个数(x,y<1e9) 首先这个题有一个转化,吧每个矩形的x2,y2+1这样就转化为了求N个矩形被覆盖k次以上的区域的面 ...
- POJ3468 A Simple Problem with Integers(线段树延时标记)
题目地址http://poj.org/problem?id=3468 题目大意很简单,有两个操作,一个 Q a, b 查询区间[a, b]的和 C a, b, c让区间[a, b] 的每一个数+c 第 ...
- C# 实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法
/// <summary> /// 实现窗体的最小化 /// </summary> protected override CreateParams CreateParams { ...
- StringBuffer与StringBuilder的异同
一. 相同之处 1.均是可变字符序列,可以随机的改变字符串,如追加操作或插入操作 2. 均使用了内部缓冲区,并且当内部缓冲区溢出后均会自动增大 二. 不同之处 1. Stri ...
- 给Oracle锁住的行解锁
1.找出数据库的serial#,以备杀死: select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$s ...
- struts2对一些属性的使用和对session封装对象类型采用jstl技术的遍历(配图解)
在struts2中如何实现像jsp中request,session,appliaction的使用.其实有两种方法.下面通过一个案列来说明两个方法的使用. 先写一个test.java类 packagec ...
- WinSock异步IO模型之Select
如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的. Windows操作系统提供了五种I/O模型,分别是: ■ 选择(select): ■ 异步选择(WSAAsyncSelec ...
- 四月二十五日,bugzilla for CentOS 安装
Bugzilla for CentOS 5.4 制作人,陈浩 时间:2014.4.25 原创 文件夹 Bugzilla for CentOS 5.4 一. 装系统 1) 新建虚拟机 15G硬盘,51 ...
- nginx-1.4.4 + tcp_proxy_module手动编译安装
Nginx开源软件默认没有提供TCP协议的负载均衡,下面记录一下我的安装过程: 1. 下载nginx最新稳定版的源码 mkdir /software cd /software yum install ...
- 试读《JavaScript语言精髓与编程实践》
有幸看到iteye的活动,有幸读到<JavaScript语言精髓与编程实践_第2版>的试读版本,希望更有幸能完整的读到此书. 说来读这本书的冲动,来得很诡异,写一篇读后感,赢一本书,其实奖 ...