A-A+
ecshop商品库存变成65535
今天在看 ecshop 商品库存的时候,发现商品总库存变成了 65535,除了商品总库存有变化之外,货品库存也变成了 65535,一个小小的商城哪有哪么多的商品呢,赶紧恢复一下之前备份的 ecshop 数据库,问题才解决,为了避免再次出现类似的问题,寻求了谷歌,原来不少人都遇到了这样的问题,下面夏日博客就来教大家如何解决这个问题。
首先我们看一下商品总库存对应的是 goods 表里的 goods_number 字段,货品库存对应的是 products 表里面的 product_number 字段,这两个字段的类型都是无符号的 smallint(5),取值范围为 0-65535,最大值也就是总库存变成的 65535 了。
对于如何防范这种问题呢,需要我们对 ecshop 文件进行二次开发,首先打开 includes/lib_order.php 文件,找到如下的代码:
- $number = ($number > 0) ? '+ ' . $number : $number;
- /* 处理货品库存 */
- $products_query = true;
- if (!emptyempty($product_id))
- {
- $sql = "UPDATE " . $GLOBALS['ecs']->table('products') ."
- SET product_number = product_number $number
- WHERE goods_id = '$good_id'
- AND product_id = '$product_id'
- LIMIT 1";
- $products_query = $GLOBALS['db']->query($sql);
- }
- /* 处理商品库存 */
- $sql = "UPDATE " . $GLOBALS['ecs']->table('goods') ."
- SET goods_number = goods_number $number
- WHERE goods_id = '$good_id'
- LIMIT 1";
- $query = $GLOBALS['db']->query($sql);
将其修改为:
- if($number>=0)
- {
- /* 处理货品库存 */
- $products_query = true;
- if (!emptyempty($product_id))
- {
- $sql = "UPDATE " . $GLOBALS['ecs']->table('products') .
- " SET product_number = product_number + $number ".
- " WHERE goods_id = '$good_id' AND product_id = '$product_id' LIMIT 1";
- $products_query = $GLOBALS['db']->query($sql);
- }
- /* 处理商品库存 */
- $sql = "UPDATE " . $GLOBALS['ecs']->table('goods') .
- " SET goods_number = goods_number + $number ".
- " WHERE goods_id = '$good_id' LIMIT 1";
- $query = $GLOBALS['db']->query($sql);
- }
- else
- {
- /* 处理货品库存 */
- $products_query = true;
- $abs_number = abs($number);
- if (!emptyempty($product_id))
- {
- $sql = "UPDATE " . $GLOBALS['ecs']->table('products') . " SET product_number =".
- " if( product_number >= $abs_number,product_number - $abs_number,0) ".
- " WHERE goods_id = '$good_id' AND product_id = '$product_id' LIMIT 1";
- $products_query = $GLOBALS['db']->query($sql);
- }
- /* 处理商品库存 */
- $sql = "UPDATE " . $GLOBALS['ecs']->table('goods') . " SET goods_number = ".
- " if( goods_number >= $abs_number , goods_number - $abs_number ,0) ".
- " WHERE goods_id = '$good_id' LIMIT 1";
- $query = $GLOBALS['db']->query($sql);
- }
接下来还要修改后台文件 /admin/order.php 文件,找到如下代码:
- if (!emptyempty($value['product_id']))
- {
- $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('products') . "
- SET product_number = product_number - " . $value['sums'] . "
- WHERE product_id = " . $value['product_id'];
- $GLOBALS['db']->query($minus_stock_sql, 'SILENT');
- }
- $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('goods') . "
- SET goods_number = goods_number - " . $value['sums'] . "
- WHERE goods_id = " . $value['goods_id'];
- $GLOBALS['db']->query($minus_stock_sql, 'SILENT');
将之修改为:
- if (!emptyempty($value['product_id']))
- {
- $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('products') . "
- SET product_number = if( product_number > $value[sums], product_number -$value[sums],0 )
- WHERE product_id = " . $value['product_id'];
- $GLOBALS['db']->query($minus_stock_sql, 'SILENT');
- }
- $minus_stock_sql = "UPDATE " . $GLOBALS['ecs']->table('goods') . "
- SET goods_number = if ( goods_number > $value[sums], goods_number -$value[sums],0 )
- WHERE goods_id = " . $value['goods_id'];
- $GLOBALS['db']->query($minus_stock_sql, 'SILENT');
好了,这样的修改之后,基本上就不会再出现商品库存变成 65535 的情况了。