首先来看看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’]);