php实现礼券提货
PHP实现礼券提货功能
礼券提货功能通常涉及礼券的生成、验证、使用和记录。以下是实现这一功能的关键步骤和代码示例。
数据库设计
创建礼券表存储礼券信息,包含以下字段:
id: 礼券唯一标识code: 礼券码value: 礼券面值status: 使用状态(未使用/已使用)created_at: 创建时间used_at: 使用时间user_id: 使用者ID
CREATE TABLE vouchers (
id INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) UNIQUE,
value DECIMAL(10,2),
status ENUM('unused', 'used') DEFAULT 'unused',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
used_at TIMESTAMP NULL,
user_id INT NULL
);
礼券生成
生成随机礼券码并存入数据库:
function generateVoucher($value) {
$code = strtoupper(bin2hex(random_bytes(8)));
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $db->prepare("INSERT INTO vouchers (code, value) VALUES (?, ?)");
$stmt->execute([$code, $value]);
return $code;
}
礼券验证
验证礼券有效性并标记为已使用:
function redeemVoucher($code, $userId) {
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 检查礼券是否存在且未使用
$stmt = $db->prepare("SELECT * FROM vouchers WHERE code = ? AND status = 'unused'");
$stmt->execute([$code]);
$voucher = $stmt->fetch();
if (!$voucher) {
return ['success' => false, 'message' => '无效的礼券码'];
}
// 更新礼券状态
$stmt = $db->prepare("UPDATE vouchers SET status = 'used', used_at = NOW(), user_id = ? WHERE code = ?");
$stmt->execute([$userId, $code]);
return ['success' => true, 'value' => $voucher['value']];
}
前端提货表单
创建HTML表单供用户输入礼券码:
<form action="redeem.php" method="post">
<input type="text" name="voucher_code" placeholder="输入礼券码" required>
<button type="submit">提货</button>
</form>
提货处理
在redeem.php中处理提货请求:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$code = trim($_POST['voucher_code']);
$userId = $_SESSION['user_id']; // 假设用户已登录
$result = redeemVoucher($code, $userId);
if ($result['success']) {
echo "成功提货!礼券价值:{$result['value']}元";
} else {
echo $result['message'];
}
}
安全性考虑
- 使用预处理语句防止SQL注入
- 对礼券码进行大小写统一处理
- 添加CSRF保护
- 限制单用户提货次数
扩展功能
- 添加礼券过期时间检查
- 实现批量礼券生成
- 添加提货记录日志
- 提供礼券使用历史查询
通过以上步骤可以实现基本的礼券提货功能,根据实际需求可以进一步扩展和完善。







