微擎多用户多公众号出现公众号重复时商品订单查看BUG

通过清心醉

微擎多用户多公众号出现公众号重复时商品订单查看BUG

首先来看看w7提取的订单数据的SQL代码:

$total = pdo_fetchcolumn(‘SELECT COUNT(*) FROM ‘ . tablename(‘ewei_shop_order’) . ” o ” .
” left join ” . tablename(‘ewei_shop_order_refund’) . ” r on r.orderid=o.id” .
” left join ” . tablename(‘ewei_shop_member’) . ” m on m.openid=o.openid ” .
” left join ” . tablename(‘ewei_shop_member_address’) . ” a on o.addressid = a.id ” .
” WHERE {$condition}”, $paras);

然后再看看提取产品的$list

$sql = “select o.* , a.realname,a.mobile,a.province,a.city,a.area,a.address, d.dispatchname,r.status as refundstatus from ” . tablename(‘ewei_shop_order’) . ” o” . ” left join ” . tablename(‘ewei_shop_order_refund’) . ” r on r.orderid=o.id and ifnull(r.status,-1)<>-1″ . ” left join ” . tablename(‘ewei_shop_member’) . ” m on m.openid=o.openid” . ” left join ” . tablename(‘ewei_shop_member_address’) . ” a on o.addressid = a.id ” . ” left join ” . tablename(‘ewei_shop_dispatch’) . ” d on d.id = o.dispatchid ” . ” where {$condition} ORDER BY o.createtime DESC,o.status DESC  “;
if (empty($_GPC[‘export’])) {
$sql .= “LIMIT ” . ($pindex – 1) * $psize . ‘,’ . $psize;
}

$list = pdo_fetchall($sql, $paras);

好吧有点跑题,

SQL语句中有两个变量,他们的原型是:

$condition = ” o.uniacid = :uniacid and o.deleted=0″;
$paras = array(‘:uniacid’ => $_W[‘uniacid’]);

很明显的对象o为ewei_shop_order,$condition变量里进行SQL组和

而$paras = array(‘:uniacid’ => $_W[‘uniacid’]);是用来区分公众号的,在SQL执行时起到筛选的作用

在这要特别注意,关联的表内有一个表’ewei_shop_member’。

这就是出现BUG的详细地方了

W7的原始思路就是有错误的.

ewei_shop_member表内

uniacid = > 公众号唯一ID

openid = > 用户在公众号内的唯一ID

W7在ewei_shop_order订单表内有根据uniacid来划分不同的公众号的订单,可是在表内关联了对应的用户ID

在逻辑上上来,openid = XXXX可以在任意uniacid(区分公众号的唯一ID值 )内下单 ,那么表关联查询是完全没问题的

先说问题吧:
每个用户在不同的公众号内,唯一的OPENID是不同的;
如果一个商户开了两个小站,分别为A(uniacid = 1)和B (uniacid = 2)
用户在A里访问下单了,那么ewei_shop_member表内就会有这么一行数据
uniacid => 1
openid => thisisuseropenid用户在当前公众号的唯一ID

可是如果用户突然把A的公众号放到B
那么就会出现
uniacid =>1
openid => thisisuseropenid
uniacid =>2
openid => thisisuseropenid
问题出来了,openid相同了,所以我们需要对ewei_shop_member的语句进行多一重uniacid的判断(因为W7在这里是没有做这个判断的,他没有考虑这个BUG的出现可能性)

//$condition = ” o.uniacid = :uniacid and o.deleted=0″;

$condition = ” o.uniacid = :uniacid and o.deleted=0 and m.uniacid = :uniacid”;

$paras = array(‘:uniacid’ => $_W[‘uniacid’]);

 

 

关于作者

清心醉 administrator

发表评论

如果喜欢作者的文章,您可以打赏给作者:

TRC20(虚拟货币):


ERC20(虚拟货币):


Bitcoin(BTC):