TP5框架实现签到功能的方法分析

本文实例讲述了TP5框架实现签到功能的方法。分享给大家供大家参考,具体如下:

基于tp5 模型的一个签到功能;

由于存储所有的签到日期数据库会非常庞大,所以签到日期只存储近三个月的。

具体功能:

1、记录最近一次的签到时间

2、每次签到都会添加15积分

3、有连续签到的记录

CREATE TABLE `sp_sign` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `times` datetime DEFAULT NULL COMMENT '最近一次签到时间',
 `userid` int(11) DEFAULT NULL COMMENT '用户id',
 `days` tinyint(6) NOT NULL DEFAULT '0' COMMENT '连续签到的天数',
 `number` decimal(10,0) NOT NULL DEFAULT '0' COMMENT '当月签到给的积分',
 `one` varchar(255) DEFAULT NULL COMMENT '当月签到的日期,用“,”隔开',
 `two` varchar(255) DEFAULT NULL COMMENT '上个月签到的日期,用“,”隔开',
 `three` varchar(255) DEFAULT NULL COMMENT '上上个月签到的日期,用“,”隔开',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/**
   * 用户签到
   * @param array $userid 用户id
   */
  public function add($userid)
  {
      $data = Db::name('sign')->where('userid',$userid)->select();
      if(count($data) == 0) //没有该用户的签到记录
      {
        $query4 = Db::name('sign')->insert(['times'=>date('Y-m-d H:i:s'),'userid'=>$userid,'days'=>1,'number'=>'15','one'=>date('d',time())]);
        return 1;
      }
      else
      {
        //判断今天是否签到
        $todayBegin=date('Y-m-d'." 00:00:00");
        $todayEnd= date('Y-m-d'." 23:59:59");
        $isexit = Db::name('sign')->field('times')->where(['userid'=>$userid])->where('times','between',[$todayBegin,$todayEnd])->select();
        if(count($isexit) == 1)  //今日已签到
        {
          return 0;
        }
        else  //今日未签到
        {
          $times = Db::name('sign')->where('userid',$userid)->field('times')->select();
          $time = strtotime($times[0]['times']);

          if((time()-$time > 24*60*60))    //上次签到时间大于24小时,连续签到天数清零
          {
            $query = Db::name('sign')->where('userid',$userid)->update(['days'=>1]);
          }
          else   //上次签到时间小于24小时,连续签到次数加1
          {
            $query = Db::name('sign')->where('userid',$userid)->setInc('days');
          }
          //更新上次签到时间和签到积分
          $query1 = Db::name('sign')->where('userid',$userid)->update(['times'=>date('Y-m-d H:i:s')]);
          $query2 = Db::name('sign')->where('userid',$userid)->setInc('number', 15);

          $sqldate = date('m',$time);  //上次签到日期的月份
          $nowdate = date('m',time()); //当前月份
          //记录本次签到日期
          if($sqldate != $nowdate) //上次签到日期与本次签到日期月份不一样
          {
            $oldtime = $times[0]['times'];
            $onetime=date("Y-m-d H:i:s", strtotime("-1 month")); //获取前1个月的时间,获取格式为2016-12-30 13:26:13
            $twotime=date("Y-m-d H:i:s", strtotime("-2 month")); //获取前2个月的时间
            $threetime=date("Y-m-d H:i:s", strtotime("-3 month")); //获取前3个月的时间

            $rs = Db::name('sign')->where('userid',$userid)->field('one,two,three')->select();

            if($oldtime < $onetime && $oldtime >= $twotime)   //月份间隔 大于1个月,小于2个月
            {
              $one = date('d',time());
              $two = $rs[0]['one'];
              $three = $rs[0]['two'];
            }
            elseif($oldtime < $twotime && $oldtime >= $threetime) //月份间隔 大于2个月,小于3个月
            {
              $one = date('d',time());
              $two = '';
              $three = $rs[0]['one'];
            }
            elseif($oldtime < $threetime) //月份间隔 大于3个月
            {
              $one = date('d',time());
              $two = '';
              $three = '';
            }
            $query3 = Db::name('sign')->where('userid',$userid)->update(['one'=>$one,'two'=>$two,'three'=>$three]);
          }
          else //上次签到日期与本次签到日期月份一样
          {
            $one = Db::name('sign')->where('userid',$userid)->field('one')->select();
            $arr[] = $one[0]['one'];
            $arr[] = date('d',time());
            $newones = implode(",",$arr);
            $query3 = Db::name('sign')->where('userid',$userid)->update(['one'=>$newones]);
          }
        return 1;
        }
      }
  }

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

(0)

