有的用户在使用ecshop程序时,遇到Strict Standards: Only variables should be passed by reference in upload\includes\cls_template.php on line 418这个报错,一般是由于ecshop程序不兼容高级版的php版本造成的。万维景盛工程师在这里为大家分享解决方法。
方案一:调整主机的php版本为php5.2。如果主机商的主机可以调整php版本,那么是最简单的解决方法。因为ecshop是在php5.2的环境下运行的,如果放在php5.3、php5.4等高版本环境中运行,就会遇到各种报错。
方案二:修改相关错误程序:
418行把这一句拆成两句就没有问题了
$tag_sel = array_shift(explode(' ', $tag));
改成:
$tag_arr = explode(' ', $tag); $tag_sel = array_shift($tag_arr);
(实验过,绝对可行)
因为array_shift的参数是引用传递的,5.3以上默认只能传递具体的变量,而不能通过函数返回值
同理举一反三:遇到函数嵌套错误时可以分开写,错误自然解决
如:
function get_dyna_libs($theme, $tmp) { $extsub = explode('.', $tmp); $ext = end($extsub); $tmp = basename($tmp,".$ext"); $sql = 'SELECT region, library, sort_order, id, number, type' . ' FROM ' . $GLOBALS['ecs']->table('template') . " WHERE theme = '$theme' AND filename = '" . $tmp . "' AND type > 0 AND remarks=''". ' ORDER BY region, library, sort_order'; $res = $GLOBALS['db']->getAll($sql); $dyna_libs = array(); foreach ($res AS $row) { $dyna_libs[$row['region']][$row['library']][] = array( 'id' => $row['id'], 'number' => $row['number'], 'type' => $row['type'] ); } return $dyna_libs; }
将$ext = end(explode('.', $tmp));
改为
$extsub = explode('.', $tmp);
$ext = end($extsub);
方案三:屏蔽错误
或则如果这样配置的话: error_reporting = E_ALL | E_STRICT
php.ini中有如下设置:
error_reporting = E_ALL | E_STRICT
这是说,显示那些不符合编码规范的警告(coding standards warnings)。
Joomla其实是建议取消error的输出,如果出于调试需要,应改为
error_reporting = E_ALL & ~E_NOTICE
问题得到解决。