营销系统的开发
原创实现一个营销系统的开发要比微网站更难,因为这需要做更多的互动控制用户行为,配置后台数据,也就意味着开发更加复杂。
数据库设计一般说来,大转盘营销系统中,至少需要包含以下表。
□ 全局配置表:用于存储系统的配置信息。
□ 奖品配置表:用于存储奖品名称及数量等信息。
□ 用户信息表:用于记录参加活动的用户信息。
□ 抽奖记录表:用于记录用户参加的活动。
在数据库设置之前,需要创建一个数据库,这里所创建的数据库的名称为「wx_dazhuanpan」。「wx」是「微信」二字拼音的首字母,「dazhuanpan」则是「大转盘」的拼音。
在 phpMyAdmin 的后台中,选择「Database」(数据库)标签,然后在「Create Database」(创建数据库)功能框中输入数据库的名称「wx_dazhuanpan」,编码类型选择「utf8_general_ci」,最后点击「Create」(创建)按钮,如图 6-2 所示。

图 6-2 创建数据库
创建好数据库之后,我们开始创建表。
一般说来,一个活动的开展,总会有个开始时间和结束时间,这是系统开发过程要考虑的。另外,由于这是一个抽奖活动,而抽奖活动不可能给用户无限次的抽奖机会,所以还需要做一个抽奖次数限制。
我们定义一个配置表,该配置表用于存储上述配置内容。该表的建表脚本如下:
DROP TABLE IF EXISTS `wx_config`; CREATE TABLE IF NOT EXISTS `wx_config` ( `id` int(5) NOT NULL, `starttime` varchar(30) NOT NULL, `endtime` varchar(30) NOT NULL, `maxtimes` varchar(5) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
你可以使用 phpMyAdmin 数据库后台的创建表格功能来建立这个表,依次填写表名及各个字段名称、类型及其他属性,如图 6-3 所示。

图 6-3 创建表
也可以直接在 SQL 运行框上使用上述脚本来建表,如图 6-4 所示。

图 6-4 运行 SQL 脚本建表
创建好的全局配置表如图 6-5 所示。

图 6-5 表格创建成功
奖品配置表则用于存储奖品信息,这些信息包括:奖品名称、奖品数量及中奖概率。
建表的 SQL 脚本如下:
DROP TABLE IF EXISTS `wx_award`; CREATE TABLE IF NOT EXISTS `wx_award` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT 『奖品名称』, `total` int(11) NOT NULL COMMENT 『数量』, `prob` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
创建后的奖品配置表如图 6-6 所示。

图 6-6 奖品配置表
用户信息表主要用于存储用户的个人信息,这些信息包括:微信 OpenID、用户姓名、用户手机号。
建表的 SQL 脚本如下:
DROP TABLE IF EXISTS `wx_user`; CREATE TABLE IF NOT EXISTS `wx_user` ( `id` int(6) NOT NULL auto_increment, `openid` varchar(30) NOT NULL, `name` varchar(16) NOT NULL, `mobile` varchar(15) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `openid` (`openid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
为了防止同一个人多次重复提交而导致出错,我们对 openid 设置了唯一性约束,这样可以避免出现同一人多次重复提交个人信息的情况。对于一些潜在的隐患,我们应该在设计时就防患于未然。
创建好的用户信息表如图 6-7 所示。

图 6-7 用户信息表
抽奖记录表主要用于存储用户的抽奖纪录,这些信息包括:微信 OpenID、奖品等级、抽奖日期、领奖状态。
建表的 SQL 脚本如下:
DROP TABLE IF EXISTS `wx_winner`; CREATE TABLE IF NOT EXISTS `wx_winner` ( `id` int(10) unsigned NOT NULL auto_increment, `openid` varchar(30) NOT NULL, `award` varchar(100) NOT NULL COMMENT 『奖品等级』, `getdate` varchar(20) NOT NULL, `status` tinyint(1) NOT NULL default 『0』 COMMENT 『0 未领奖,1 已领奖』, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
创建好的抽奖记录表如图 6-8 所示。

图 6-8 抽奖记录表
最终,在数据库中创建了 4 个表,如图 6-9 所示。

图 6-9 所有表格
在抽奖类系统的开发中,防作弊是非常重要的安全措施之一。如果没有防作弊机制,那么可能所有的奖品都会被作弊软件一扫而光。
微信公众平台提供的 OAuth2.0 网页授权,可以限定用户必须在微信中打开,并且可以通过查询用户的订阅状态限定已经关注微信公众账号的用户才能参加活动。
下面是方倍工作室开发的微信公众平台高级接口 PHP SDK 中关于 OAuth2.0 网页授权的代码。
require_once('configure.php'); //引用配置 class class_weixin { var $appid = APPID; var $appsecret = APPSECRET; //构造函数,获取 Access Token public function __construct($appid = NULL, $appsecret = NULL) { if($appid && $appsecret){ $this->appid = $appid; $this->appsecret = $appsecret; } $url = 「https://api.weixin.qq.com/cgi-bin/token?grant_t ype=client_credential&appid=」.$this->appid.「&secret=」.$this->appsecret; $res = $this->http_request($url); $result = json_decode($res, true); $this->access_token = $result[「access_token」]; $this->expires_time = time(); } //生成 OAuth2 的 URL public function oauth2_authorize($redirect_url, $scope, $state = NULL) { $url = 「https://open.weixin.qq.com/connect/oauth2/authorize?appid=」.$this->appid.「&redirect_uri=」.$redirect_url.「&response_type=code&scope=」.$scope.「&state=」.$state.「#wechat_redirect」; return $url; } //生成 OAuth2 的 Access Token public function oauth2_access_token($code) { $url = 「https://api.weixin.qq.com/sns/oauth2/access_token?appid=」 .$this->appid.「&secret=」.$this->appsecret.「&code=」.$code.「&grant_type=authorization_code」; $res = $this->http_request($url); return json_decode($res, true); } //http 请求(支持 GET 和 POST) protected function http_request($url, $data = null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } }
上述代码定义了构造函数及两个成员函数,成员函数分别用于生成 OAuth2 的 URL 以及生成 OAuth2 的 Access Token。
require_once('weixin.class.php'); $weixin = new class_weixin(); $openid = ""; if (!isset($_GET["code"])){ $redirect_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $jumpurl = $weixin->oauth2_authorize($redirect_url, "snsapi_base", "123"); Header("Location: $jumpurl"); }else{ $access_token = $weixin->oauth2_access_token($_GET["code"]); $openid = $access_token['openid']; }
使用上述 SDK 时,先初始化一个类对象,通过判断 $_GET 变量是否有「code」参数来决定当前是否要进行网页授权,授权成功后再使用「code」值来换取「access token」,返回的「access token」信息中将包含「openid」,这样就得到了用户的 OpenID。
用户信息收集用户信息收集主要由用户填写表单来实现。这里使用 form 标签。
form 标签用于为用户输入创建 HTML 表单。表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等。下面是表单的代码,它包含姓名、手机号码的输入,另外还隐性地提交当前用户的 openid。
<form method=「post」 action=「submit.php」 id=「form」 onsubmit=「return tgSubmit()」> <ul class=「round」> <li class=「title mb」><span class=「none」> 填写入口 </span></li> <li class=「nob」> <table width=「100%」 =「0」 cellspacing=「0」 cellpadding=「0」 class=「kuang」> <tbody> <tr> <th> 姓名 </th> <td><input type=「name」 class=「px」 placeholder=「 请输入您的姓名」 id=「name」 name=「name」 value=「」> </td> </tr> </tbody> </table> <table width=「100%」 =「0」 cellspacing=「0」 cellpadding=「0」 class=「kuang」> <tbody> <tr> <th> 手机号码 </th> <td><input type=「mobile」 class=「px」 placeholder= 「请输入您的手机号码」 id=「mobile」 name=「mobile」 value=「」> </td> </tr> </tbody> </table> </li> </ul> <div class=「footReturn」> <input type=「hidden」 name=「openid」 id=「openid」 value=「<?php echo $openid;?>」> <input type=「submit」 class=「submit」 value=「提交」> </div> </form>
用户填好提交时,先使用 JavaScript 脚本来验证内容的合法性。这包括验证姓名是否为空以及手机号码位数是否正确,代码如下所示。
<script> function showTip(tipTxt) { var div = document.createElement('div'); div.innerHTML = 『<div class=「deploy_ctype_tip」><p>』 + tipTxt + 『</p></div>』; var tipNode = div.firstChild; $(「#wrap」).after(tipNode); setTimeout(function () { $(tipNode).remove(); }, 1500); } function tgSubmit(){ var name=$(「#name」).val(); if($.trim(name) == 「」){ showTip(『请输入姓名』) return false; } var mobile=$(「#mobile」).val(); var patrn = /^[0-9]{11}$/; if (!patrn.exec($.trim(mobile))) { showTip(『请正确输入手机号码』) return false; } return true; } </script>
信息验证成功之后,会通过 POST 的方式发到一个新的页面,在该页面中,将用户的「openid」、姓名及电话都写入数据库中,代码实现如下所示。
$openid = $_POST["openid"]; $name = $_POST["name"]; $mobile = $_POST["mobile"]; if (empty($openid) || empty($name) || empty($mobile)){ // var_dump($_POST); echo '<meta http-equiv="refresh" content="0; url=index.php"/>'; }else{ include_once('mysql.class.php'); $db = new class_mysql(); $mysql_state = "INSERT INTO `wx_user` (`id`, `openid`, `name`, `mobile`) VALUES (NULL, '$openid', '$name', '$mobile');"; $config = $db->execute($mysql_state); // var_dump($mysql_state); Header("Location: lottery.php?openid=$openid"); } 抽奖页面实现
大转盘的开发最重要的素材是转盘图片和指针图片,如图 6-10 所示。

图 6-10 转盘和指针
接着需要实现页面布局,其中图片素材需要将转盘设置为前景,指针设置为背景,依此定义外部和内部容器,HTML 代码如下:
1 <div id="outercont" > 2 <div id="outer-cont"> 3 <div id="outer"><img src="img/activity-lottery-5.png"></div> 4 </div> 5 <div id="inner-cont"> 6 <div id="inner"><img src="img/activity-lottery-2.png"></div> 7 </div> 8 </div>
相应的 CSS 控制代码如下:
1 #outer-cont { 2 position: relative; 3 width: 100%; 4 top: 20px; 5 margin-bottom: 30px; 6 } 7 #inner-cont { 8 position: absolute; 9 width: 100%; 10 top: 70px; 11 } 12 #outer { 13 height: 227px; 14 margin: 0 auto; 15 max-width: 227px; 16 width: 227px; 17 } 18 #inner { 19 cursor: pointer; 20 height: 110px; 21 margin: 0 auto; 22 max-width: 90px; 23 width: 90px; 24 } 25 #outer img, #inner img { 26 display: block; 27 margin: 0 auto; 28 }
再定义一些要显示的内容区域,主要有中奖结果区、奖项设置区、活动说明区。相关代码如下所示:
1 <div class=「content」 > 2 <div class=「boxcontent boxyellow」 id=「result」 > 3 <div class=「box」> 4 <div class=「title-orange」><span> 恭喜中奖 </span></div> 5 <div class=「Detail」> 6 <p> 您中了 <span class=「red」 id=「prizelevel」 ></span></p> 7 <p> 奖品为 <span class=「red」 id=「prizename」></span></p> 8 </div> 9 </div> 10 </div> 11 <div class=「boxcontent boxyellow」> 12 <div class=「box」> 13 <div class=「title-green」><span> 奖项设置:</span></div> 14 <div class=「Detail」> 15 <p> 一等奖:iPhone 6 </p> 16 <p> 二等奖:iPhone 5S</p> 17 <p> 三等奖:iPhone 5C</p> 18 <p> 四等奖:iPad Air </p> 19 <p> 五等奖:iPhone 4S</p> 20 <p> 六等奖:iPad mini</p> 21 </div> 22 </div> 23 </div> 24 <div class=「boxcontent boxyellow」> 25 <div class=「box」> 26 <div class=「title-green」> 活动说明:</div> 27 <div class=「Detail」> 28 <p> 本次活动每人可以抽奖 5 次 </p> 29 <p> 祝您中奖!</p> 30 </div> 31 </div> 32 </div> 33 </div>
在页面初始化时,中奖结果区域通过样式表控制成不可见,抽奖页面的最终实现效果如图 6-11 所示。

图 6-11 大转盘
接着我们需要实现抽奖算法及中奖通知的功能。
首先定义指针转动时中奖的角度和未中奖的角度,以便判断用户是否中奖,图中有 6 个奖项,相应的也有 6 个未中奖区域,奖项角度及其他变量定义如下:
1 var totalAngle = 0; 2 var steps = []; 3 var loseAngle = [36, 96, 156, 216, 276, 336]; 4 var winAngle = [6, 66, 126, 186, 246, 306]; 5 var prizeLevel; 6 var now = 0; 7 var count = 0; 8 var a = 0.01; 9 var outter, inner, timer, running = false;
用户进入抽奖界面后,将点击抽奖指针,相应的代码处理如下:
1 $(「#inner」).click(function() { 2 if (running) return; 3 if (count >= 3) { 4 alert(「达到最大抽奖次数!」); 5 return 6 } 7 $.ajax({ 8 url: 「data.php」, 9 dataType: 「json」, 10 data: { 11 openid: 「<?php echo $_GET[」openid「];?>」, 12 time: (new Date()).valueOf() 13 }, 14 beforeSend: function() { 15 running = true; 16 timer = setInterval(function() { 17 i += 5 18 }, 19 1) 20 }, 21 success: function(data) { 22 //达到最大抽奖次数 23 if (data.status == 「MAX」) { 24 alert(「您已达到最大抽奖次数!」); 25 count = 3; 26 clearInterval(timer); 27 return 28 } 29 //中奖时转盘转到相应位置 30 if (data.status == 「WIN」) { 31 $(「#prizename」).text(data.prizename); 32 count = 3; 33 clearInterval(timer); 34 prizeLevel = data.prizelevel; 35 start(winAngle[data.prizelevel - 1]); 36 return 37 } 38 //未中奖则再给机会 39 running = false; 40 count++ 41 prizeLevel = null; 42 start() 43 }, 44 //未获取 json 返回,前台处理 45 error: function() { 46 prizeLevel = null; 47 start(); 48 running = false; 49 count++ 50 }, 51 timeout: 4000 52 }) 53 })
点击事件发生时,页面将向 data.php 文件发送 POST 请求,将当前用户的 openid 和时间传递过去。data.php 在收到数据后将需要进行一系列的复杂的处理,这些在 6.2.5 节中有详细的讲述。
下面是一个中奖情形的返回结果:
echo '{"status": "WIN", "prizename": "iPhone 5S", "prizelevel": "2"}';
该情形表示当前已中奖,奖品等级是 2,奖品为 iPhone 5S。data.php 将该 JSON 数据返回给请求页面,原页面收到数据后将进行处理(第 29 行 ~ 第 37 行代码),它将抽奖次数直接置为最大抽奖次数 3,并且计算转盘将要旋转的角度,而这个旋转角度也就是奖项的角度,以此确保转盘停止后,指针落点无误。
而当中奖数据返回中没有要中奖的标记(第 38 行 ~ 第 42 行)或者没有接收到返回的 JSON 数据时(第 44 行 ~ 第 50 行),转盘也需要计算旋转角度,页面将在前台累加抽奖次数,直到达到最大抽奖次数,然后提示用户抽奖次数已经用完了。如果返回的 JSON 数据中也显示已经达到最大抽奖次数时,则以 JSON 数据标识优先作为判断(第 22 行 ~ 第 28 行)。
当启动转盘转动时,本次抽奖结果已经被旋转角度确定下来了,这是通过 start()方法来实现的,该方法带有一个参数 deg。如果中奖,则 deg 传输进来的时候就已经是某奖项的角度;如果没有中奖,deg 直接传空,这时将随机计算出的一个非奖项的角度并赋给它。start()方法的实现如下所示:
1 function start(deg) { 2 deg = deg || loseAngle[parseInt(loseAngle.length * Math.random())]; 3 running = true; 4 clearInterval(timer); 5 totalAngle = 360 * 5 + deg; 6 steps = []; 7 now = 0; 8 countSteps(); 9 requestAnimFrame(step) 10 }
在 start()函数中,需要根据旋转角度生成本次转动的步骤,这时往往需要另外添加 N 个 360 度,以便在旋转 N 圈后,再落到真正的奖项区域。而这个旋转角度则以数组的方式保存。其角度差需要逐渐变小,以实现减速旋转最终停下来的效果。该数组的生成代码如下所示:
1 function countSteps() { 2 var t = Math.sqrt(2 * totalAngle / a); 3 var v = a * t; 4 for (var i = 0; i < t; i++) { 5 steps.push((2 * v * i - a * i * i) / 2) 6 } 7 steps.push(totalAngle) 8 }
上述代码将生成一个元素个数非常多的角度列表数组,数组存储在 steps 中。为了简便生成了一个简化版本,如表 6-1 所示。
表 6-1 旋转角度数组
从表 6-1 中可以看到,转盘将从 0 度旋转到 65.9 度,每一步的旋转角度差将越来越小,直到为 0,而这时也将停留到预先生成好的角度上了。
而实现旋转的动画效果,则需使用 HTML5 中的 window.requestAnimFrame 方法,代码如下所示:
1 window.requestAnimFrame = (function() { 2 return window.requestAnimationFrame || 3 window.webkitRequestAnimationFrame || 4 window.mozRequestAnimationFrame || 5 window.oRequestAnimationFrame || 6 window.msRequestAnimationFrame || 7 function(callback) { 8 window.setTimeout(callback, 1000 / 60) 9 } 10 })();
当动画将每个旋转角度走完以后,需要将中奖结果提示给用户。没有中奖时只需要生成一个自动弹出的消息框即可;而中奖时,则需要隐藏转盘并显示中奖区域和中奖结果。该部分代码如下所示:
1 function step() { 2 outter.style.webkitTransform = 『rotate(' + steps[now++] + 'deg)』; 3 outter.style.MozTransform = 『rotate(' + steps[now++] + 'deg)』; 4 outter.style.oTransform = 『rotate(' + steps[now++] + 'deg)』; 5 outter.style.msTransform = 『rotate(' + steps[now++] + 'deg)』; 6 if (now < steps.length) { 7 requestAnimFrame(step) 8 } else { 9 running = false; 10 setTimeout(function() { 11 if (prizeLevel != null) { 12 var levelName= new Array(「」, 「一等奖」, 「二等奖」, 「三 等奖」, 「四等奖」, 「五等奖」, 「六等奖」) 13 $(「#prizelevel」).text(levelName[prizeLevel]); 14 $(「#result」).slideToggle(500); //显示中奖区域 15 $(「#outercont」).slideUp(500) //隐藏转盘 16 } else { 17 alert(「亲,继续努力哦!」) 18 } 19 }, 20 200) 21 } 22 }
最终,中奖结果的页面如图 6-12 所示:

图 6-12 大转盘中奖页面
中奖算法实现是程序中一个核心的功能,它决定着整个抽奖能否正常运作。我们将这一过程进行分解,具体讲解如下。
1.身份合法性判断
首先获取用户的微信 OpenID,如果没有传输过来,或者传输了但值为空,则返回空。实现代码如下所示。
iinclude_once('mysql.class.php'); $db = new class_mysql(); if (!isset($_GET[『openid』]) || ($_GET[『openid』] == 「」)){ echo 「非法调用」; return ; } $openid = $_GET[『openid』]; // 1.判断该用户是否已注册,未注册不返回 $mysql_state = 「SELECT * FROM `wx_user` WHERE `openid` = 『」.$openid.「』 」; $userInfo = $db->query_array_one($mysql_state); // var_dump($userInfo); if (count($userInfo) == 0){ echo 「未注册或非法用户」; return; }
2.抽奖资格判断
首先获取系统配置表中每个用户每天最大的抽奖次数,然后再查询当前用户当天已抽奖的次数,如果用户当前抽奖次数已达到每天最大次数,则返回「max_times」的错误类型。
// 2.判断该用户是否还有抽奖资格; $mysql_state = 「SELECT * FROM `wx_config` WHERE `id` = 1 LIMIT 0 , 1」; $config = $db->query_array_one($mysql_state); // var_dump($config); $mysql_state = 「SELECT * FROM `wx_winner` WHERE `openid` = 『」.$openid.「』 AND `getdate` = 『」.date(「Y-m-d」,time()).「』」; $qualification = $db->query_array($mysql_state); // var_dump($qualification); if (count($qualification) >= $config[『maxtimes』]){ // echo 「已抽奖」; echo 『{ 「error」: 「max_times」, 「message」: 「」, 「prizelevel」: 「」, 「success」: 「」 }』; return; }
3.奖品余留判断
即使用户还有抽奖资格,也要对当前奖品剩余量进行判断,如果奖品已经都抽完了,那么所有用户都不应该再抽到奖品。
//3. 判断奖项是否仍有剩余; $mysql_state = 「SELECT * FROM `wx_award` WHERE LENGTH(`name`) > 0」; $award = $db->query_array($mysql_state); if (count($award) == 0){ echo 「没有配置奖项???」; return; }
4.生成中奖概率
用户能不能中奖,是以所有概率相加之和作为基数,以当前的随机数为分子,来进行匹配的,如果能匹配到某个奖品的等级的区间,则认为用户抽中了该等级的奖,代码如下所示。
//4.生成中奖概率 //统计总的中奖概率 $allprob = 0; for ($i = 0; $i < count($award); $i++) { $allprob += $award[$i][『prob』]; } //总和不足 100,补齐 100 if ($allprob <= 100){ $allprob =100; } // var_dump('allprob:'.$allprob); //4. 随机生成本次中奖概率; //使用区间分布方法,保证各概率上的倍率一致 $random = rand(1, $allprob); // 21/100 = 20% 最终中奖概率 $min = 0; $max = 0; $level = -1; // var_dump('random:'.$random); for ($i = 0; $i < count($award); $i++) { $min += ($i < 1)?0:$award[$i-1][『prob』]; $max += $award[$i][『prob』]; // var_dump('min:'.$min); // var_dump('max:'.$max); if ($random >= $min && $random < $max ){ $level = $i + 1; break; } }
5. 奖品分配及返回
如果在上一步了,计算出用户应该中奖,那么在中奖奖品仍有剩余的情况下,给他分配当前奖品,并且将中奖记录写入数据库,同时返回中奖信息。如果没有中奖,则消耗一次中奖机会。代码如下所示。
//5.分配奖品 $lucky = false; $finally = 「」; for ($i = 0; $i < count($award); $i++) { if ($award[$i][『id』] == $level && $award[$i][『total』] >= 1){ //奖项减一 $mysql_state1 = 「UPDATE `wx_award` SET `total` = `total` -1 WHERE `id` = 」.$level; $result = $db->execute($mysql_state1); //写入抽奖并且中奖 $mysql_state1 = 「INSERT INTO `wx_winner` (`id` ,`openid` , `award` ,`getdate` ,`status`) VALUES (NULL , 『」.$openid.「』, 『」.$award[$i][』name『].「』, 『」.date(「Y-m-d」,time()).「』, 『0』);」; $result = $db->execute($mysql_state1); //要返回的结果 $finally = 『{ 「error」: 「ok」, 「message」: 「』.$award[$i][『name』].『」, 「prizelevel」: 「』.$award[$i][『id』].『」, 「success」: 「y」 }』; $lucky = true; break; } } if (!$lucky){ //写入已抽奖,但不中奖 $mysql_state1 = 「INSERT INTO `wx_winner` (`id` ,`openid` ,`award` , `getdate` ,`status`) VALUES (NULL , 『」.$openid.「』, 『』, 『」.date(「Y-m-d」,time()).「』, 『 // var_dump($mysql_state1); $result = $db->execute($mysql_state1); $finally = 』{ 」error「: 」noprize「, 」message「: 」「, 」prizelevel「: 」「, 」success「: 」「 }『; } echo $finally;
经过上述 5 个繁琐的步骤,就实现了中奖算法。
中奖记录查询对于中奖的用户,最终还需要提供中奖记录查询功能,以便用户兑奖。记录查询很简单,直接在抽奖记录表中检索数据即可。实现代码如下所示。
function getLotteryItem($openid) { include_once('mysql.class.php'); $db = new class_mysql(); $mysql_state = 「SELECT * FROM `wx_winner` WHERE LENGTH(`award`) > 0 AND `openid` = 『$openid』」; $result = $db->query_array($mysql_state); // var_dump($result); if (count($result) == 0){ return 『 <tr> <td> 你还没有中过奖 </td> </tr> 』; }else{ $content = 「」; foreach ($result as $index => $item){ $title = 「奖品:」.$item[「award」].「<br> 时间:」 .$item[「getdate」].「<br> 状态:」.(($item[「status」] == 0)?「未领取」:「已领取」); $content .= 『 <tr> <td>』.$title.『</td> </tr> 』; } return $content; } }
版权保护: 本文由 李斯特 原创,转载请保留链接: https://www.wechatadd.com/artdet/8927
阅读推荐
更多...- 聚焦「个体」本身微信能成为创客的热土吗? 2023-07-14
- 创业计划,参考文献 2023-09-08
- 顺丰的成功历程 2024-02-12
- 消除客户的疑虑,让客户放心——销售技巧 2023-03-04
- 如何从营销视角做好微信内容推广 2022-07-28
- 「创业经验」「微」开发第五步——广而告之,传播服务 2024-01-20
- 尝试新信念——销售技巧 2023-03-04
- 创新创业基础知识,创业 2023-09-06
- 洞悉用户:新增与取关用户分析,预期效果,新增人数分析 2023-05-30
- 你言行一致吗「销售管理」 2023-03-02
- 销售秘籍:如何分析 A、B、C 三类客户并高效寻找目标客户? 2023-03-05
- 广告是对消费者大脑的投资 2024-02-12
- 金牌销售人的攻心秘籍——拉近与客户的心理距离才能赢得客户,提升销售业绩 2023-04-14
- 「微商生意」瑾秀珠宝:是和田玉熊市逆袭,经营半年,月流水破百万元 2023-01-25
- 针对陌生客户的策略,获得更多的回头客 2023-04-14
- 「互联网+」背景下的微商创业多样化策略思考 2023-07-14
- 营销活动要构思活动策划方案 2022-07-01
- 服务号的微电商全流程 2023-07-02