ecshop在php5.3以上版本运行中的各种报错处理
php5.3以上环境中,安装ecshop的时候,会遇到报错提示,如下:
gd_version()
1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in F:\xampp\htdocs\ecshop\default\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,所以会出错。这时候只要:
1)将function gd_version()改成static function gd_version()即可。
2)或者将install/includes/lib_installer.php中的第31行return cls_image::gd_version();改成:
$p = new cls_image(); return $p->gd_version();
不支持JPEG
2.检测环境的时候提示:是否支持 JPEG是不支持的。
解决:查看发现有libjpeg.lib库,GD2库也有,都加载了,也都正常。查看ecshop源代码发现install/includes/lib_installer.php中第100行,JPEG写成了JPG,正确的应该是:
$jpeg_enabled = ($gd_info['JPEG Support'] === true) ? $_LANG['support'] : $_LANG['not_support'];
为何说ecshop写错了,因为我打印数组$gd_info的时候,里面的键名是:JPEG Support。而$gd_info数组里的值都是直接调用系统环境变量的。
preg_replace()
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in F:\xampp\htdocs\ecshop\default\includes\cls_template.php on line 300
大致内容是preg_replace函数中的e修饰符已过时,使用preg_replace_callback函数代替。
关于此修饰符,参见:
http://www.php.net/manual/zh/reference.pcre.pattern.modifiers.php
解决:找到 includes\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);
//自定义函数的形参由你自己命名,你只需满足
preg_replace_callback 的回调函数需要接受一个数组就行了
Only variables should be
Strict Standards: Only variables should be passed by reference in F:\xampp\htdocs\ecshop\default\includes\cls_template.php on line 423
解决:找到 includes\cls_template.php 中的423行代码
$tag_sel = array_shift(explode(' ', $tag));
改成
$tag_arr = explode(' ', $tag); $tag_sel = array_shift($tag_arr);
另一个地方同样修改(includes\lib_main.php”文件的1329行):
//$ext = end(explode('.', $tmp)); $ext_bak = explode('.', $tmp); $ext = end($ext_bak);
原因:array_shift的参数是引用传递的,5.3以上默认只能传递具体的变量,而不能通过函数返回值,后台更新缓存后正常。
mktime()
Strict standards: mktime(): You should be using the time() function instead
2处地方:admin\sms_url.php 和 admin\shop_config.php
错误行:$auth = mktime();
PHP手册里 http://cn2.php.net/manual/en/function.mktime.php 有个Note:
As of PHP 5.1, when called with no arguments, mktime() throws an E_STRICT notice: use the time() function instead.
自从PHP5.1起,调用这个函数不传递参数,会出现一个 notice
@mktime()
前面加@屏蔽mktime出错时提示
constructor
Strict Standards: Redefining already defined constructor for class alipay in F:\xampp\htdocs\ecshop\default\includes\modules\payment\alipay.php on line 85
...多行报错提示省略
这个错误跟PHP“类”中的构造函数有关,PHP早期版本是是用跟类同名的函数作为构造函数,后来又出现了使用 __contruct() 作为构造函数,这2个函数可以同时存在。
到了PHP5.4版本,对这2个函数在代码中的先后顺序有了严格的要求。
在PHP5.4版本以上,必须 __contruct() 在前,同名函数在后,否则就会出现上面的错误提示。
解决:includes\modules\payment 文件夹下的所有文件(upop.php除外),把
function alipay() { }
与
function __construct() { $this->alipay(); }
调换一下位置,其他几个文件也是一样操作。
作者:z1988
链接:https://www.z1988.com/207.html
文章版权归作者所有,未经允许请勿转载。