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

在用户签到状态表中我们有一个字段,last_sign_time,即上一次签到时间,每次可以签到的时候把这个时间与当前时间进行比较 如果相差为0天,则说明今天已签到(这个签到是24小时内只能签到一次,即两次签到时间要相差24小时以上).如果等于一天则今日可以签到,如果2天及其以上则说明漏签了.

通过时间戳的判断,及时更新状态表,并且当可以签到的时候则对用户积分表进行操作,即更新用户积分.

具体代码如下:

  1. <?php
  2. $user_id=@$_REQUEST['user_id'];
  3. //功能:计算两个时间戳之间相差的日时分秒
  4. //$begin_time 开始时间戳
  5. //$end_time 结束时间戳
  6. function timediff($begin_time,$end_time)
  7. {
  8. if($begin_time < $end_time){
  9. $starttime = $begin_time;
  10. $endtime = $end_time;
  11. }else{
  12. $starttime = $end_time;
  13. $endtime = $begin_time;
  14. }
  15.  
  16. //计算天数
  17. $timediff = $endtime-$starttime;
  18. $days = intval($timediff/86400);
  19. //计算小时数
  20. $remain = $timediff%86400;
  21. $hours = intval($remain/3600);
  22. //计算分钟数
  23. $remain = $remain%3600;
  24. $mins = intval($remain/60);
  25. //计算秒数
  26. $secs = $remain%60;
  27. $res = array("day" => $days,"hour" => $hours,"min" => $mins,"sec" => $secs);
  28. return $res;
  29. }
  30.  
  31. function upuserscore($current_total_day){
  32. $user_id=@$_REQUEST['user_id'];
  33. //读取数据库配置信息的ini文件
  34. $ary=parse_ini_file('db.ini');
  35. $db_login_name=base64_decode($ary['db_login_name']);
  36. $db_login_password=base64_decode($ary['db_login_password']);
  37. $db_host=base64_decode($ary['db_host']);
  38. $db_name=base64_decode($ary['db_name']);
  39. //链接数据库
  40. $scorelink=mysqli_connect($db_host,$db_login_name,$db_login_password);
  41.  
  42. mysqli_select_db($scorelink,$db_name); //选择数据库
  43.  
  44. //检查积分表里是否有该用户 有的话则更新数据 没有的话则插入数据
  45. $scoreq = "SELECT * FROM user_score WHERE user_id=$user_id"; //SQL插入语句
  46. mysqli_query($scorelink,"SET NAMES utf8");
  47.  
  48. $rs = mysqli_query($scorelink,$scoreq); //获取数据集
  49. if(!$rs){
  50. exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($scorelink))));
  51. }
  52.  
  53. if(mysqli_num_rows($rs)){//该用户有数据 则更新其积分信息
  54. $total_score="";
  55. while($row = mysqli_fetch_row($rs)) {
  56. $total_score=$row[4];
  57. }
  58. $scoreusdateq = "UPDATE user_score SET user_total_score ='98' WHERE user_id=$user_id;"; //更新
  59. mysqli_query($scorelink,"SET NAMES utf8");
  60. $ustaters = mysqli_query($scorelink,$scoreusdateq); //获取数据集
  61. if($ustaters ==1){
  62. exit(json_encode(array('status'=>"success",'code'=>"100")));
  63. mysqli_close($scorelink);//关闭连接
  64. exit();
  65. }else{
  66. exit(json_encode(array('status'=>"success",'code'=>"1")));
  67. mysqli_close($scorelink);//关闭连接
  68. exit();
  69. }
  70. }else{//没有该用户数据 则插入其积分信息
  71. $scoreinsertq = "insert into user_score (user_id,user_total_score)values($user_id,10)"; //SQL插入语句
  72. mysqli_query($scorelink,"SET NAMES utf8");
  73.  
  74. $rs = mysqli_query($scorelink,$scoreinsertq); //获取数据集
  75.  
  76. if(!$rs){
  77. exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($scorelink))));
  78. }
  79. if(strpos($q,"SELECT") === false){
  80. exit(json_encode(array('status'=>"success",'code'=>"100")));
  81. }
  82.  
  83. mysqli_close($scorelink);//关闭连接
  84.  
  85. }
  86.  
  87. }
  88.  
  89. //读取数据库配置信息的ini文件
  90. $ary=parse_ini_file('db.ini');
  91. $db_login_name=base64_decode($ary['db_login_name']);
  92. $db_login_password=base64_decode($ary['db_login_password']);
  93. $db_host=base64_decode($ary['db_host']);
  94. $db_name=base64_decode($ary['db_name']);
  95.  
  96. //链接数据库
  97. $link=mysqli_connect($db_host,$db_login_name,$db_login_password);
  98.  
  99. mysqli_select_db($link,$db_name); //选择数据库
  100.  
  101. //检查签到表里是否有该用户 有的话则更新数据 没有的话则插入数据
  102. $q = "SELECT * FROM user_signin WHERE user_id=$user_id"; //SQL插入语句
  103. mysqli_query($link,"SET NAMES utf8");
  104.  
  105. $rs = mysqli_query($link,$q); //获取数据集
  106. if(!$rs){
  107. exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($link))));
  108. }
  109.  
  110. if(mysqli_num_rows($rs)){//该用户有数据 则更新其签到信息
  111. $last_time="";
  112. $total_day="";
  113. while($row = mysqli_fetch_row($rs)) {
  114. $last_time=$row[4]."<br/>";
  115. $total_day=$row[5];
  116. }
  117. //根据上次签到时间和这次签到时间作比较判断有没有漏签和今日是否已签到
  118. $current_total_day=intval($total_day)+1;
  119. $current_day=time();
  120. $ary = timediff($last_time,$current_day);
  121. if($ary[day]==0){//今天已签到
  122. exit(json_encode(array('status'=>"success",'code'=>"5")));
  123. mysqli_close($link);//关闭连接
  124. exit();
  125. }else if($ary[day]==1){//没有漏签
  126. $usdateq = "UPDATE user_signin SET last_sign_time='$current_day', total_day='$current_total_day' WHERE user_id=$user_id;"; //更新
  127. mysqli_query($link,"SET NAMES utf8");
  128. $ustaters = mysqli_query($link,$usdateq); //获取数据集
  129. if($ustaters ==1){
  130. upuserscore($current_total_day);
  131. //exit(json_encode(array('status'=>"success",'code'=>"100")));
  132. mysqli_close($link);//关闭连接
  133. exit();
  134. }else{
  135. exit(json_encode(array('status'=>"success",'code'=>"1")));
  136. mysqli_close($link);//关闭连接
  137. exit();
  138. }
  139. }else{//漏签过
  140. $usdateq = "UPDATE user_signin SET last_sign_time='$current_day', total_day=1 WHERE user_id=$user_id;"; //更新
  141. mysqli_query($link,"SET NAMES utf8");
  142. $ustaters = mysqli_query($link,$usdateq); //获取数据集
  143. if($ustaters ==1){
  144. upuserscore($current_total_day);
  145. //exit(json_encode(array('status'=>"success",'code'=>"100")));
  146. mysqli_close($link);//关闭连接
  147. exit();
  148. }else{
  149. exit(json_encode(array('status'=>"success",'code'=>"1")));
  150. mysqli_close($link);//关闭连接
  151. exit();
  152. }
  153. }
  154.  
  155. }else{//没有该用户记录则插入
  156. $current_day=time();
  157. $insertq = "insert into user_signin (user_id,last_sign_time,total_day)values($user_id,'$current_day',1)"; //SQL插入语句
  158.  
  159. mysqli_query($link,"SET NAMES utf8");
  160. $insertrs = mysqli_query($link,$insertq); //获取数据集
  161.  
  162. if(strpos($insertrs,"SELECT") === false){//出入数据成功
  163. upuserscore('1');
  164. //exit(json_encode(array('status'=>"success",'code'=>"100")));
  165.  
  166. }
  167.  
  168. }
  169.  
  170. mysqli_close($link);//关闭连接
  171.  
  172. ?>

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. [翻译][Trident] Trident state原理

    原文地址:https://github.com/nathanmarz/storm/wiki/Trident-state ----------------------------- Trident在读写 ...

  2. Redis总结(五)缓存雪崩和缓存穿透等问题

    前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhong/category/771056.html .今 ...

  3. 记一次PHP项目部署过程

    首先介绍一下项目的基本情况:使用PHP语言开发,数据库用的是MySQL 5.5,HTTP服务器用的是Apache 2.2.早上十点到机房看了看服务器的基本情况:Windows 2000操作系统,没有安 ...

  4. 转载:js和as间的交互

    转载一: 提及AS3与外部脚本的交互,笔者认为可以总结成两种.一是AS3调用外部函数,二是外部脚本调用AS3函数.无外乎就 这两种.在调用函数的同时,我们还可以向函数传递一些参数.这就达到了传递数据的 ...

  5. UIWebView 获取当前的javascript上下文,并js,oc互调

    OC调用UIWebView 中的js,网上例子很多,最常用的是UIWebView自带的一个方法: - (NSString *)stringByEvaluatingJavaScriptFromStrin ...

  6. com.sun.image.codec.jpeg--导入报错

    import com.sun.image.codec.jpeg; 这样导入的时候,总是报错:Only a type can be imported. com.sun.image.codec.jpeg ...

  7. Swift学习笔记十三

    初始化 初始化是一个在类.结构体或枚举的实例对象创建之前,对它进行预处理的过程,包括给那个对象的每一个存储式属性设定初始值,以及进行一些其他的准备操作. 通过定义初始化器(initializer)来实 ...

  8. cdoj 30 最短路 flyod

    最短路 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/30 Descript ...

  9. POJ 2309 BST 树状数组基本操作

    Description Consider an infinite full binary search tree (see the figure below), the numbers in the ...

  10. Android图片圆角效果

    一般来说图片加圆角可以使用 Java 的方式来进行, 对图片略加处理即可, 但也可以使用纯XML+Nice-Patch图片来进行, 这样的速度会更快. 如果背景是纯色的情况下建议使用此方法. 原理则是 ...