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

数据库先

activity_lyq_lottery	奖品表
lotteryid
name	礼品名称
sum	礼品总数
time_start	开始时间
time_end	结束时间
addtime	时间
probability	中奖概率	大于0:表示概率    0:表示奖品数为概率
isdisable	是否开启	0开启1关闭
listorder	排序	默认正序
msg	发送短信或显示信息
content	备注
angle	转盘角度	奖品所在的角度
time_1	时间段个数限制	个数限制,-1表示不限制,0表示不发
time_2
time_3
time_4
time_5
time_6
time_7
time_8
time_9
time_10
time_11
time_12
time_13
time_14
time_15
time_16
time_17		

activity_lyq_lottery_log	抽奖日志
logid	ID
uid	用户ID
tel	手机号
addtime	抽奖时间
ip	抽奖IP
lotteryid	奖品ID
iswinning	是否抽中	1抽中0无
result	返状态回值
hao	随机号

主程序

<?php
require_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:59
		define('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;//奖品ID
		if(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));
时间: 2024-11-13 17:41:44

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

项目3:PHP抽奖程序 ,抽奖规则代码 分时间段

抽奖概率为:奖品总数为概率 =================================== 项目3 抽奖程序 分时间段 =================================== 数据库: activity_lyq_lottery 奖品表 lotteryid name 礼品名称 sum 礼品总数 time_start 开始时间 time_end 结束时间 addtime 时间 probability 中奖概率 大于0:表示概率 0:表示奖品数为概率 isdisable 是否开

c#-C# Winfrom项目,运行程序一段时间后提示“内在不足”的报错信息。

问题描述 C# Winfrom项目,运行程序一段时间后提示"内在不足"的报错信息. 在C# Winfrom项目,有一个form窗体,六个Panel控件(用于放置显示监控视频图像的用户自定义控件), 还有一个timer计时器控件(设置每隔2分钟调用其它六个监控视频图像放到对应的Panel控件) 目前遇到的问题是,监控点的视频图像有的由于网络好点显示加载视频图像快点,有的由于网络不是太好加载显示视频图像慢点. 在form窗体运行一段时间后,导致这个form窗体的六个Panel控件在轮流显示

web前端-大项目前端文件结构怎么分?

问题描述 大项目前端文件结构怎么分? ****大项目前端文件结构怎么分?我现在在做一个校园系统,有商城,兼职,生活服务,校园百科, 现在我有点苦恼我前台的文件结构怎么建呢 解决方案 http://wenku.baidu.com/link?url=Taw2mtWWZBEnUvuGIObmV-Tw5AozM-8512-AT2Coho6f6gYDbHWFkcf8XrL8ThNDdNdjdgvzxJ58oQPC8-uuQTLpnx_eRtVGCdO94sdZ5GW 解决方案二: 就你这个也不算什么大项目

javascript+xml制作的随机抽奖程序源代码

javascript|xml|程序|随机|源代码|抽奖 javascript+xml制作的随机抽奖程序源代码 以下index.html源代码:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o

用Visual Basic设计抽奖程序

抽奖活动在生活中屡见不鲜,给我们日常生活也增添了不少乐趣.这里向大家介绍一种都很熟悉的电脑模拟抽奖游戏,就像各类晚会上经常使用的抽奖模式.抽奖程序操作要求方便直观,全体人员都可以清楚地观看抽奖全过程. 一.设计界面 先打开VB,在Form1中定义六个命令按钮,分别用来显示中奖号码的各位数字.默认情况下,参加的人数应少于10万人(当然,可以通过增加或减少按钮的个数,扩大或缩小参加抽奖人数的范围).再增加两个命令按钮,一个设置为"确定"键,当按下时,显示中奖号码.另一个设置为"继

用VB编写抽奖程序

一.界面设计 新建一个标准的EXE工程.在Form1窗体中放置一个定时器(Timer1).两个文本框(Label1,Label2).两个命令按钮(Command1,Command2)和包含7个元素的控件数组(Label3(0)-Label3(6)). 二.属性设置 Label3控件数组中的所有元素皆采用相同设置. 三.代码编写 本程序的实现原理是:当用户单击"开始"按钮时,打开定时器,利用定时器控件同时产生两个随机数sj1.sj2,sj1的范围是1-32,sj2的范围是0-49.当sj

php实现可以设置中奖概率的抽奖程序代码分享

 这篇文章主要介绍了一个抽奖程序,要求一等奖的中奖概率是0.12%,二等奖中奖概率是3%,三等奖中奖概率是12%,其他中奖概率是都是谢谢惠顾 代码如下: <?php /**  * 抽奖  * @param int $total  */ function getReward($total=1000) {  $win1 = floor((0.12*$total)/100);  $win2 = floor((3*$total)/100);  $win3 = floor((12*$total)/100)

Windows 8 metro程序分屏显示技巧

  Windows 8 metro程序分屏显示技巧 据悉,Win8新增的分屏显示功能,能让某个Metro应用固定在屏幕左/右侧,相当于同时显示两个全屏程序(包括桌面).那么win8的程序分屏显示功能作为一个新生的事物,很多用户都不熟悉,该如何运用呢? 微软展示了 Windows 8 之一是功能的管理单元.微软,只有高分辨率的 Pc 上提供此功能. Windows 8 metro 程序分屏显示技巧 与一些注册表修改,您可以强制启用快照不受支持的机器上. 在开始屏幕上键入 regedit 并查找以下

link中抽奖程序如何能实现同时抽取1、2、3等奖?

问题描述 link中抽奖程序如何能实现同时抽取1.2.3等奖? link中抽奖程序如何能实现同时抽取1.2.3等奖? 解决方案 放3个文本框,分别把抽奖的过程重复3次,将结果放上去