php实现投注功能
实现投注功能的基本步骤
创建一个投注功能需要处理用户输入、验证数据、存储投注记录以及返回结果。以下是实现投注功能的关键步骤。
数据库设计
投注功能通常需要以下数据表:

users:存储用户信息(用户ID、余额等)。bets:存储投注记录(投注ID、用户ID、投注金额、投注选项、投注时间等)。events:存储可投注的事件或比赛(事件ID、名称、赔率等)。
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00
);
CREATE TABLE bets (
bet_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
event_id INT NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
option VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (event_id) REFERENCES events(event_id)
);
CREATE TABLE events (
event_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
odds DECIMAL(5, 2) NOT NULL,
status ENUM('open', 'closed', 'settled') DEFAULT 'open'
);
处理投注请求
投注功能的核心是接收用户提交的数据,验证其有效性,并更新数据库。
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=betting_system', 'username', 'password');
// 获取用户输入
$userId = $_POST['user_id'];
$eventId = $_POST['event_id'];
$amount = $_POST['amount'];
$option = $_POST['option'];
// 验证用户余额
$userQuery = $db->prepare("SELECT balance FROM users WHERE user_id = ?");
$userQuery->execute([$userId]);
$user = $userQuery->fetch(PDO::FETCH_ASSOC);
if ($user['balance'] < $amount) {
die("余额不足");
}
// 验证事件状态
$eventQuery = $db->prepare("SELECT status FROM events WHERE event_id = ?");
$eventQuery->execute([$eventId]);
$event = $eventQuery->fetch(PDO::FETCH_ASSOC);
if ($event['status'] != 'open') {
die("投注已关闭");
}
// 扣除用户余额
$updateBalance = $db->prepare("UPDATE users SET balance = balance - ? WHERE user_id = ?");
$updateBalance->execute([$amount, $userId]);
// 记录投注
$insertBet = $db->prepare("INSERT INTO bets (user_id, event_id, amount, option) VALUES (?, ?, ?, ?)");
$insertBet->execute([$userId, $eventId, $amount, $option]);
echo "投注成功";
?>
前端表单设计
投注功能需要一个表单供用户提交数据。以下是一个简单的HTML表单示例:

<form action="place_bet.php" method="post">
<input type="hidden" name="user_id" value="1">
<label for="event_id">事件ID:</label>
<input type="number" name="event_id" required>
<label for="amount">投注金额:</label>
<input type="number" name="amount" step="0.01" required>
<label for="option">投注选项:</label>
<input type="text" name="option" required>
<button type="submit">提交投注</button>
</form>
安全性考虑
投注功能涉及资金操作,需特别注意安全性:
- 使用预处理语句防止SQL注入。
- 验证用户输入的金额和选项是否合法。
- 确保只有登录用户才能投注(通过会话验证)。
- 记录所有投注操作以便审计。
结算投注
投注结算需要根据事件结果更新用户余额:
<?php
// 假设事件ID为1,结果为"win"
$eventId = 1;
$result = "win";
// 获取事件赔率
$eventQuery = $db->prepare("SELECT odds FROM events WHERE event_id = ?");
$eventQuery->execute([$eventId]);
$event = $eventQuery->fetch(PDO::FETCH_ASSOC);
$odds = $event['odds'];
// 获取所有投注记录
$betsQuery = $db->prepare("SELECT * FROM bets WHERE event_id = ? AND option = ?");
$betsQuery->execute([$eventId, $result]);
$bets = $betsQuery->fetchAll(PDO::FETCH_ASSOC);
// 结算赢家
foreach ($bets as $bet) {
$winnings = $bet['amount'] * $odds;
$updateBalance = $db->prepare("UPDATE users SET balance = balance + ? WHERE user_id = ?");
$updateBalance->execute([$winnings, $bet['user_id']]);
}
// 更新事件状态为已结算
$updateEvent = $db->prepare("UPDATE events SET status = 'settled' WHERE event_id = ?");
$updateEvent->execute([$eventId]);
echo "结算完成";
?>






