报错了PHP Warning: implode() [function.implode]: Invalid argume

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

各位朋友你们好,我在升级了2.7.2之后经过本地调试后把线上的服务器也更新了,可是在添加商品订单时出现了如下的错误。

PHP Warning: implode() [function.implode]: Invalid arguments passed in D:\TEST WEB SITE\admin\order.php on line 1338

具体情况是这样的:点击 添加订单(正常) 选择匿名用户 点击下一步(正常) 然后当找出商品点击 加入订单 时出现了错误。

还有一点我比较疑惑,就是在本地做测试的时候并没有这样的错误出现,那问题出现在那里了呢?


  1. /* 添加商品 */
  2. elseif ('add_goods' == $step)
  3. {
  4. /* 取得参数 */
  5. $goods_id = intval($_POST['goodslist']);
  6. $goods_price = $_POST['add_price'] != 'user_input' ? floatval($_POST['add_price']) : floatval($_POST['input_price']);
  7. $goods_attr = '0';
  8. for ($i = 0; $i < $_POST['spec_count']; $i++)
  9. {
  10. if (is_array($_POST['spec_' . $i]))
  11. {
  12. $temp_array = $_POST['spec_' . $i];
  13. $temp_array_count = count($_POST['spec_' . $i]);
  14. for ($j = 0; $j < $temp_array_count; $j++)
  15. {
  16. $goods_attr .= ',' . $temp_array[$j];
  17. }
  18. }
  19. else
  20. {
  21. $goods_attr .= ',' . $_POST['spec_' . $i];
  22. }
  23. }
  24. $goods_number = $_POST['add_number'];
  25. $attr_list = $goods_attr;

  26. $goods_attr = explode(',',$goods_attr);
  27. $k = array_search(0,$goods_attr);
  28. unset($goods_attr[$k]);


  29. $sql = "SELECT attr_value ".
  30. 'FROM ' . $GLOBALS['ecs']->table('goods_attr') .
  31. "WHERE goods_attr_id in($attr_list)";
  32. $res = $db->query($sql);
  33. while ($row = $db->fetchRow($res))
  34. {
  35. $attr_value[] = $row['attr_value'];
  36. }

  37. $attr_value = implode(",",$attr_value);

  38. $sql = "SELECT * FROM " .$GLOBALS['ecs']->table('products'). " WHERE goods_id = '$goods_id' LIMIT 0, 1";
  39. $prod = $GLOBALS['db']->getRow($sql);


  40. if (is_spec($goods_attr) && !empty($prod))
  41. {
  42. $product_info = get_products_info($_REQUEST['goodslist'], $goods_attr);
  43. }

  44. //商品存在规格 是货品 检查该货品库存
  45. if (is_spec($goods_attr) && !empty($prod))
  46. {
  47. if (!empty($goods_attr))
  48. {
  49. /* 取规格的货品库存 */
  50. if ($goods_number > $product_info['product_number'])
  51. {
  52. $url = "order.php?act=" . $step_act . "&order_id=" . $order_id . "&step=goods";

  53. echo '<a href="'.$url.'">'.$_LANG['goods_num_err'] .'</a>';
  54. exit;

  55. return false;
  56. }
  57. }
  58. }

  59. if(is_spec($goods_attr) && !empty($prod))
  60. {
  61. /* 插入订单商品 */
  62. $sql = "INSERT INTO " . $ecs->table('order_goods') .
  63. "(order_id, goods_id, goods_name, goods_sn, product_id, goods_number, market_price, " .
  64. "goods_price, goods_attr, is_real, extension_code, parent_id, is_gift, goods_attr_id) " .
  65. "SELECT '$order_id', goods_id, goods_name, goods_sn, " .$product_info['product_id'].", ".
  66. "'$goods_number', market_price, '$goods_price', '" .$attr_value . "', " .
  67. "is_real, extension_code, 0, 0 , '".implode(',',$goods_attr)."' " .
  68. "FROM " . $ecs->table('goods') .
  69. " WHERE goods_id = '$goods_id' LIMIT 1";
  70. }
  71. else
  72. {
  73. $sql = "INSERT INTO " . $ecs->table('order_goods') .
  74. " (order_id, goods_id, goods_name, goods_sn, " .
  75. "goods_number, market_price, goods_price, goods_attr, " .
  76. "is_real, extension_code, parent_id, is_gift)" .
  77. "SELECT '$order_id', goods_id, goods_name, goods_sn, " .
  78. "'$goods_number', market_price, '$goods_price', '" . $attr_value. "', " .
  79. "is_real, extension_code, 0, 0 " .
  80. "FROM " . $ecs->table('goods') .
  81. " WHERE goods_id = '$goods_id' LIMIT 1";
  82. }
  83. $db->query($sql);

  84. /* 如果使用库存,且下订单时减库存,则修改库存 */
  85. if ($_CFG['use_storage'] == '1' && $_CFG['stock_dec_time'] == SDT_PLACE)
  86. {

  87. //(货品)
  88. if (!empty($product_info['product_id']))
  89. {
  90. $sql = "UPDATE " . $ecs->table('products') . "
  91. SET product_number = product_number - " . $goods_number . "
  92. WHERE product_id = " . $product_info['product_id'];

  93. $db->query($sql);
  94. }


  95. $sql = "UPDATE " . $ecs->table('goods') .
  96. " SET `goods_number` = goods_number - '" . $goods_number . "' " .
  97. " WHERE `goods_id` = '" . $goods_id . "' LIMIT 1";
  98. $db->query($sql);
  99. }

  100. /* 更新商品总金额和订单总金额 */
  101. update_order($order_id, array('goods_amount' => order_amount($order_id)));
  102. update_order_amount($order_id);

  103. /* 更新 pay_log */
  104. update_pay_log($order_id);

  105. /* todo 记录日志 */
  106. $sn = $old_order['order_sn'];
  107. $new_order = order_info($order_id);
  108. if ($old_order['total_fee'] != $new_order['total_fee'])
  109. {
  110. $sn .= ',' . sprintf($_LANG['order_amount_change'], $old_order['total_fee'], $new_order['total_fee']);
  111. }
  112. admin_log($sn, 'edit', 'order');

  113. /* 跳回订单商品 */
  114. ecs_header("Location: order.php?act=" . $step_act . "&order_id=" . $order_id . "&step=goods\n");
  115. exit;
  116. }
