小左闲谈

Ecshop安装过程中(PHP5.5.12)出现的几个错误

In 笔记  @2016-02-16

以下是ECshop安装在PHP5.5.12环境下出现的报错,记录一下。
1.检查安装环境配置的时候报错:

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

原因:找到install/includes/lib_installer.php中的第31行 return cls_image::gd_version();然后在找到includes/cls_image.php中的678行,发现gd_version()方法未声明静态static。
解决:在includes/cls_image.php中的678行function gd_version()改成static function gd_version()。

2.检测环境的时候提示:是否支持JPEG是不支持的。
解决:将install/includes/lib_installer.php中第98行JPG修改成JPEG。

$jpeg_enabled = ($gd_info['JPEG Support']        === true) ? $_LANG['support'] : $_LANG['not_support'];

3.1安装完登录后台报错:

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in E:\phpDemo\ecshop\includes\cls_template.php on line 300

原因:在PHP5.5以上版本中preg_replace() 函数中用到的修饰符 /e 在 PHP5.5.x 中已经被弃用了。
解决:打开文件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() 函数中用到的修饰符 /e 提示替换 preg_replace_callback()的还有几处:
3.2文件includes/cls_template.php的493行:

$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";
 
修改为:
$out = "<?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/" , function($r) {return stripslashes(trim($r[1],'\''));}, var_export($t, true)) . ";\n";

3.3文件includes/cls_template.php的553行:

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

3.4文件includes/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);

4:错误信息:

Strict Standards: Only variables should be passed by reference in E:\web\shopex\includes\cls_template.php on line 422

原因:PHP5.3以上默认只能传递具体的变量,而不能通过函数返回值传递,所以这段代码中的explode就得移出来重新赋值。
解决:将includes\cls_template.php文件422行

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

5.后台错误信息:

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

打开admin\sms_url.php文件第31行:
打开admin\shop_config.php第332行:

$auth = mktime();
 
修改为:
$auth = time();
标签: ,   评论: 5枚 

Warning: curl_error(): 1 is not a valid cURL handle resource错误

In 学习  @2015-12-30

在微信开发获取acces_token过程中使用到PHP的curl采集函数遇到的警告错误:
Warning: curl_error(): 1 is not a valid cURL handle resource in xxxx line xxx

原始代码如下:

  1.     function getWXAccessToken(){
  2.         //1.请求url地址
  3.         $appid = 'APPID';//私有的,不发出来了
  4.         $appSecret = 'APPSECRET';//私有的,不发出来了
  5.         $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appSecret;
  6.         //2.初始化
  7.         $ch = curl_init();
  8.         //3.设置参数
  9.         curl_setopt($ch, CURLOPT_URL, $url);
  10.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  11.         //4.调用接口
  12.         $res = curl_exec($ch);
  13.         //5.关闭curl
  14.         curl_close($ch);
  15.         if(curl_errno($ch)){
  16.             var_dump(curl_error($ch));
  17.         }
  18.         $arr = json_decode($res, true);
  19.         var_dump($arr);
  20.     }

经过查找问题在于我在关闭curl后又再次使用了$ch,关闭一个cURL会话会释放所有资源,cURL句柄$ch也会被释放,所以后面再使用$ch时会报错。将curl_close($ch)函数放在最后就好了。

标签: , ,   评论: 5枚 

ThinkPHP自定义模型Class ‘UserModel’ not found

In 学习  @2015-12-14

ThinkPHP自定义Model的功能很好用,也很方便,但新版本(3.2.3)的更新,有些地方有些细微的不同。
自定义UserModel类正确的步骤:
1.在应用的Home\Model文件夹下新建UserModel.class.php文件。

  1. <?php
  2. namespace Home\Model;
  3. use Think\Model;
  4. class UserModel extends Model{
  5.  
  6.     public function getinfo(){
  7.         return 'hello world';
  8.     }
  9. }
  10. ?>

2.实例化自定义模型。

  1. $User = new UserModel();
  2. echo $User->getinfo();
  3. //这里还有很多方法实例化参考http://document.thinkphp.cn/manual_3_2.html#model_instance

在第一步中有两个很重要的地方:
1.自定义模型的文件名应该是XXXModel.class.php,XXXModel需要和你自定义类的类名保持一致,包括大小写。
2.XXXModel.class.php文件中需要加入命名空间“namespace Home\Model;”。

如果这些有问题,就会出现前面的Class ‘UserModel’ not found的错误提示。

标签: , ,   评论: 1枚