安装ECShop

2014年12月17日 | 分类: 【源码】

ECShop在PHP5.3以上版本中存在诸多PHP函数兼容问题。

参考:http://www.wuyouhuan.com/archives/6
参考:http://blog.sina.com.cn/s/blog_6f145be10102v2px

修改数据库连接信息

打开data目录下面的config.php文件,找到:

// database name
$db_name   = "dbname";   修改成数据库名称

// database username  
$db_user   = "dbuser";    修改成数据库用户名

// database password
$db_pass   = "dbpass";  修改成数据库密码

修改目录权限

chmod -R 777 cert data images temp themes

报错:Deprecated: preg_replace()

路径:includes/cls_template.php

报错:

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in ...

原因:preg_replace() 函数中用到的修饰符 /e 在 PHP5.5.x 中已经被弃用了。

1. 将 cls_template.php的300行

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

换成:

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

2. 将cls_template.php的493行

$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";

换成:

$replacement = preg_replace_callback("/(\'\\$[^,]+)/" ,
                   
                            function($matcher){
                                return stripslashes(trim($matcher[1],'\''));
                            },
                   
                            var_export($t, true));
                   
$out = "<?php \n" . '$k = ' . $replacement . ";\n";

3. 将cls_template.php的552行

$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);

换成:

$val = preg_replace_callback("/\[([^\[\]]*)\]/", function($r) {return '.'.str_replace('$','$',$r[1]);}, $val);

4. 将cls_template.php的1069行

$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/se';
$replacement = "'{include file='.strtolower('\\1'). '}'";
$source = preg_replace($pattern, $replacement, $source);

换成:

$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/s';
$source = preg_replace_callback($pattern, function($r){return '{include file='.strtolower($r[1]). '}';}, $source);

报错:Non-static method cls_image::gd_version()

路径:/includes/lib_base.php

报错:

Strict Standards: Non-static method cls_image::gd_version() should not be called statically

原因:未声明静态static。

将 lib_base.php 的351行

return cls_image::gd_version();

换成:

$p = new cls_image();
return $p->gd_version();

因为系统是PHP5.5的,又要使用ECShop。但ECShop目前仅对PHP5.3支持良好。所以需要进行一些适应性修改。

1. 修改WAP版logo时报错(解决方法适用同类报错)

Strict standards: Only variables should be passed by reference in /admin/shop_config.php on line 173

问题:array_pop() 的参数是引用传递的,5.3以上默认只能传递具体的变量,而不能通过函数返回值。

方法:需要拆分为两行。

将/admin/shop_config.php 的173行

$ext = array_pop(explode('.', $file['name']));

修改为

$ext_arr = explode('.',$file['name']);
$ext = array_pop($ext_arr);

2. 设置支付方式时报错(解决方法适用其他支付接口文件)

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

问题:这里是php4与php5的区别,PHP4中构造方法是一个与类同名的方法,而从PHP5开始,用__construct()做为构造方法,但仍然支持PHP4的构造方法。如果同时使用的话,如果同名方法在前的话,则会报错。

方法:只需要把 function __construct()移到同名函数之前。

将/includes/modules/payment/alipay.php 的85行

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

修改为

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

3. 商店设置时报错(解决方法也适用于/admin/shop_config.php 的同类报错)

Strict standards: mktime(): You should be using the time() function instead in /admin/sms_url.php on line 31

问题:PHP版本问题

方法:将mktime()修改为 time()

将/admin/sms_url.php 的31行

$auth = mktime();

修改为

$auth = time();

4. 安装时报错

Strict Standards: Non-static method cls_image::gd_version() should not be called statically in install/includes/lib_installer.php on line 31

问题:找到install/includes/lib_installer.php中的第31行 return cls_image::gd_version();然后在找到include/cls_image.php中的678行,发现gd_version()方法未声明静态static,所以会报错。

方法:将function gd_version()改成static function gd_version()。

5. 进入站点地图报错

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

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

将/admin/sitemap.php 的46行

    $sm     =& new google_sitemap();
    $smi    =& new google_sitemap_item($domain, $today, $_POST['homepage_changefreq'], $_POST['homepage_priority']);

修改为

    $sm     = new google_sitemap();
    $smi    = new google_sitemap_item($domain, $today, $_POST['homepage_changefreq'], $_POST['homepage_priority']);

6. 生成站点地图时报错

Warning: file_put_contents(../sitemaps.xml): failed to open stream: Permission denied in /admin/includes/cls_google_sitemap.php on line 72

问题:ECShop的主目录没有设置写权限

方法:将ECShop的主目录设置权限为777

参考: