这次的活动是自己的处女作,主要的功能有哪些呢??
1:自己答题 ----->>>根据自己答题的结果来进行打分和排序
2:邀请好友答题
每个参与者需要三个好友答完三套不同的题目才能答题成功,此时参与者才能看到好友对自己的评价。评价分数也会相应的展示出来。
主要操作点:
1.PHP数组操作,多维数据转一维,数组去重,数组删除指定元素等等
2.随机数操作,在指定的范围内随机生成n个不同的随机数,8选1,再从剩下的7中选4.
3.redis 缓存数据库的使用。
==============================================================================================================
正文:
该活动只能在微信的环境下完成,因此需要获取用户的openid,即用户的唯一标识ID,有了ID号之后接下来才能进行下一步,获取openid的方法如下:
if (isset($_COOKIE["openid"])) {//先从cookie中获取 用户的openid $openid = $_COOKIE["openid"]; $cacheOpenid = $this->getCacheOpenid($openid);//从缓存中获取该用户是否已经参与活动 if (empty($cacheOpenid)) { setcookie("openid", "", time() - 5800, "/", ".ciweishixi.com"); //没有用户信息 header('Location: ' . self::homeurl); die(); } } else { $REDIRECT_URI = urlencode(self::homeurl); $info = $this->wxUserInfo($REDIRECT_URI, "state"); if (is_array($info)) { $openid = $info["data"]["openid"]; setcookie("openid", $openid, time() + 3600 * 2, "/", ".ciweishixi.com"); $data = $info["data"]; $model->saveGroupxzProfile($data["openid"], $data["nickname"], $data["headimgurl"]); $this->addCacheOpenid($openid);//将openid 写入缓存 } else { die("网络繁忙请刷新再试"); } }
首先从用户的cookie中获取openid,再判断该openID是否存在数据库中,若不存在,则删除本地的cookie,重新设置新的cookie,(用户中cookie的openid并非来自本网站,有可能是伪造的cookie数据)
没有从用户的cookie中获取到openid的时候,从微信中获取openID。
从缓存中获取openid的代码如下:
//从缓存中获取openid,判断该用户是否参加过该活动 private function getCacheOpenid($openid){ $key = "pj_group_openid_".$openid; $cache = RedisClass::getInstance(12); $data = $cache->GET($key); if (empty($data)) {//缓存中不存在数据,则在数据库中查询该值 $model = new SweepstakesModel(); $data = $model->getGroupxzProfile($openid); if (!empty($data)) {//数据库中存在则写入缓存 $cache->SET($key, $openid, 3600*24*30);//1个月过期时间 } } return $data; }
将新插入到数据库中的数据写入缓存
//设置openid缓存 private function addCacheOpenid($openid){ $key = "pj_group_openid_".$openid; $cache = RedisClass::getInstance(12); $cache->SET($key, $openid, 3600*24*30);//1个月过期时间 }
数组操作:邀请好友的时候,随机给用户分配题目,
//三批题目没有分发完毕,则进行题目分配 /*$numData = $this->getJoinNumBytidCache($tid);//从缓存中获取总共帮助的人数 //从剩余的题目中进行数据 $item_id = ($numData % 3)+1;//当前人数对3取模+1 , 给帮测者分配的题目批次号 $this->setJoinNumBytidCache($tid , $numData+1);//缓存数据加1*/ $item_key = 0; $haveHelpItem = $model->getQuestionItemByTid($tid);//[1,2] $allitem = [1, 2, 3]; if (!empty($haveHelpItem)) { foreach ($haveHelpItem as $key => $value) { unset($allitem[($value['item_id']-1)]); } } $item_key = array_rand($allitem,1); $item_id = $allitem[$item_key]; //从一个数组中随机取一个值
$allitem = [1,2,3] 表示最初的三批题目,先从数据库中获取,该用户已经被回答了几批题目,然后从总池子中删除已经被回答的题目,再从剩下的题目中随机分配。
第二种分配方法利用缓存,每个新进来的人都会分配到不同的题目,用户每次刷新都会获取一个新的题目序号。
$numData = $this->getJoinNumBytidCache($tid);//从缓存中获取总共帮助的人数 //从剩余的题目中进行数据 $item_id = ($numData % 3)+1;//当前人数对3取模+1 , 给帮测者分配的题目批次号 $this->setJoinNumBytidCache($tid , $numData+1);//缓存数据加1
选取随机数,8选一,再从中进行7选4
$answer_score = [] ; $answer_id = $answer[2]['answer'] ; //记录第三道题的答案ID $answer_point = $this->position[$answer_id-1];//获取第三道题答案对应的中文名称 $random = range(0,7);//生成0-7的数组 unset($random[($answer_id-1)]);//排除自测的选项 unset($this->position[($answer_id-1)]); ########## 生成四个不重复的随机数##### $random_keys=array_rand($random,4); $answer_score[0] = array($answer_point => mt_rand(95,99));//中文名称对应的分数 $answer_score[1] = array($this->position[$random[$random_keys[0]]] => mt_rand(81,87)); $answer_score[2] = array($this->position[$random[$random_keys[1]]] => mt_rand(70,80)); $answer_score[3] = array($this->position[$random[$random_keys[2]]] => mt_rand(70,80)); $answer_score[4] = array($this->position[$random[$random_keys[3]]] => mt_rand(70,80));