>

Ecshop贰遍开垦修改,大型ECShop安装搬家升级错误

- 编辑:www.bifa688.com -

Ecshop贰遍开垦修改,大型ECShop安装搬家升级错误

本地PHP环境PHP5.4,安装ecshop2.7.3后,很多地方会报如下的错

【引子】

所有的错误,根据下面这个帖子修改

Redefining already defined constructor for class XXX

        最近将ECShop框架网站从租用服务器搬家至阿里云,虽然模块及功能上已经被修改的面目全非了,但基础部分还在。

检查代码可以发现,对应的位置是某个类的构造函数,具体写法如下:

在这个过程中遇到了很多的WARNING与ERROR,解决方案如下。

 

/**
     * 构造函数
     *
     * @access  public
     * @param
     *
     * @return void
     */
    function alipay()
    {
    }

【环境】

修改错误:

    function __construct()
    {
        $this->alipay();
    }

        服务器环境由PHP5.3 MySQL5.6更新至PHP5.6 MySQL5.7

第300行 

其中使用和类名相同点函数名作为构造函数是php4时代的写法,php5时代的构造函数是 __construct(),ecshop为了兼容老版本的php,所以采用了上面的写法。

【数据库】

 原有内容:

但是从php5.4开始,对于这样的两种写法同时出现的情况,要求必须__construct()在前,同名函数在后,所以只需要对调两个函数的位置即可。

        利用navicat for mysql工具导入导出,出现异常:Invalid default value for 'create_time',具体可参考上一篇随笔。

//return preg_replace("/{([^}{n]*)}/e", "$this->select('\1');", $source);

【后台】

修改后内容: 

打开首页报错,提示:
Strict standards: Non-static method cls_image::gd_version() should not be called statically in includeslib_base.php on line 355

return cls_image::gd_version();

return preg_replace_callback("/{([^}{n]*)}/", function($r) { return $this->select($r[1]); }, $source);

对象可以访问静态方法,使用的是$p->function(),对象访问静态属性采用p::function()形式。

问题一:商城首页报 错 Strict Standards: Only variables should be passed by reference in D:wampecshopincludescls_template.php on line 422

$cimage=new cls_image();
return $cimage->gd_version();
类似还有:
Strict standards: Non-static method cls_sql_dump::get_random_name() should not be called statically in admindatabase.php on line 64
$smarty->assign('sql_name', cls_sql_dump::get_random_name() . '.sql');
修改为:
$csdump=new cls_sql_dump($db,$max_size);
$smarty->assign('sql_name', $csdump->get_random_name() . '.sql');
嫌麻烦直接找到function get_random_name()函数,前面加个static完事。

解决方法:

个人设置:

找到提示错误的文件 cls_template.php 及行号

Strict standards: Only variables should be passed by reference in includescls_template.php on line 422

$tag_sel = array_shift(explode(' ', $tag));

把 $tag_sel = array_shift(explode(' ', $tag));

调用函数传参错误

改成:
$tag_arr = explode(' ', $tag); 
$tag_sel = array_shift($tag_arr);

$p=explode(' ', $tag);
$tag_sel = array_shift($p);

并且删除 D:wampwwwecshoptempcaches下所有的文件

 商品分类:

问题二:后台首页报 错 Strict Standards: Non-static method cls_image::gd_version() should not be called statically in D:wampwwwecshopincludeslib_base.php on line 346

 Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead inincludescls_template.php on line 304

 return preg_replace("/{([^}{n]*)}/e", "$this->select('\1');", $source);

解决办法

PHP升级5.5之后,摒弃了preg_replace的/e特性。

找到D:wampwwwecshopincludescls_image.php文件

return preg_replace_callback("/{([^}{n]*)}/", function($func) { return $this->select($func[1]); }, $source);

搜索 function gd_version 改成 static function gd_version

