PHP分销推广如何确立上下级关系,【解决方案+问题分析】微信分销会员上下级关系出现混乱,剖析全过程...
微信分销会员上下级关系出现混乱,从反馈到分析问题如何发生 ,再到如果解决。在此把实际项目遇到的问题分享出来,以供以后和网友参考。
某日,接到一通领导打来的一通电话。电话主要内容是他曾接到一个用户的反馈电话,说道我们有一个项目中,微信会员上下级关系存在混乱,用户a关注的用户b,用户b却关注的用户的a。上下级关系很乱,还有很多用户存在一些,用户a关注了用户b,用户b的推荐好友列表中却没有用户a的存在……
当我拿到这个问题之后,首先的态度很是质疑,代码应该都是没有问题的,可能会存在一些数据没有对上。此处我需要在整个数据库中查找出所有的上下级混乱关系的会员。
什么是上下级混乱关系?
用户b的上级是用户a,用户a的上级是用户b。(b>a>b)
用户c的上级是用户b,用户b的上级是用户a,用户a的上级是用户c。(c>b>a>c)
所谓的混乱便是出现了这种无线循环的关系,那么,如果查找出来这种上下级关系呢?
怎么解决?
根据以上的举例,能够很明显的能看出来一个规律便是这种会员关系中,一圈之中至少存在两个会员的?自己上级的上级……的上级有可能是自己。只要找出自己所有的上级来查询是否存在两个相同会员就好了。
首先写一个脚本来执行,如果web执行超时,可采用命令行方式执行。
以下以TP框架语法进行举例:
/**
* 排错函数
*/
public function member_level(){
$Model = M('weishop_member');
//查询出所有有上级的用户
$exist_sql = "SELECT wm_id,wm_parent_id FROM weishop_member WHERE wm_parent_id !=0";
$exist_parent_users = $Model->query($exist_sql);
//debug_show($exist_parent_users);
$num = 0;
$error_users = array();
foreach($exist_parent_users as $val){
//此处屏蔽的代码可以在调试时放开,测试数据是否正常,避免逻辑错误导致死循环超时
//if($num==2){
//exit;
//}
$user_status = $this->level_debug($val['wm_id'],$val['wm_parent_id'],true);
if($user_status===3){
$error_users[] = $val['wm_id'];
}
$num++;
}
echo '
error users:'.implode(',', $error_users).'
';
echo '
Check OK!';
//拿出一个数据来进行 测试排错
//$this->level_debug($exist_parent_users[0]['wm_id'],$exist_parent_users[0]['wm_parent_id'],true);
echo 'Exist users number:'.count($exist_parent_users);
}
/**
* 递归排错
* @desc 查询当前用户的上级祖(祖父)中是否存在循环(儿子)
* @param $wm_id 会员id
* @param $parent_id 上级id
* @param $init 是否初始化,即首次执行
* @return 1:用户正常。0:用户还有上级。3:用户关系出错
*/
private function level_debug($wm_id,$parent_id,$init=false){
static $user_id = 0;//被检查的用户
static $_son = array();//儿子组
static $num = 0;//循环执行次数
//empty 如果是初始化执行则清空
if($init){
$_son = array();
$num = 0;
$user_id = $wm_id;
}
$num++;
if(!isset($_son[$wm_id])){
//如果儿子组中不存在当前用户,则加入当前用户,继续向下查找祖父
$_son[$wm_id] = array(
'wm_id'=>$wm_id,
'wm_parent_id' => $parent_id
);
}
//调试时测试执行次数,防止逻辑错误,出现死循环超时
if($num==5){
//debug_show($wm_id);
//debug_show($_son);
}
$Model = M('weishop_member');
//查询当前上级
$query_parent_sql = "SELECT wm_id,wm_parent_id FROM weishop_member WHERE wm_id = '$parent_id'";
$parent_user = $Model->query($query_parent_sql);
//如果上级存在 并且上级用户还有上级则继续递归
//条件:1.当前用户上级存在。2.上级用户还存在上级
if(is_array($parent_user) && isset($parent_user[0]) && $parent_user[0]['wm_parent_id']!=0){
$buf = $parent_user[0];
//如果当前用户上级的上级存在于儿子组中则进入判断
if(isset($_son[$buf['wm_parent_id']])){
echo 'error! user id:'.$user_id.' '.'parent_id :'.$buf['wm_id'].' '.'parent includes '
.implode(',', array_keys($_son)).' execute:'.$num .'
';
return 3;
//exit;
}
//符合条件 继续进入循环探寻祖父
$this->level_debug($buf['wm_id'],$buf['wm_parent_id']);
return 0;
}
//数据量过多,则关闭正常用户结果显示
//echo 'user id:'.$user_id.' '.'parent_id :'.$parent_id.' '.'parent includes '
//.implode(',', array_keys($_son)).' execute:'.$num .'
';
return 1;
}
以上代码经过多次修改后的,并不是一气呵成。需要用到的朋友可以仔细分析下逻辑。
经过多次的修改,以上的代码没有超时执行,跟用户数量还是有关系,毕竟只有几千个。返回的内容如下:
说明一下,红色error都是关系混乱的用户,在最后我们可以看到出错的用户抱(bāo)括2和116。所存在上级的用户总共有3158个。
那么问题看来都是由2和116的关系混乱导致的,只需要将他们更正后即可。之后便联系了用户id分别为2和116的用户,将他们的注册时间和推荐时间做一了解,将2的上级清空,恢复为0.
那么再执行刚才的排错来看看结果。
这次检查之后,发现并没有关系混乱的用户。一切恢复平静。虽然说目前的问题解决了,但并不意味着,以后都会正常,问题的根源还没有找出来。
怎么修复?
带着问题继续在代码中寻找,来到会员绑定的逻辑处。
/**
* 绑定微信上下级(未修复)
* @param $openid 当前用户openID
* @param $parent_id 上级用户id
* @return bool
*/
public function bingding($openid,$parent_id){
//检测当前用户是否有上级并且上级不能为自己,没有则继续
$res = $this->where("wm_openid ='$openid' && wm_id != '$parent_id' && wm_parent_id ='0'")->save(array("wm_parent_id" => $parent_id));
if($res){
return true;
}
}
粗略一看几乎看不出来啥问题,绑定时首先判断的是当前用户的上级是否存在,如果有自然不能附加上级了。如果没有的情况下,并且上级不能为自己,否则自己跟自己成为上级就乱了套。当时写的代码本以为是正常。结果出了一个隐性bug。
怎么发生的呢?
上面的逻辑会忽略掉,下级下级的用户偶然一天变成自己的上级(可能是因为自己失误的去扫码,扫了自己辛辛苦苦下级用户的码,反而让下级成为了自己的上级),导致关系混乱,在用户方面可能会导致佣金等利益计算错误,在平台层面会影响一笔损失,在此可以给各位一个提醒,凡是跟钱有关的一定要慎重!
至于修复呢,而此处只需要增加一层判断即可解决。
修改后代码奉上:
/**
* 绑定微信上下级(已修复)
* @param $openid 当前用户openID
* @param $parent_id 上级用户id
* @return bool
*/
public function bingding($openid,$parent_id){
//检测是否有下级
$sql = "SELECT count(a.wm_id) as count FROM `weishop_member` as a join `weishop_member` as b on a.wm_parent_id = b.wm_id WHERE b.wm_openid='{$openid}';";
$count_res = $this->query($sql);
if(is_array($count_res) || count($count_res)==1){
if(isset($count_res[0]['count']) && $count_res[0]['count']>0){
return false;
//如果有下级则不能成为别人的下级
}
}
//检测当前用户是否有上级并且上级不能为自己,没有则继续
$res = $this->where("wm_openid ='$openid' && wm_id != '$parent_id' && wm_parent_id ='0'")->save(array("wm_parent_id" => $parent_id));
if($res){
return true;
}
return false;
}
如果自己已经有了下级用户就不能成为别人的下级,这样一来,就不会出现这种死循环。当然解决的方案不只是这一个,符合业务逻辑就好。
修改好代码检查无误后立即将代码更新至服务器,以防止出现更多差错。
基本上此次的bug检查及解决方案就到此结束了,过程中一些细节性东西不太好描述,最好去实际实践一下,或者是实际用到时慢慢体会。
PHP分销推广如何确立上下级关系,【解决方案+问题分析】微信分销会员上下级关系出现混乱,剖析全过程...相关推荐
- 微信分销试试汉全的解决方案
经营传统行业的企业商家都心里有数,现在的经营有很多的阻碍,行行皆不易.为了让企业更好的发展,汉全的解决方案即微信分销,就成为如今传统行业唯一的机会.微信分销势必会帮助企业有更好的提升. 普通的解决方式 ...
- thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...
山东谷道微信小程序商城源码带后台 公众号平台三级分销系统 那么微信二级分销系统与微信三级分销系统到底有什么区别和联系呢?为什么改了个数字地位就天差地别? 1.微信分销模式等级的区别 用简洁的话来说,微 ...
- 夏日葵电商:微信分销系统开发运营误区及技巧
在互联网时代的渲染下,培养了一批喜欢在家中购物的消费者,而如今火热的分销系统就是结合了懒人思想和人人获利思想,以积少成多的方式来缓解囤货压力,同时通过分销传播打响品牌知名度.很多人也按部就班加入到分销 ...
- 三级分销如何做分销推广 如何设置分销比例
微信三级分销,谈到推广和运营,应该是大家很有兴趣的话题,现在很多人的疑问就是三级分销如何做推广分销.这样的概念往往没有明确定义,很多时候是我们的经验之谈,其实运用万能公式,不变初衷,就能更深的理解并且 ...
- CRMEBV4小程序H5页面端宝贝列表分享海报以及会员中心分销推广不显示的常见问题解决
上次给大家带来了CRMEB标准版和基础版分享海报不显示的问题,这里再此做一个补充,还未看之前的帖子,请先看,如果不能解决再对照本方法处理, 上次的方法:https://blog.csdn.net/id ...
- 几种微信分销系统解决方案的原理
运营一个微信二级分销系统,其实跟运营一个微信三级分销系统是大同小异的.在用户方面,可以说是没有差别的.微信三级分销系统包含微信二级分销系统,差别就在利益关系方面和发展的级数. 微信三级分销系统是以三级 ...
- setuptools清华源_setuptools与pip的依赖关系解决方案之间的差异
我最近开始用SetupTools打包我的第一个项目,并且大部分都取得了成功.setuptools与pip的依赖关系解决方案之间的差异 不幸的是,我遇到了一个令人困惑的情况 - 我的项目依赖于PyPI上 ...
- 微信分销商城如何推广比较吸引粉丝
微信分销商城可以帮助商家增粉无数,提高订单数量,但是前提是你得懂得微信分销商城的运营推广技巧.今天小编将给大家介绍如何推广微信分销商城,希望能够帮助到各位商家. 1.完善公众号的内容 在公众号建设的初 ...
- 赚钱大师小程序【最新版5.9.9】商城/佣金即时提现/分销推广/话费充值/美团饿了么外卖
介绍: 本模块只支持小程序版,暂不支持公众号版.赚钱大师里的丰富数字商品.电影票.话费.电费.各种生活充值等均由官方提供统一的产品代理接口,默认可免费提供一个代理账号开户,而电商CPS和美团周边.外卖 ...
最新文章
- PagedList.Mvc只有一行时不显示分页
- oracle排序使用,很多中函数,不同的效果
- java发送内嵌图片邮件
- 前端学习(120):css精灵和好处
- android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...
- 机器学习基础(十九)—— Trick
- spss数据调整后重新计算
- 关于HyperLink的NavigateUrl属性的链接地址带参数出错的问题【整理】
- 2022年最新版java 8(jdk1.8u321)下载及安装
- idea 导入 android项目以及自带AVD模拟器的使用
- metricbeat监控mysql_metricbeat
- js点击第三方广告添加点击事件
- linux运维基础[系统磁盘管理]——————存储设备的识别、df、du、fsck
- ubuntu18.10安装网易云音乐,并解决网易云音乐图标无法启动的问题
- 网络隔离环境下的跨网数据传输,如何保障安全性?
- Java爬虫——人人网模拟登录
- package.json文件解读
- vsftpd的安装与使用
- css边框(border)属性
- Linux拷贝命令cp的用法
热门文章
- html给看板娘添加语音,如何给你的Jekyll博客添加可爱的二次元看板娘(Live2D)
- errors and 0 warnings potentially fixable with the `--fix` option.
- iOS AI智能对话项目(一边设备开外放声音,一边录音降噪)
- 优秀网页设计:30个优秀的汽车网站设计欣赏
- Unity学习笔记:UGUI相关知识
- 在C语言中十六进制与十进制的互相转换
- 计算机密码应用基础试题及答案,计算机应用基础试题及参考答案.doc
- 一款很实用的欠压过压保护电路
- HOOPS/QT集成指南
- 算法刷题打卡第76天:判断矩阵是否是一个 X 矩阵