A-A+

ecshop商品库存变成65535

2015年09月08日 PHP开源系统 暂无评论 阅读 13 views 次

今天在看 ecshop 商品库存的时候,发现商品总库存变成了 65535,除了商品总库存有变化之外,货品库存也变成了 65535,一个小小的商城哪有哪么多的商品呢,赶紧恢复一下之前备份的 ecshop 数据库,问题才解决,为了避免再次出现类似的问题,寻求了谷歌,原来不少人都遇到了这样的问题,下面夏日博客就来教大家如何解决这个问题。

首先我们看一下商品总库存对应的是 goods 表里的 goods_number 字段,货品库存对应的是 products 表里面的 product_number 字段,这两个字段的类型都是无符号的 smallint(5),取值范围为 0-65535,最大值也就是总库存变成的 65535 了。

对于如何防范这种问题呢,需要我们对 ecshop 文件进行二次开发,首先打开 includes/lib_order.php 文件,找到如下的代码:

  1. $number = ($number > 0) ? '+ ' . $number : $number;   
  2.     /* 处理货品库存 */  
  3.     $products_query = true;  
  4.     if (!emptyempty($product_id))  
  5.     {  
  6.         $sql = "UPDATE " . $GLOBALS['ecs']->table('products') ." 
  7.                 SET product_number = product_number $number 
  8.                 WHERE goods_id = '$good_id' 
  9.                 AND product_id = '$product_id' 
  10.                 LIMIT 1";  
  11.         $products_query = $GLOBALS['db']->query($sql);  
  12.     }   
  13.     /* 处理商品库存 */  
  14.     $sql = "UPDATE " . $GLOBALS['ecs']->table('goods') ." 
  15.             SET goods_number = goods_number $number 
  16.             WHERE goods_id = '$good_id' 
  17.             LIMIT 1";  
  18.     $query = $GLOBALS['db']->query($sql);  

将其修改为:

  1. if($number>=0)   
  2. {   
  3.   /* 处理货品库存 */   
  4.   $products_query = true;   
  5.   if (!emptyempty($product_id))   
  6.   {   
  7.    $sql = "UPDATE " . $GLOBALS['ecs']->table('products') .  
  8.      " SET product_number = product_number + $number  ".  
  9.      " WHERE goods_id = '$good_id'  AND product_id = '$product_id' LIMIT 1";   
  10.    $products_query = $GLOBALS['db']->query($sql);   
  11.   }   
  12.   /* 处理商品库存 */   
  13.   $sql = "UPDATE " . $GLOBALS['ecs']->table('goods') .  
  14.     " SET goods_number = goods_number + $number ".     
  15.     " WHERE goods_id = '$good_id' LIMIT 1";   
  16.   $query = $GLOBALS['db']->query($sql);   
  17. }   
  18. else   
  19. {   
  20.    /* 处理货品库存 */   
  21.   $products_query = true;   
  22.   $abs_number = abs($number);   
  23.   if (!emptyempty($product_id))   
  24.   {   
  25.    $sql = "UPDATE " . $GLOBALS['ecs']->table('products') . " SET product_number =".  
  26.      " if( product_number >= $abs_number,product_number - $abs_number,0)  ".  
  27.      " WHERE goods_id = '$good_id' AND product_id = '$product_id' LIMIT 1";   
  28.    $products_query = $GLOBALS['db']->query($sql);   
  29.   }   
  30.   /* 处理商品库存 */   
  31.   $sql = "UPDATE " . $GLOBALS['ecs']->table('goods') . " SET goods_number = ".  
  32.       " if( goods_number >= $abs_number , goods_number - $abs_number ,0) ".     
  33.     " WHERE goods_id = '$good_id' LIMIT 1";   
  34.   $query = $GLOBALS['db']->query($sql);     
  35. }  

接下来还要修改后台文件 /admin/order.php 文件,找到如下代码:

  1. if (!emptyempty($value['product_id']))  
  2.  {  
  3.         $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('products') . " 
  4.                        SET product_number = product_number - " . $value['sums'] . " 
  5.                         WHERE product_id = " . $value['product_id'];  
  6.        $GLOBALS['db']->query($minus_stock_sql, 'SILENT');  
  7. }  
  8.    
  9.     $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('goods') .  
  10.                 SET goods_number = goods_number - " . $value['sums'] .  
  11.                 WHERE goods_id = " . $value['goods_id'];  
  12.    
  13.     $GLOBALS['db']->query($minus_stock_sql, 'SILENT');  

将之修改为:

  1. if (!emptyempty($value['product_id']))  
  2. {  
  3.        $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('products') . " 
  4.        SET product_number = if( product_number > $value[sums], product_number -$value[sums],0 )   
  5.        WHERE product_id = " . $value['product_id'];  
  6.      $GLOBALS['db']->query($minus_stock_sql, 'SILENT');  
  7.  }   
  8.     $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('goods') . " 
  9.      SET goods_number = if (  goods_number > $value[sums], goods_number -$value[sums],0 )  
  10.      WHERE goods_id = " . $value['goods_id'];  
  11.    
  12.  $GLOBALS['db']->query($minus_stock_sql, 'SILENT');  

好了,这样的修改之后,基本上就不会再出现商品库存变成 65535 的情况了。

标签:

给我留言