php实现抽奖程序
PHP实现抽奖程序
基本抽奖逻辑
创建一个简单的抽奖程序需要定义奖品、中奖概率及随机选择逻辑。以下是一个基础实现示例:
<?php
// 奖品配置(奖品名称 => 概率)
$prizes = [
'一等奖' => 1, // 1%概率
'二等奖' => 5, // 5%概率
'三等奖' => 10, // 10%概率
'谢谢参与' => 84 // 84%概率
];
function drawLottery($prizes) {
$totalProbability = array_sum($prizes);
$randomNumber = mt_rand(1, $totalProbability);
$currentProbability = 0;
foreach ($prizes as $prize => $probability) {
$currentProbability += $probability;
if ($randomNumber <= $currentProbability) {
return $prize;
}
}
}
$result = drawLottery($prizes);
echo "恭喜获得:" . $result;
?>
数据库集成版本
如果需要从数据库读取奖品信息,可以使用以下扩展实现:
<?php
// 假设数据库连接已建立
$pdo = new PDO('mysql:host=localhost;dbname=lottery', 'username', 'password');
// 从数据库获取奖品配置
$stmt = $pdo->query("SELECT prize_name, probability FROM prizes");
$prizes = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
function drawFromDB($prizes) {
$totalProbability = array_sum($prizes);
$randomNumber = mt_rand(1, $totalProbability);
$accumulated = 0;
foreach ($prizes as $item => $prob) {
$accumulated += $prob;
if ($randomNumber <= $accumulated) {
return $item;
}
}
return '未中奖';
}
$winner = drawFromDB($prizes);
echo "中奖结果:" . $winner;
?>
防止重复中奖
添加用户ID验证防止重复抽奖:
session_start();
if (!isset($_SESSION['user_id'])) {
die("请先登录");
}
if (isset($_SESSION['has_drawn'])) {
die("您已经参与过抽奖");
}
// 执行抽奖逻辑
$prize = drawLottery($prizes);
// 记录中奖信息
$_SESSION['has_drawn'] = true;
$_SESSION['won_prize'] = $prize;
echo "抽奖结果:" . $prize;
可视化界面
简单的HTML界面整合:
<!DOCTYPE html>
<html>
<head>
<title>抽奖系统</title>
</head>
<body>
<h1>幸运大抽奖</h1>
<form method="post" action="draw.php">
<button type="submit">开始抽奖</button>
</form>
<?php if(isset($result)): ?>
<div class="result">
<h2>您的抽奖结果:<?php echo $result; ?></h2>
</div>
<?php endif; ?>
</body>
</html>
高级功能扩展
-
概率动态调整:
// 根据库存调整概率 function adjustProbability($prizes) { // 获取库存量逻辑 $inventory = [ '一等奖' => 10, '二等奖' => 50, // ... ]; foreach ($prizes as $name => &$prob) { if ($inventory[$name] <= 0) { $prob = 0; } } return $prizes; } -
抽奖记录:
// 记录中奖信息到数据库 function recordWinner($userId, $prize) { global $pdo; $stmt = $pdo->prepare("INSERT INTO winners (user_id, prize, draw_time) VALUES (?, ?, NOW())"); $stmt->execute([$userId, $prize]); } -
定时抽奖:
// 检查抽奖时间段 function checkDrawTime() { $start = strtotime('10:00'); $end = strtotime('18:00'); $now = time(); return ($now >= $start && $now <= $end); }
以上实现可根据实际需求进行组合和扩展,建议在生产环境中添加更多安全验证和异常处理机制。