问题集中在cls_template中。

 

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in includescls_template.php on line 554
$val = preg_replace("/[([^[]]*)]/eis", "'.'.str_replace('$','$','\1')", $val);
修改为:
$val = preg_replace_callback('/[([^[]]*)]/is',function ($matches) {return '.'.str_replace('$','$',$matches[1]);},$val);

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in includescls_template.php on line 491 
$out = "<?php n" . '$k = ' . preg_replace("/('\$[^,] )/e" , "stripslashes(trim('\1','''));", var_export($t, true)) . ";n";
修改为:
$out = "<?php " . '$k = ' . preg_replace_callback("/('\$[^,] )/" , function($match){return stripslashes(trim($match[1],'''));}, 
var_export($t, true)) . ";n";

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in includescls_template.php on line 1074
$pattern = '/<!--s#BeginLibraryItems"/(.*?)"s-->.*?<!--s#EndLibraryItems-->/se';
$replacement = "'{include file='.strtolower('\1'). '}'";
$source      = preg_replace($pattern, $replacement, $source);
修改为:
$pattern = '/<!--s#BeginLibraryItems"/(.*?)"s-->.*?<!--s#EndLibraryItems-->/s';
$source = preg_replace_callback($pattern, function ($func){return '{include file='.strtolower($func[1]).'}';},$source); 

历史订单:查看->配送方式:编辑

Warning: Illegal string offset 'free_money' in adminorder.php on line 3696
使用$shipping['configure']['free_money']形式,要求$shipping['configure']为数组,可以引入IF判断解决
if(is_array($shipping['configure'])){...}

Warning: number_format() expects parameter 1 to be double, string given in includeslib_common.php on line 1019
虽然ECShop2.7.3对参数$price进行判断是否为空,但配送插件里面的免费额度为0,ec本身的bug导致了$price的值为空值,直接调用number_format出现了错误。
在PHP5.3上报错,但获取到的应该是一个字符串,所以出错,应该这样改:
$price = 0   $price;//添加这一行,转换成数值

问题三:后台-商店设置 

 商店设置:

Strict Standards: mktime(): You should be using the time() function instead in D:wampwwwecshopadminsms_url.php on line 31
Strict Standards: mktime(): You should be using the time() function instead in D:wampwwwecshopadminshop_config.php on line 32

Strict standards: mktime(): You should be using the time() function instead in adminsms_url.php on line 31
Strict standards: mktime(): You should be using the time() function instead in adminshop_config.php on line 32
mktime()方法不带参数被调用时,会被抛出一个报错提示。
$auth=mktime();
修改为:
$autu=time();

解决办法

管理员权限与角色管理:

根据错误提示 把 mktime() 改成 time()

Warning: join(): Invalid arguments passed in adminprivilege.php on line 602
Warning: Invalid argument supplied for foreach() in adminprivilege.php on line 604
Warning: join(): Invalid arguments passed in adminrole.php on line 217
Warning: Invalid argument supplied for foreach() in adminrole.php on line 219
这里与上上个错误类似,数组类型取值才不会警告。
使用if(is_array($action_group['priv'])){}将join与foreach代码段包进去。
网上给出方案如下,感觉大同小异。
if(is_array($action_group['priv'])){
$action_group['priv'] = $action_group['priv'];
}else{
$action_group['priv'] = array();
}
自定义导航栏也报错:
Warning: Illegal string offset 'cat_name' in adminnavigator.php on line 383
if(is_array($val)){...}

 

角色管理与权限管理:只有checkbox选框,没有label文字

问题四:后台-起始页

锁定privilege_allot.htm与role_info.htm,修改如下:
$lang[$priv.action_code]->$lang.$priv.action_code
$lang[$list.action_code]->$lang.$list.action_code

Strict Standards: Redefining already defined c**tructor for class alipay in D:wwwesincludesmodulespaymentalipay.php on line 85

数据备份:

解决办法

Strict standards: Redefining already defined constructor for class cls_sql_dump in adminincludescls_sql_dump.php on line 90

1)、错误原因:
PHP 类,有两种构造函数,一种是跟类同名的函数,一种是 __contruct()。从PHP5.4开始,对这两个函数出现的顺序做了最严格的定义,必须是 __c**truct() 在前,同名函数在后

类似还有支付方式:

2)、
解决方法:
调换一下两个函数的前后位置即可。
以 includes/modules/payment/alipay.php  为例:

Strict Standards: Redefining already defined constructor for class chinabank in includes/modules/payment/chinabank.php on line 85

Strict Standards: Redefining already defined constructor for class paypal_ec in includes/modules/payment/paypal_ec.php on line 96

Strict Standards: Redefining already defined constructor for class shenzhou in includes/modules/payment/shenzhou.php on line 81

Strict Standards: Redefining already defined constructor for class ips in includes/modules/payment/ips.php on line 82

Strict Standards: Redefining already defined constructor for class balance in includes/modules/payment/balance.php on line 79

Strict Standards: Redefining already defined constructor for class alipay in includes/modules/payment/alipay.php on line 85

Strict Standards: Redefining already defined constructor for class tenpay in includes/modules/payment/tenpay.php on line 83

Strict Standards: Redefining already defined constructor for class post in includes/modules/payment/post.php on line 79

Strict Standards: Redefining already defined constructor for class paypal in includes/modules/payment/paypal.php on line 82

Strict Standards: Redefining already defined constructor for class tenpayc2c in includes/modules/payment/tenpayc2c.php on line 83

Strict Standards: Redefining already defined constructor for class cappay in includes/modules/payment/cappay.php on line 81

Strict Standards: Redefining already defined constructor for class bank in includes/modules/payment/bank.php on line 79

Strict Standards: Redefining already defined constructor for class kuaiqian in includes/modules/payment/kuaiqian.php on line 83

Strict Standards: Redefining already defined constructor for class cod in includes/modules/payment/cod.php on line 82

将下面这两个函数的位置互换一下就OK了,__contruct()在前,alipay()在后

使用和类名相同点函数名作为构造函数是php4时代的写法,php5时代的构造函数是__construct(),ecshop为了兼容老版本的php,所以采用了上面的写法。
但是从php5.4开始,对于这样的两种写法同时出现的情况,要求必须__construct()在前,同名函数在后,所以只需要对调两个函数的位置即可。

 

如alipay.php,将
    function __construct()
    {
        $this->alipay();
    }
放到
    function alipay()
    {

    }
前面。

 function alipay()    {
    }
    function __contruct()
    {
        $this->alipay();

首页广告管理:

    }

Strict standards: Only variables should be passed by reference in adminflashplay.php on line 274
传参时赋值,偷懒了。
set_flash_data($_CFG['flash_theme'], $error_msg = '');
修改为:
$error_msg = ''
set_flash_data($_CFG['flash_theme'], $error_msg);

 

后台翻页功能失效,弹出 transport.js /run() error:undefined。

3)、ECSHOP的很多类文件 都存在这个问题,都需要修改掉。

FF调试报错:Uncaught transport.js/parseResult() error: can't parse to JSON. 

 

ECShop把AJAX事件和JSON解析的模块放在common/transport.js之中,在封装JSON各种方法的同时对object的模型进行了重写,跟jQuery冲突!

问题五:后台-数据备份 

ECShop论坛上提出了一些办法,不是很好用。

 Strict standards: Redefining already defined constructor for class cls_sql_dump in D:wampwwwecshopadminincludescls_sql_dump.php on line 90
Strict standards: Non-static method cls_sql_dump::get_random_name() should not be called statically in D:wampwwwecshopadmindatabase.php on line 64

1、首先复制一份 transport.js 改名为 transport.org.js 提供给后台使用
2、屏蔽掉transport.js里的toJSON功能,注释掉行数大概在497-737行之间的内容,从if ( ! Object.prototype.toJSONString)开始
  修改352行为: legalParams = "JSON="   $.toJSON(params);
  修改408行为:result = $.evalJSON(result);
  屏蔽掉global.js里的如下代码(第10-13行):
  Object.prototype.extend = function(object)
  {
    return Object.extend.apply(this, [this, object]);
  }
3、修改index.js文件44行为:var res = $.evalJSON(result);
4、修改common.js文件34行为:Ajax.call('flow.php?step=add_to_cart', 'goods='   $.toJSON(goods), addToCartResponse, 'POST', 'JSON');
  修改850行为:Ajax.call('flow.php?step=add_package_to_cart', 'package_info='   $.toJSON(package_info), addPackageToCartResponse, 'POST', 'JSON');
  修改1056行为:Ajax.call('flow.php?step=add_to_cart', 'goods='   $.toJSON(goods), addToCartResponse, 'POST', 'JSON');
5、修改compare.js文件49行为: this.data = $.evalJSON(cookieValue);
  修改67行为: var obj = $.evalJSON(cookieValue);
  修改133行为: document.setCookie("compareItems", $.toJSON(this.data));
6、修改global.js文件
  修改16行函数名 :function $e()
  修改114和126行为:var element = $e(element);
7、修改后台头部引入transport.js路径
  admin/templates/pageheader.htm 第9行改为: {insert_scripts files="../js/transport.org.js,common.js"}
  admin/templates/menu.htm 第151行改为: {insert_scripts files="../js/global.js,../js/utils.js,../js/transport.org.js"}
8、修改themes/default/library/page_header.lbi文件在{insert_scripts files='transport.js,utils.js'}上面加上:
  {insert_scripts files='jquery.js,jquery.json.js'}
  jquery.json.js下载
9、修改library/comment_list.lbi 188行为:
   Ajax.call('comment.php', 'cmt='   $.toJSON(cmt), commentResponse, 'POST', 'JSON');
10、修改compare.dwt 20行为:
  var obj = $.evalJSON(document.getCookie("compareItems"));
  24行: document.setCookie("compareItems", $.toJSON(obj));
11、修改flow.dwt 138行为:
  Ajax.call('flow.php?step=add_to_cart', 'goods='   $.toJSON(goods),collect_to_flow_response, 'POST', 'JSON');
  199行: Ajax.call('flow.php?step=add_to_cart', 'goods='   $.toJSON(goods),fittings_to_flow_response, 'POST', 'JSON');
12、修改brand.dwt、brand_list.dwt、category.dwt、exchange_list.dwt、search.dwt文件,增加
  {insert_scripts files='jquery.js,jquery.json.js'}
  {insert_scripts files='common.js,global.js,compare.js'}
注意:包括其他jquery文件需置顶的dwt文件,jquery.js文件需要在compare.js文件加载前加载

解决办法

大概思路就是屏蔽ECshop扩展的toJSONString方法,用别的函数代替。

根据错误提示 把 cls_sql_dump的 function __construct()改到  function cls_sql_dump()的前面

把 cls_sql_dump的 function get_random_name()改成 static  function get_random_name()的前面

 

问题六:

Deprecated: Assigning the return value of new by reference is deprecated in  adminsitemap.php on line 46

 $sm     =& new google_sitemap();

 

解决办法

在 5.3版本之后已经不允许在程序中使用”=&”符号。如果你的网站出现了 Deprecated: Assigning the return value of new by reference is deprecated in 错 误,别着急,先定位到出错的文件,查找下是不是在程序中使用了”=&”,例如刚才定位到网站程序中发现了下图的程序,发现使用了”=&” 符号,去掉‘&’符号之后程序运行正常

问题:Warning: preg_replace_callback(): Modifier /e cannot be used with replacement callback in E:Program Filesxamppshtdocsuploadincludescls_template.php on line 1075

查找:

 $pattern     = '/<!--s#BeginLibraryItems"/(.*?)"s-->.*?<!--s#EndLibraryItems-->/se';

去掉那个 e !!!

修改为:

$pattern     = '/<!--s#BeginLibraryItems"/(.*?)"s-->.*?<!--s#EndLibraryItems-->/s';

 

错误:Strict standards: Only variables should be passed by reference in includeslib_main.php on line 1329

查找:

  $ext = end(explode('.', $tmp));

修改为:

 $tmp_arr = explode('.', $tmp);

 $ext = end($tmp_arr);

 

array_shift() 的参数是引用传递的,5.3以上默认只能传递具体的变量,而不能通过函数返回值 end(&array) 也一样(后面也会有end的函数,也需要拆分为两行)。

 

文件includes/init.php和admin/includes/init.php:

error_reporting(E_ALL ^ (E_NOTICE)改为:

error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT);

本文由必发88手机版发布,转载请注明来源:Ecshop贰遍开垦修改,大型ECShop安装搬家升级错误