<?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语句可提升性能。例如提前准备UPDATEINSERT语句。
$updateProfitStmt = $pdo->prepare("UPDATE agent_profit...");
$insertProfitStmt = $pdo->prepare("INSERT INTO agent_profit...");

扩展性建议

多级分销支持

  • 当前仅处理一级代理,可扩展为二级或三级代理逻辑。
  • 动态读取分润比例,避免硬编码。

日志记录

  • 添加详细日志(如失败记录、分润金额),便于后续对账。
error_log("分润失败: UID={$uid}, 金额={$distribut1}");

更多推荐