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

在用户签到状态表中我们有一个字段,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实现签到功能的更多相关文章

  1. 使用 UICollectionView 实现日历签到功能

    概述 在 App 中,日历通常与签到功能结合使用.是提高用户活跃度的一种方式,同时,签到数据中蕴含了丰富的极其有价值的信息.下面我们就来看看如何在 App 中实现日历签到功能. 效果图 ..... 思 ...

  2. (三)开始在OJ上添加签到功能

    在了解完OJ文件下的各个文件夹的主要作用后,我们开始往里面添加东西(其实只要知道各文件夹是干什么的后,添加东西也变得非常简单了) 一 在数据库中添加对应功能的字段. 我们这个学期才刚开数据库这门课,所 ...

  3. Redis位图实现用户签到功能

    场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...

  4. 基于Redis位图实现用户签到功能

    场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...

  5. TP5实现签到功能

    基于tp5 模型的一个签到功能: 由于存储所有的签到日期数据库会非常庞大,所以签到日期只存储近三个月的. 具体功能: 1.记录最近一次的签到时间 2.每次签到都会添加15积分 3.有连续签到的记录 C ...

  6. 使用flask搭建微信公众号:实现签到功能

    终于到了实战阶段.用微信公众号实现一个简单的签到功能. 前情提要: 微信公众号token验证失败 使用flask搭建微信公众号:完成token的验证 使用flask搭建微信公众号:接收与回复消息 程序 ...

  7. Redis实战篇(二)基于Bitmap实现用户签到功能

    很多应用上都有用户签到的功能,尤其是配合积分系统一起使用.现在有以下需求: 签到1天得1积分,连续签到2天得2积分,3天得3积分,3天以上均得3积分等. 如果连续签到中断,则重置计数,每月重置计数. ...

  8. H5 签到功能

    Introduce(介绍) 用户签到的H5例子(css+jquery,无图片),由于网上找的的用户签到例子都不好,要不就是好多图片组成的,要不就大量冗余代码,所以特意做了个签到界面(移动端). Use ...

  9. 签到功能,用 MySQL 还是 Redis ?

    现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜. 如移动app ,签到送流量等活动.   用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看看常 ...

随机推荐

  1. C# JackLib系列之GdiHelper圆角矩形的快速生成

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. 用来用去还是觉得SDCMS好用

    用来用去还是觉得SDCMS好用 现在可以算是精通了.呵呵,欢迎交流

  3. C#下利用高精度计时器进行计时操作

    简介 精确的时间计量方法在某些应用程序中是非常重要的.常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数.另一方面,GetTickCount() 函数仅有 ...

  4. Map排序——按key排序,按value排序

    注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5959279.html 上一篇博文谈到了集合类的自定义排序方式,那么进一步扩展开来,与集合同等重要的Map有 ...

  5. Oracle 数据库链接

    SQL> CREATE DATABASE LINK   mydblink 2    CONNECT TO   test   IDENTIFIED BY   test123 3    USING  ...

  6. C++静态成员函数小结 [转]

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  7. 第一章TP-Link 703N刷OpenWrt

    1)下载编译好的固件 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin openwrt-ar71xx-generic-tl-wr703n ...

  8. 个人分享:平时开发中感觉几款不错 IDE 、插件、工具

    本人主业 C# 开发,由于是做 Web 开发,所以像 SQL.JavaScript 这些肯定经常要接触到.当然,平时本人也写过 Node.js.Java.Python之类,不过,这些只能讲简单了解而已 ...

  9. vs2012 + web api + OData + EF + MYsql 开发及部署

    先说下我的情况,b/s开发这块已经很久没有搞了,什么web api .MVC.OData都只是听过,没有实际开发过,因为最近要开发一个手机app的服务端,所以准备用这套框架来开发. 下面开始进入正题( ...

  10. 分享一个导出Excel时页面不跳转的小技巧

    今天在点击客户档案导出的时候,发现先是打开了一个新标签,然后新标签自动关掉,弹出一个文件下载确认的窗口,点击确认后开始下载导出的Excel文件.这样的过程感觉窗口闪来闪去,而且可能会给用户带来困惑,是 ...