相关推荐

  • thinkPHP5框架数据库连贯操作之cache()用法分析

    本文实例讲述了thinkPHP5框架数据库连贯操作之cache()用法.分享给大家供大家参考,具体如下: 介绍 TP5中自带的缓存系统,是File型缓存.也就是文件型缓存.存储地址是:根目录\..\runtime\cache(根目录指public). 这个缓存系统相较于redis,memcached肯定有局限性的,自动更新以及缓存数据的复杂程度上有区别.但是对于一些简单的查询等还有很有帮助的.比如文章等这些内容使用起来还是不错的. cache可以用于select.find.value和colum

  • ThinkPHP5.1框架数据库链接和增删改查操作示例

    本文实例讲述了ThinkPHP5.1框架数据库链接和增删改查操作.分享给大家供大家参考,具体如下: 一.数据库的链接方式 <?php namespace app\index\controller; use think\Db; class Demo { //1.全局配置 config/database.php配置 public function dbTest() { return Db::table('pzq_article') ->where('id','29') ->value('ti

  • thinkPHP实现签到功能的方法

    本文实例讲述了thinkPHP实现签到功能的方法.分享给大家供大家参考,具体如下: 数据表: CREATE TABLE `members_sign` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `uid` int(11) unsigned NOT NULL COMMENT '用户id', `days` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '连续签到的天数', `is_share`

  • tp5(thinkPHP5)框架连接数据库的方法示例

    本文实例讲述了thinkPHP5框架连接数据库的方法.分享给大家供大家参考,具体如下: 1.配置文件目录 tp5\application\database.php 通过配置文件来连接.. 也可以通过方法链接 在控制器里方法链接数据库 :查询时写法 和使用系统的DB类方法略有差异 // 使用方法配置数据库连接 public function data1 () { $DB = Db::connect([ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname'

  • thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例

    本文实例讲述了thinkPHP5框架实现多数据库连接,跨数据连接查询操作.分享给大家供大家参考,具体如下: 1. 多数据库连接 方法1:在需要连接其他数据库的地方,使用Db::connect()方法动态连接数据库,方法参数为数据库配置的数组或字符串例如: 字符串参数: Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8'); 配置数组参数: Db::connect([ // 数据库类型 'type' => 'mysql', //

  • tp5(thinkPHP5)框架数据库Db增删改查常见操作总结

    本文实例讲述了tp5(thinkPHP5)框架数据库Db增删改查常见操作.分享给大家供大家参考,具体如下: 添加数据insert $data = [ 'name_cn' => '张三', 'name_en' => 'jack', ]; $res = Db::name('style')->insert($data); 添加数据. INSERT INTO `tf_style` (`name_cn` , `name_en`) VALUES ('张三' , 'jack') tp5还可以通过ins

  • 基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例

    本文实例讲述了基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作.分享给大家供大家参考,具体如下: QueryList4教程 地址: https://doc.querylist.cc/site/index/doc/45 在ThinkPHP5代码根目录执行composer命令安装QueryList: composer require jaeger/querylist 如果出现 以下错误 Loading composer repositories with package

  • ThinkPHP5.0框架实现切换数据库的方法分析

    本文实例讲述了ThinkPHP5.0框架实现切换数据库的方法.分享给大家供大家参考,具体如下: 方法一:config.php添加数据库配置 'video_log' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '192.168.1.11', // 数据库名 'database' => 'db2', // 用户名 'username' => 'root', // 密码 'password' => '1234

  • PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】

    本文实例讲述了PHP利用pdo_odbc实现连接数据库.分享给大家供大家参考,具体如下: 目的:从sql server数据库里面把某个视图文件调用出来,以键值对的方式显示在页面上. 利用pdo odbc来实现PHP连接数据库: 在PHP配置文件里面开启pdo_odbc.dll服务.重启Apache服务器. 在ThinkPHP5.1的项目中在模块里添加config添加规定好的样式数据库: 代码如下: <?php return [ // 数据库类型 'type' => 'sqlsrv', // 服

  • Thinkphp5框架实现获取数据库数据到视图的方法

    本文实例讲述了Thinkphp5框架实现获取数据库数据到视图的方法.分享给大家供大家参考,具体如下: 这是学习thinkhp5的基础篇笔记. 这里主要讲怎么配置数据库链接,以及查询数据库数据,并且最后将数据赋给视图. 数据库配置: thinkphp5的数据库配置默认在conf下的database.php下面.我的数据库配置项目如下 <?php return [ // 数据库类型 'type' => 'mysql', // 数据库连接DSN配置 'dsn' => '', // 服务器地址

  • tp5(thinkPHP5)框架实现多数据库查询的方法

    本文实例讲述了tp5(thinkPHP5)框架实现多数据库查询的方法.分享给大家供大家参考,具体如下: 引言: 有时候一个管理后台,需要涉及到多个数据库.比如,商城管理.直播管理.消息管理等等,它们都有自己的数据库.这个时候,就需要去连接多个数据库,进行处理了.thinkphp可以支持多个数据库连接. 如何处理呢? 1.进行多个数据库的配置 默认会连接database.php中的数据库信息. <?php // +------------------------------------------

  • thinkPHP5实现数据库添加内容的方法

    本文实例讲述了thinkPHP5实现数据库添加内容的方法.分享给大家供大家参考,具体如下: 面对一个新框架安装好了一般不知道要干啥.那就先做一个写入功能先. 先做好准备工作先,首先要连接上数据库. 配置文件在application下的database.php里 return [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'shoptest', // 用户名 '

随机推荐