项目4:抽奖程序 分时间段(按时段设置的奖品数为概率)

来源:互联网 发布:云数据查询平台 编辑:程序博客网 时间:2024/05/19 11:46

数据库先

activity_lyq_lottery奖品表lotteryidname礼品名称sum礼品总数time_start开始时间time_end结束时间addtime时间probability中奖概率大于0:表示概率    0:表示奖品数为概率isdisable是否开启0开启1关闭listorder排序默认正序msg发送短信或显示信息content备注angle转盘角度奖品所在的角度time_1时间段个数限制个数限制,-1表示不限制,0表示不发time_2time_3time_4time_5time_6time_7time_8time_9time_10time_11time_12time_13time_14time_15time_16time_17activity_lyq_lottery_log抽奖日志logidIDuid用户IDtel手机号addtime抽奖时间ip抽奖IPlotteryid奖品IDiswinning是否抽中1抽中0无result返状态回值hao随机号

主程序

<?phprequire_once (APP_ROOT . "./class/class_lib.php");require_once libfile ( 'class/StoreProcs' );pc_base::load_app_class('table_sub','',0);/** * 大转盘 * @author Administrator * */class lib_dzp_lottery extends app_lib {/** * 奖品表 */public $lottery = 'activity_lyq_lottery';/** * 奖品日志表 */public $lottery_log = 'activity_lyq_lottery_log';/** * n等奖品 */private $level = array();/** * 奖品信息 */private $lotteryArray = array();/*** * 随机数结束位数 */private $max = 30000;/** * 中奖专业户 */private $tel_zy=false;/** *增加时段时间 */private $second=0;/** *时段时间 */private $time=array();/** * 读取配置 */public function load_setting() {$data=getcache('lyqdzp_setting');define('TIME', time());//当前时间define('L_START', strtotime($data['l_start']));//报名开始时间define('L_END', strtotime($data['l_end']));//报名结束时间,-1意思昨天 23:59:59define('L_DAY_START',$data['l_day_start']);//每天开始时间define('L_DAY_END', $data['l_day_end']);//每天结束时间define('L_DAY_CISHU', $data['l_day_cishu']);//每天获得奖品次数define('L_CISHU', $data['l_cishu']);//共计获得奖品次数define('L_MIN', 20);//最少来福币define('L_LFB', $data['l_lfb']);//减少来福币define('L_ZY', $data['l_zy']);//专业户define('L_QUANSHU', $data['l_quanshu']);//圈数,大转盘开始圈数define('L_KONGJIANG', intval($data['l_kongjiang']));//空奖概率$host='www.*****.com';//现网if($_SERVER['HTTP_HOST']=='221.******'){$host='221.*******';//测试机}elseif($_SERVER['HTTP_HOST']=='125.com'){$host='125life.com';//本地}elseif(strpos($_SERVER['HTTP_HOST'],'192.168.')==0){//$host=$_SERVER['HTTP_HOST'].'/125.com';//本地}define('L_SITE', 'http://'.$host.'/');//域名最后加/define('L_URL', L_SITE.'index.php');//访问地址//只能通过flash地址访问$s=L_SITE.'flash/zhuanpan/i.swf';if(preg_replace('/swf.*$/','swf',$_SERVER['HTTP_REFERER'])!=$s){exit('老兄你已经得到得够多了,请通过正规途径摇奖!');}$this->load();}/** * 黑名单 */private $heimingdan = array();/** * 读取奖品配置 */public function load() {$this->setlottery ();$this->heimingdan = getcache ( 'tel', 'blanklist' );}private function setlottery() {$time=strtotime(date('Y-m-d',TIME));$sql = "select u.* ";$sql .= " from " . DB::table ( $this->lottery ) . " AS u ";$sql .= " where 1 ";$sql .= " and u.isdisable='0' ";$sql .= " and u.time_start<='$time' ";$sql .= " and u.time_end>='$time' ";$sql .= " ORDER BY u.listorder ";$d = DB::fetch_all ( $sql );foreach ( $d as $r ) {$sql = "select count(*) m from " . DB::table ( $this->lottery_log );$sql .= " where lotteryid='".$r ['lotteryid']."' and iswinning='1' ";$r ['num']= intval ( DB::result_first ( $sql ) );$r ['sum_over'] = intval ( $r ['sum'] ) - intval ( $r ['num'] );$r['msg']=str_replace('{name}', $r['name'],$r['msg']);$this->lotteryArray [$r ['lotteryid']] = $r;}//时间段的奖品数为概率$sum = 0;$this->second=$second=45*60;$d = array(1 => array('time' => strtotime ( date ( 'Y-m-d 00:00:00', TIME ) ),'time_end' => strtotime ( date ( 'Y-m-d 07:59:59', TIME ) )));for ($i=2;$i<=17;$i++){$d[$i]=array('time' => strtotime ( date ( 'Y-m-d '.($i+6).':00:00', TIME ) )+$second,'time_end' => strtotime ( date ( 'Y-m-d '.($i+6).':59:59', TIME ) )+$second);}foreach ($d as $k=>$t){if(TIME>=$t['time']&&TIME<=$t['time_end']){foreach ( $this->lotteryArray as $r ) {if ($r ['sum_over'] > 0) {if($r ['time_'.$k]>0){$sum += $r ['time_'.$k];}}}}}$this->time=$d;//本时段 奖品数foreach ($d as $k=>$t){if(TIME>=$t['time']&&TIME<=$t['time_end']){$m = 1;$probability = 0;$newsum=0;//80%空奖+20%奖$this->max = $sum + $sum * (L_KONGJIANG/100) / ((100-L_KONGJIANG)/100);foreach ( $this->lotteryArray as $r ) {$newsum=0;if ($r ['sum_over'] > 0) {if($r ['time_'.$k]>0){$newsum=$r ['time_'.$k];if($r['probability']>0){$probability=0;$probability=ceil($newsum*100/$r['probability']);if($probability>0){$newsum=$probability;}}$this->level [$r ['lotteryid']] ['start'] = $m;$this->level [$r ['lotteryid']] ['end'] = $m + $newsum;$m = $m + $newsum;}elseif ($r ['time_'.$k]<0){$newsum=$r ['sum_over'];if($r['probability']>0){$probability=0;$probability=ceil($newsum*100/$r['probability']);if($probability>0){$newsum=$probability;}}$this->level [$r ['lotteryid']] ['start'] = $m;$this->level [$r ['lotteryid']] ['end'] = $m + $newsum;$m = $m + $newsum;}}}}}}/** * 检测用户是否中奖 0 谢谢参与,其他 返回奖品data数据 * @param array $user array(uid,tel,ip) */public function check($user) {if (intval ( $user ['uid'] ) < 1) {//没有登录return 0;}if(intval(TIME)<intval(L_START)){//您来早了,活动还没有开始!return -21;}if(intval(TIME)>intval(L_END)){//已经过了活动时间,非常遗憾,谢谢!return -22;}if ($this->get_user_lfb ( $user ['uid'] ) < L_MIN) {//$this->credit ( $user ['uid'], -11, $logid );return -11; //您的来福币余额不足}$data = array('uid' => $user ['uid'],'tel' => $user ['tel'],'ip' => $user ['ip'],'addtime' => time ());$logid = DB::insert ( $this->lottery_log, $data, true );//检查用户  每天 已中奖品数if ($this->get_lottery ( $user ['uid'], strtotime ( date ( 'Y-m-d', TIME ) ), strtotime ( "+1day", strtotime ( date ( 'Y-m-d', TIME ) ) ), true ) >= L_DAY_CISHU) {$this->credit ( $user ['uid'], -12, $logid );//很遗憾,你本次什么也没有抽到!return -12;}//检查用户  全部 已中奖品数if ($this->get_lottery ( $user ['uid'], 0, 0, true ) >= L_CISHU&&L_CISHU>0) {$this->credit ( $user ['uid'], -12, $logid );//很遗憾,你本次什么也没有抽到!return -15;}//检测黑名单,设置概率if ($this->checkhei ( $user ['tel'] ) > 0) {$this->credit ( $user ['uid'], -13, $logid );//很遗憾,你本次什么也没有抽到!return -13;}$lotteryid = $this->choujiang();$this->credit ( $user ['uid'], $lotteryid<1?$lotteryid:0, $logid, $lotteryid ,$this->hao);if ($lotteryid > 0) {return $this->lotteryArray [$lotteryid];} else {return -4;}//-1奖品已发完//-2本时段奖品已玩//-3不发奖品//-4奖品有问题//-11您的来福币余额不足//-12很遗憾,你本次什么也没有抽到!//-13黑名单里面,很遗憾,你本次什么也没有抽到!//-14中奖专业户禁止中高讲高奖品//-15已超过yizhong总奖品数//-21您来早了,活动还没有开始!//-22已经过了活动时间,非常遗憾,谢谢!//-23对不起,现在不是活动时间,活动时间为每天}/** * 显示 * @param unknown_type $data */public function show($data){$ok=0;//3中奖$zz=0;//转盘度数$result='';//奖品名称$lotteryid=0;//奖品IDif(is_array($data)){$ok=3;$result=$data['msg'];$zz=$data['angle']+L_QUANSHU*360;$lotteryid=$data['lotteryid'];}else{$m='';switch($data){case 0:{$m= '请先登录!';}break;case -11:{$m= '您的来福币余额不足!';}break;case -12:{$m= '很遗憾,你本次什么也没有抽到!';}break;case -21:{$m= '您来早了,活动还没有开始!';}break;case -22:{$m= '已经过了活动时间,非常遗憾,谢谢!';}break;case -23:{$m= '对不起,现在不是活动时间,活动时间为每天'.L_DAY_START.':00-'.L_DAY_END.':00';}break;default:{$m= '很遗憾,你本次什么也没有抽到!';}break;}$result=$m;$ok=3;//3中奖$zz=360+L_QUANSHU*360;//再接再厉}header("Expires:Mon,26Jul199705:00:00GMT");header("Cache-Control:no-cache,must-revalidate");header("Pragma:no-cache");header("Content-type:text/html;charset=utf-8");echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";echo '<gift>'."\n";echo '<shift ok="'.$ok.'" zz="'.$zz.'" add="9" down="0" lid="0" result="'.$result.'"/>'."\n";echo '</gift>'."\n";exit;}/** * 抽奖的号 */private $hao=0;/** * 抽奖开始 */private function choujiang() {$j = 0;$lotteryid = 0;$j = mt_rand ( 1, $this->max );$this->hao=$j;foreach ( $this->level as $k => $r ) {if ($r ['start'] <= $j && $j< $r ['end'] ) {$lotteryid = $k;break;}}$d = $this->time;if($lotteryid>0){$l=$this->lotteryArray [$lotteryid];$sql = "select count(*) m from " . DB::table ( $this->lottery_log );$sql .= " where lotteryid='$lotteryid' ";$s= intval ( DB::result_first ( $sql ) );$sum_over=$l['sum']-$s;if($sum_over>0){//本时段 奖品数$sum=0;foreach ($d as $k=>$r){if(TIME>=$r['time']&&TIME<=$r['time_end']){if($l['time_'.$k]>0){//个数限制$sum=$this->get_lottery_id(0,$r['time'],$r['time_end']+1,$lotteryid);if($sum>=$l['time_'.$k]){//本时段奖品已玩$lotteryid=-2;break;}}elseif ($l['time_'.$k]==0){//不发奖品$lotteryid=-3;break;}else{//-1 不限制}}}if($this->tel_zy && $lotteryid>0&&$lotteryid<4){$lotteryid=-14;}}else{//奖品已发完$lotteryid=-1;}}else{//奖品有问题$lotteryid=-4;}return $lotteryid;}/** * 检测黑名单和普通用户,概率 * @param string $tel * @return 大于1 表示本次禁止抽 */private function checkhei($tel) {$n = mt_rand ( 1, 100 );if (in_array ( $tel, $this->heimingdan ['tel'] ) && L_ZY > 0) {$this->tel_zy=true;if ($n > L_ZY) {return 1;}}else{//号码检测 if (!self::check_tel($tel)) { return 1; }}return 0;}/** * 合计奖品数 * @param intval $uid * @param intval $start * @param intval $end * @param bool $bool true 获得奖品数 false 不统计 * @return number */private function get_lottery($uid = 0, $start = 0, $end = 0, $bool = false) {$sql = "select count(*) m from " . DB::table ( $this->lottery_log );$sql .= " where 1 ";if (intval ( $start ) > 0) {$sql .= " and addtime>='$start' ";}if (intval ( $end ) > 0) {$sql .= " and addtime<'$end' ";}if ($bool) {$sql .= " and lotteryid>0 ";}if (intval ( $uid ) > 0) {$sql .= " and uid='$uid' ";}return intval ( DB::result_first ( $sql ) );}/** * 合计奖品数 * @param intval $uid * @param intval $start * @param intval $end * @param intval $bool 奖品id * @return number */private function get_lottery_id($uid = 0, $start = 0, $end = 0, $lotteryid = 0) {$sql = "select count(*) m from " . DB::table ( $this->lottery_log );$sql .= " where 1 ";if (intval ( $start ) > 0) {$sql .= " and addtime>='$start' ";}if (intval ( $end ) > 0) {$sql .= " and addtime<'$end' ";}if ($lotteryid>=0) {$sql .= " and lotteryid='$lotteryid' ";}if (intval ( $uid ) > 0) {$sql .= " and uid='$uid' ";}return intval ( DB::result_first ( $sql ) );}/** * 获取用户来福币 * @param intval $uid * @return number */public function get_user_lfb($uid) {$sql = "select extcredits2 from sz_common_member_count ";$sql .= " where 1 ";$sql .= " and uid='$uid' ";$s=intval ( DB::result_first ( $sql ) );return $s>0?$s:0;}/** * 记录日志和更新用户来福币 * @param intval $uid * @param intval $r  返回值 * @param intval $logid * @param intval $lotteryid */private function credit($uid, $result, $logid = 0, $lotteryid = 0,$hao=0) {$data = array();if ($lotteryid > 0) {$data ['lotteryid'] = $lotteryid;$data ['iswinning'] = 1;}$data ['result'] = $result;$data ['hao'] = $hao;$data ['HTTP_REFERER'] = $_SERVER['HTTP_REFERER'];$data['139sz']=$this->type?0:1;DB::Update ( $this->lottery_log, $data, " logid='$logid' " );if (L_LFB > 0) {$sql = "UPDATE sz_common_member_count SET extcredits2=extcredits2-'". L_LFB ."' WHERE extcredits2>'0' and extcredits2>='".L_LFB."' and uid='$uid' ";DB::query ( $sql );$this->credit_log ( $uid, 'reduce', L_LFB, 1, '积分清零活动' );}}/** *手机号检查 */private function check_tel($tel){$different_network=table_sub::get_different_network();if (!preg_match("/$different_network/",$tel)) {return false;}return true;}/** * 存储过程链接 */private $StoreProcs;/** * 来福币日志 存储过程 * @param intval $uid * @param string $op add增加  reduce 消耗 * @param intval $creditvalue 来福币 * @param intval $credittype 1来福币 2来福点 * @param string $oreason  说明 */private function credit_log($uid, $op, $creditvalue, $credittype, $oreason) {if (! $this->StoreProcs) {$this->StoreProcs = new StoreProcs ();}//调用存储过程$this->StoreProcs->query ( "call app_credit_log($uid,'$op','$credittype',1,$creditvalue,'$oreason')" );}}
调用:
$dzp=new lib_dzp_lottery();$u=array('uid'=>$_G ['uid'],'tel'=>$_G ['tel'],'ip'=> $_G ['clientip']);$dzp->load_setting();$dzp->show($dzp->check($u));


原创粉丝点击