复制代码

回答:
给下后台看下吧这边测试都是正常的

implode(',',$goods_attr) 这个写的一点都不科学。应该做判断.if($goods_attr)

楼上正解,哈哈




我后台在本地测试的时候也是没有问题的,但上传后就出现了问题,本地和服务器上唯一不一样的地方应该是数据库里的数据。是不是由于没有找到这个变量引起的错误呢?如果你需要我可以把文件发到你邮箱里,谢谢你的关注,再次表示感谢




这段代码在我本地测试也是没有问题的,但上传但服务器时出现了这样的错误,会不会时这个参数服务器的数据库里没有呢?如果你需要全部的代码我可以发给你,在此对给予的关注表示感谢。




netaxcess你好,是不是说这个参数在我的服务器上没有调用出来呢?本地的测试机器上的数据库上有这个参数就没有发生这样的错误,而服务器上的数据库中没有这个参数导致了这样的错误?期待你的答案。




我的也是这个问题!不过楼上有提到加个if判断,具体怎么改呢?

顶一下,相同的问题!






不是这个原因,$goods_attr 前面有通过explode,可以保证是数组,即使是空的也不会出错
这里的错误实际上是$attr_value没有预定义的关系,如果为空的话又不是数组,直接implode就会出错。
应该在下面这一段代码之前加上这一句 $attr_value = array();
$sql = "SELECT attr_value ".
'FROM ' . $GLOBALS['ecs']->table('goods_attr') .
"WHERE goods_attr_id in($attr_list)";
$res = $db->query($sql);
$attr_value = array(); // 新增初始化
while ($row = $db->fetchRow($res))
{
$attr_value[] = $row['attr_value'];
}
只要while 语句之前就可以

我的是正解
应该是一个bug,好像2.7.3也没该过来
如果没有设置规格,或没有选择规格提交(仅靠前端js限制不一定保险)的话就会出现这个错误

我试了,怎么不行啊

非常好得到解决了

非常强大

回复netaxcess


不是这个原因,$goods_attr 前面有通过explode,可以保证是数组,即使是空的也不 ...
xieyu 发表于 2012-3-13 09:54



一样的问题,按你的方法解决了,非常感谢