PHP 邀请奖励封装方法
·
<?php
function setAgentProfit($uid, $total) {
// 获取数据库连接
$dsn = 'mysql:host=your_host;dbname=your_dbname;charset=utf8'; // 数据库连接字符串
$username = 'your_username'; // 数据库用户名
$password = 'your_password'; // 数据库密码
try {
$pdo = new PDO($dsn, $username, $password); // 创建PDO实例
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置错误模式为异常处理
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage()); // 数据库连接失败时输出错误信息并终止脚本
}
// 分销
$distribut1 = 0; // 初始化一级分销利润为0
$configpri = getConfigPri(); // 获取配置信息
if ($configpri['agent_switch'] == 1) { // 检查分销功能是否开启
// 准备并执行查询,获取指定uid的代理信息
$stmt = $pdo->prepare("SELECT * FROM agent WHERE uid = :uid");
$stmt->execute(['uid' => $uid]);
$agent = $stmt->fetch(PDO::FETCH_ASSOC); // 获取代理信息作为关联数组
$isinsert = 0; // 初始化插入标志为0
// 一级分销
if ($agent['one_uid'] && $configpri['distribut1']) { // 检查一级代理uid是否存在且分销比例不为0
// 计算一级分销利润
$distribut1 = $total * $configpri['distribut1'] * 0.01;
if ($distribut1 > 0) { // 如果分销利润大于0
// 准备并执行更新语句,增加一级代理的利润
$stmt = $pdo->prepare("UPDATE agent_profit SET one_profit = one_profit + :distribut1 WHERE uid = :one_uid");
$stmt->execute(['distribut1' => $distribut1, 'one_uid' => $agent['one_uid']]);
// 如果没有更新到任何行,说明该代理没有对应的利润记录,需要插入新记录
if ($stmt->rowCount() == 0) {
// 准备并执行插入语句,为一级代理添加新的利润记录
$stmt = $pdo->prepare("INSERT INTO agent_profit (uid, one_profit) VALUES (:one_uid, :distribut1)");
$stmt->execute(['one_uid' => $agent['one_uid'], 'distribut1' => $distribut1]);
}
// 准备并执行更新语句,增加一级代理的投票数
$stmt = $pdo->prepare("UPDATE user SET votes = votes + :distribut1 WHERE id = :one_uid");
$stmt->execute(['distribut1' => $distribut1, 'one_uid' => $agent['one_uid']]);
$isinsert = 1; // 设置插入标志为1
// 准备要插入的投票记录数据
$insert_votes = [
'type' => '1',
'action' => '3',
'uid' => $agent['one_uid'],
'fromid' => $uid,
'total' => $distribut1,
'votes' => $distribut1,
'addtime' => time(), // 当前时间戳
];
// 准备并执行插入语句,为一级代理添加新的投票记录
$stmt = $pdo->prepare("INSERT INTO user_voterecord (type, action, uid, fromid, total, votes, addtime) VALUES (:type, :action, :uid, :fromid, :total, :votes, :addtime)");
$stmt->execute($insert_votes);
}
}
// 如果插入了新的记录
if ($isinsert == 1) {
// 准备要插入的分销利润记录数据
$data = [
'uid' => $uid,
'total' => $total,
'one_uid' => $agent['one_uid'],
'one_profit' => $distribut1,
'addtime' => time(), // 当前时间戳
];
// 准备并执行插入语句,为分销活动添加新的记录
$stmt = $pdo->prepare("INSERT INTO agent_profit_recode (uid, total, one_uid, one_profit, addtime) VALUES (:uid, :total, :one_uid, :one_profit, :addtime)");
$stmt->execute($data);
}
}
return 1; // 返回1表示操作成功
}
// 假设的获取配置函数
function getConfigPri() {
// 返回配置信息数组
return [
'agent_switch' => 1, // 分销功能开关,1表示开启
'distribut1' => 10, // 一级分销比例,假设为10%
];
}
?>
// 假设的获取配置函数
function getConfigPri() {
return [
'agent_switch' => 1,
'distribut1' => 10, // 假设一级分销比例为10%
];
}
?>
代码功能解析
该PHP函数setAgentProfit($uid, $total)用于处理分销代理的利润分配逻辑,主要功能是根据用户ID和交易总额,计算一级代理的分润并更新数据库记录。
代码结构分析
数据库连接部分
- 使用PDO连接MySQL数据库,通过
try-catch捕获连接异常。 - 配置参数包括主机名、数据库名、用户名和密码(需替换占位符)。
分销逻辑部分
- 检查系统是否开启分销功能(
agent_switch == 1)。 - 查询用户的分销代理信息,获取上级代理UID。
- 若存在一级代理且配置了分润比例,计算分润金额(
total * distribut1%)。 - 更新或插入一级代理的利润记录到
agent_profit表。 - 更新代理用户的余额(
user.votes字段)。 - 记录分润流水到
user_voterecord表。 - 最后插入分润记录到
agent_profit_recode表。
关键改进建议
数据库安全
- 建议将数据库配置信息移至外部文件(如
config.php),避免硬编码。 - 使用环境变量或加密存储敏感信息。
// 示例:分离配置
$config = include 'config/database.php';
$pdo = new PDO($config['dsn'], $config['username'], $config['password']);
逻辑优化
- 分润计算和更新操作建议封装为事务,确保数据一致性。
- 添加输入参数验证(如
$total是否为有效数值)。
$pdo->beginTransaction();
try {
// 分润计算及更新操作
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
代码复用
- 将重复的数据库操作(如更新利润、记录流水)提取为独立函数。
- 使用依赖注入代替直接创建PDO实例,便于单元测试。
潜在问题排查
数据一致性风险
- 若并发调用此函数,可能导致利润统计不准确。建议使用锁机制或队列处理。
性能优化
- 高频调用时,预编译SQL语句可提升性能。例如提前准备
UPDATE和INSERT语句。
$updateProfitStmt = $pdo->prepare("UPDATE agent_profit...");
$insertProfitStmt = $pdo->prepare("INSERT INTO agent_profit...");
扩展性建议
多级分销支持
- 当前仅处理一级代理,可扩展为二级或三级代理逻辑。
- 动态读取分润比例,避免硬编码。
日志记录
- 添加详细日志(如失败记录、分润金额),便于后续对账。
error_log("分润失败: UID={$uid}, 金额={$distribut1}");
更多推荐
所有评论(0)