ECShop v2.7.0 / ECShop v2.7.1 购物车配件添加/删除逻辑错误

2016-07-07 15:27 来源:www.chinab4c.com 作者:ecshop专家



ECShop v2.7.0 / ECShop v2.7.1 购物车配件添加/删除逻辑错误:
描述:
购物车配件添加/删除错误
文件:includes/lib_order.php
函数: addto_cart

存在问题:
按代码逻辑是一件商品对应一个配件
但实际不是,我可以买一件基件商品对应N多件配件.

一、从购物车下方列表添加:
1. 从购物车下方添加,这里有一个问题就是我买了多件商品,但从这只能购买一件配件。
(见下方图1)
原因:检测代码不正确 原代码是条数判断,正确应该是件数判断
行:1034
  1. /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */

  2. if ($parent > 0)
  3. {
  4. $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') .
  5. " WHERE goods_id='$parent' AND session_id='" . SESS_ID . "'";
  6. if ($GLOBALS['db']->getOne($sql) == 0)
  7. {
  8. $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS);

  9. return false;
  10. }

  11. /* 检查该配件是否已经添加过了。 */
  12. $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') .
  13. " WHERE goods_id = '$goods_id' AND parent_id='$parent' AND session_id='" . SESS_ID . "'";

  14. if ($GLOBALS['db']->getOne($sql) > 0)
  15. {
  16. $GLOBALS['err']->add($GLOBALS['_LANG']['fitting_goods_exists'] , ERR_NOT_EXISTS);

  17. return false;
  18. }
  19. }
复制代码
应该改为
  1. /**
  2. * south 2009-12-25
  3. * 从COUNT 改为 SUM ,是件数判断,而不是条数
  4. */
  5. /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */
  6. if ($parent > 0)
  7. {
  8. $sql = "SELECT SUM(goods_number) FROM " . $GLOBALS['ecs']->table('cart') .
  9. " WHERE goods_id='$parent' AND session_id='" . SESS_ID . "'";
  10. $tmp_num = $GLOBALS['db']->getOne($sql);
  11. if ($tmp_num == 0)
  12. {
  13. $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS);

  14. return false;
  15. }

  16. /* 检查该配件是否已经添加过了。 */
  17. $sql = "SELECT SUM(goods_number) FROM " . $GLOBALS['ecs']->table('cart') .
  18. " WHERE goods_id = '$goods_id' AND parent_id='$parent' AND session_id='" . SESS_ID . "'";

  19. if ($GLOBALS['db']->getOne($sql) >= $tmp_num)
  20. {
  21. $GLOBALS['err']->add($GLOBALS['_LANG']['fitting_goods_exists'] , ERR_NOT_EXISTS);

  22. return false;
  23. }
  24. }
复制代码
2.按道理一商品对应一配件,同一配件是一条记录,可是从这里确出现多条记录,因为这样改了基件的数量,配件是不会删除减少的
(见下方图2)
原因:在添加配件时没有判断对应商品是否已存,而直接新增
行: 1178
  1. $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
复制代码
应该改为:
  1. /**
  2. * south 2009-12-25
  3. * 修改了配件判断。如果已存在对应商品就修改件数,而不是重复添加
  4. */
  5. /* 检查该配件是否已在该商品中出现 */
  6. $sql = "SELECT SUM(goods_number) FROM " .$GLOBALS['ecs']->table('cart').
  7. " WHERE session_id = '" .SESS_ID. "' AND goods_id = '$goods_id' ".
  8. "AND parent_id = '$parent_id' " ;
  9. $tmp_num = $GLOBALS['db']->getOne($sql);
  10. if($tmp_num>0){//存在更新
  11. $tmp_parent = $parent;//为了不改变下方num的数量计算
  12. $tmp_parent['goods_number'] += $tmp_num;
  13. $where = " goods_id='$goods_id' AND parent_id = '$parent_id'";
  14. $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $tmp_parent, 'UPDATE', $where);
  15. unset($tmp_parent);
  16. }else{//不存在添加
  17. $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
  18. }
复制代码
二、从其页如商品详细页添加配件商品,如果添加数量和购买的基件一样,是没问题,但如果分多次购物也是同个道理(如上第2件情况)
三、小问题:在购物车中的商品,如果后台修改了价格,再买只更改了goods_price,而market_price还是原来的.
行:1201
应该增加: " , market_price = '" . $goods['market_price'] . "'".

未命名.JPG (34.56 KB)

图1:从购物车下方添加,这里有一个问题就是我买了多件商品,但从这只能购买一件配件

未命名.JPG

未命名2.JPG (26.42 KB)

图2:应该是一条配件记录2件,而不是多条记录

未命名2.JPG

未命名1.JPG (26.91 KB)

图3:修改基件数量,多条的话不是减少

未命名1.JPG


回答:
帅哥,你太有才了

已经把你的问题提交上去。

$where = " goods_id='$goods_id' AND parent_id = '$parent_id'"; //--?


$where = " goods_id='$goods_id'
AND parent_id = '$parent_id'
AND session_id = '" . SESS_ID . "'
";

看看。。。学习。。。谢谢!!!

找了好久才发现第三点原来是写在flow.php.....
搜寻
  1. $sql = "SELECT g.goods_name, g.goods_number, g.goods_restriction
复制代码
替换为
  1. $sql = "SELECT g.goods_name, g.goods_number, g.goods_restriction, g.market_price
复制代码