| 在Discuz!系统中批量处理用户积分有两种专业实现方案: 
 一、数据库直接操作方案(高效率)
 1. 首先通过后台->全局->积分设置确认"贡献"对应的extcredits字段(假设为extcredits2)
 2. 执行SQL语句:
 
 复制代码UPDATE pre_common_member_count 
SET extcredits2 = extcredits2 * 2 
WHERE extcredits2 > 0;
* 优势:毫秒级完成百万用户数据处理
 * 注意:需在phpMyAdmin中操作,建议先备份数据
 
 二、程序调用方案(安全但耗时)
 创建PHP脚本(放置在论坛根目录):
 
 复制代码<?php
require './source/class/class_core.php';
$discuz = C::app();
$discuz->init();
$step = 500; // 每次处理量
$maxuid = C::t('common_member')->max('uid');
$creditsField = 2; // 根据实际字段调整
for($i=0; $i<=$maxuid; $i+=$step){
    $uids = C::t('common_member')->fetch_all_uid($i, $step);
    foreach($uids as $uid){
        updatemembercount($uid, array("extcredits$creditsField" => DB::fetch_first("SELECT extcredits$creditsField*2 as newval FROM ".DB::table('common_member_count')." WHERE uid=$uid")['newval']), true);
    }
    echo "已处理到UID: {$i}<br>";
    flush();
}
* 优势:通过标准API操作确保数据完整性
 * 注意:需通过CLI执行或设置超时时间
 
 特殊场景优化方案:
 对千万级用户系统推荐采用分阶段批处理:
 1. 创建临时表存储计算结果
 2. 使用存储过程分批次更新
 3. 结合Redis做进度跟踪
 
 数据验证SQL:
 
 复制代码SELECT uid, extcredits2 as old, (extcredits2*2) as new 
FROM pre_common_member_count 
WHERE uid IN (SELECT uid FROM pre_common_member ORDER BY uid LIMIT 10)
 注意事项:
 1. 操作前务必完整备份数据库
 2. 建议在低峰期执行
 3. 更新后需重建用户积分缓存
 4. 若存在从库需考虑主从同步延迟
 
 如需可视化操作工具,可关注DZ插件网(www.dz-x.net)的批量任务处理器类插件。具体实现细节可参考Discuz!内核的countupdate.class.php处理逻辑。
 -- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
 |