Strict Standards: Only variables should be passed by reference in upload\includes\cls_template.php on line 418
第418行:$tag_sel = array_shift(explode(' ', $tag));
解决办法 1 ():
5.3以上版本的问题,应该也和配置有关 只要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);
解决办法 2(屏蔽错误) :
或则如果这样配置的话: 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
问题得到解决。
二、如果出现以下问题
Strict Standards: Non-static method cls_image::gd_version() should not be called statically in includes\lib_base.php on line 346
解决办法一:屏蔽错误
首先检查php.ini 中extension=php_gd2.dll 注释是否去掉
如果还有问题 查找error_reporting = E_ALL 修改成 error_reporting = 0
D:\workspace\ecshop\includes 下的init.php文件 修改@ini_set('display_errors', 1); 把1修改成零
D:\workspace\ecshop\admin\includes下的init.php文件 修改@ini_set('display_errors', 1); 把1修改成零
解决办法二:根源上解决错误
第一个提示的意思是cls_image类里面的gd_version函数不是静态方法,不能用cls_image::gd_version调用。这个和gd库没有一点关系,是ecshop程序的问题。
找到includes\lib_base.php错误行
function gd_version() { include_once(ROOT_PATH . 'includes/cls_image.php'); $cls_imageargs=new cls_image(); //return cls_image::gd_version();这里使用了静态调用 return $cls_imageargs->gd_version();//恢复动态调用 }
三、
将第64行
$smarty->assign('sql_name', cls_sql_dump::get_random_name() . '.sql');
改为
$cls_sql_dumpsub=new cls_sql_dump(); $smarty->assign('sql_name', $cls_sql_dumpsub->get_random_name() . '.sql');
四、
Strict Standards: Redefining already defined constructor for class cls_sql_dump in D:\WWW\ecshop\admin\includes\cls_sql_dump.php on line 90
此问题主要是php4与php5版本引起的
/** * 类的构造函数 * * @access public * @param * * @return void */ function cls_sql_dump(&$db, $max_size=0) { $this->db = &$db; if ($max_size > 0 ) { $this->max_size = $max_size; } } /** * 类的构造函数 * * @access public * @param * * @return void */ function __construct(&$db, $max_size =0) { $this->cls_sql_dump($db, $max_size); }
改为
/** * 类的构造函数 * * @access public * @param * * @return void */ function __construct(&$db, $max_size =0) { $this->cls_sql_dump($db, $max_size); } /** * 类的构造函数 * * @access public * @param * * @return void */ function cls_sql_dump(&$db, $max_size=0) { $this->db = &$db; if ($max_size > 0 ) { $this->max_size = $max_size; } }
五、
ECshop 后台显示Deprecated: Assigning the return value of new by reference is deprecated in admin\goods_batch.php on line 921
公司接了个做网店的项目,用ECshop开发,装在window7下,后台管理出现了
( ! ) Deprecated: Assigning the return value of new by reference is deprecated in F:\wamp\www\ECshop\admin\goods_batch.php on line 921
这个错误,网上搜了好长时间,找到答案了
只要把admin目录下的goods_batch.php文件的921行
$filter = &new stdclass;
new前边的&去掉就ok了,是不是很简单???
$filter = new stdclass;
六、会员自动退出漏洞
ecshop使用就了就会发现越来越多的bug,现在这边又遇到了一个奇怪的问题,就是网站上的注册会员登录之后,在个别的地方个别的浏览器上会出现浏览了几个页面之后自动退出的现象。因为我在我这边测试一直没有捕抓到这个bug,是通过我们的一个客户发现的,然后反馈上来。
会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。
进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可以了。望尽快把这个bug给补上。
/** * 检查cookie * * @access public * @param * * @return void */ function check_cookie () { if ( isset($_COOKIE['ECS']) && isset($_COOKIE['ECS']['user_id']) && isset($_COOKIE['ECS']['password'])) { $ecs_user_id = $_COOKIE['ECS']['user_id']; $ecs_user_pass = $_COOKIE['ECS']['password']; $sql = "SELECT " . $this->field_name ." AS user_name". " FROM " . $this->table($this->user_table) . " WHERE ".$this->field_id." = '$ecs_user_id' AND ".$this->field_pass." = '$ecs_user_pass'"; $username = $this->db->getOne($sql); if ($username && ($this->charset != 'UTF8')) { $username = ecs_iconv($this->charset, 'UTF8', $username); } return $username; } else { return ''; } }