首页 > 编程技术 > php

php提示Notice:unserialize()[function.unserialize]:Error错误解决办法

发布时间:2016-11-25 17:37

在使用php中serialize函数时会出现示Notice:unserialize()[function.unserialize]:Error错误了,下面我们来看问题解决办法。

出现这个错误,可能会有几种原因,网上搜索的答案基本也是比较有针对性的一方面,关键在如何去寻找原因,并解决它。

分析一:在数据进行存储并反序列化时编码问题出错

这个原因是很常见的,比方,原本是以GBK编码进行存储,然后是UTF-8编码的,那么在进行unserialize()就会有问题;

解决方法一:将UTF-8编码的数据转换成GBK,PHP语言可以用iconv()函数;

分析二:重写反序列函数

一些情况可以把底层的函数重写,将gb2312转换成utf-8格式之后,每个中文的字节数从2个增加到3个之后导致了反序列化的时候判断字符长度出现了问题,所以需要使用正则表达式将序列化的数组中的表示字符长度的值重新计算一遍,代码如下:

function mb_unserialize($serial_str) {
    $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
    return unserialize($out);
}

解决方法三:对字符数据进行base64_encode,然后serialize序列化,还原提取时,unserialize()再base64_decode

本文章为各位总结了关于php提示”Cannot send session cache limiter ? headers already sent by”错误解决办法。


运行PHP页面,提示“Cannot send session cache limiter – headers already sent by()”或者"function session_start()"错误,让人非常头痛。因为这不是第一次遇到了,为了加深印象,把问题原因分析及解决方法详细写下来,分享给大家。

问题分析:

记得第一次遇到这个问题时,谷歌了很多答案,也有很多种解决方法,但出现这个问题大部分最根本的原因是:当在运行session_start();时是不能有任何输出,而这之前页面已经有出现空行现象,或可以说页面是含有DOM编码的UTF-8页面。

查看页面是否含有DOM编码方法:

1、使用Dreamweaver软件打开页面,查看页面属性(修改-页面属性-标题/编码),查看“包括Unicode签名BOM”项前面是否打勾;

2、记事本打开,另存为时,编码格式为ANSI则不含有DOM,若为UTF-8,基本肯定含有。

解决办法:

通过工具,如:editplus、ultraedit等工具,去掉DOM行即空白行即可解决,具体步骤如下

 

步骤:通过UE打开页面–文件–另存为–格式选择“UTF-8无BOM”–保存,即完成了UTF-8页面去BOM头,再不会出现页头空行情况。
如图所示:
 

 

 


其它解决方法:

1、页面头部加上:ob_start();//偶尔碰到失效;
2、新建页面,将代码COPY过去,这个方法有时也管用,注意GBK还是UTF-8编码(通常由GBK另存为UTF-8编码时会默认带DOM编码);
3、另一种情况服务器PHP配置问题:修改php.ini中的 session.auto_start = 0 为 session.auto_start = 1;
4、基本上面的可以解决这个问题,还有些很少见的非常规方法,如果不能解决,大家只能谷歌了。

date()函数是获得服务器当时时间了,但我们会发现如果刚安装好的php环境使用date()会有几个问题了,如时间不正确或提示date()使用报错了,下面一起来看看问题解决办法。


通过date()函数获取时间后,发现小时时间不对,比现在的时间小8个小时,无论用H,还是用h都一样,这个是因为当前获取的是格林威治时间,与北京时间相差8小时。

解决方法如下

1、修改php.ini配置文件

打开php.ini文件,一般在php配置根目录下,找到其中的 ;date.timezone,删掉前面的分号,并改为date timezone = PRC。保存,重启Apahce服务即可(有时用restart会有问题,先stop然后start就行了)。

2、加上date_default_timezone_set(timezone_identifier)函数
这个函数的意思是,设置当前时区,对时间进行初始化,在页头或获取时间语句前加上这句话。

例如:

date_default_timezone_set(PRC);
echo date("Y-m-d H-i-s");

参数如下设置:

date_default_timezone_set(PRC) –设置为北京时间,PRC代表中华人民共和国
date_default_timezone_set(‘Asia/Shanghai’) –设置为上海时间,大陆可用的还有‘Chongqi’(重庆)、‘Urumqi’(乌鲁木齐)同样可以的

港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北)
新加坡地区:Asia/Singapore   (好像就是没看到北京的)

此函数永远会返回True,但一定要输入timezone_identifier,不然会报错。

下面是所有的时区标识符:(供大家参考)

CET

CST6CDT

Cuba

EET

Egypt

Eire

EST

EST5EDT

Etc/GMT

Etc/GMT+0

Etc/GMT+1

Etc/GMT+10

Etc/GMT+11

Etc/GMT+12

Etc/GMT+2

Etc/GMT+3

Etc/GMT+4

Etc/GMT+5

Etc/GMT+6

Etc/GMT+7

Etc/GMT+8

Etc/GMT+9

Etc/GMT-0

Etc/GMT-1

Etc/GMT-10

Etc/GMT-11

Etc/GMT-12

Etc/GMT-13

Etc/GMT-14

Etc/GMT-2

Etc/GMT-3

Etc/GMT-4

Etc/GMT-5

Etc/GMT-6

Etc/GMT-7

Etc/GMT-8

Etc/GMT-9

Etc/GMT0

Etc/Greenwich

Etc/UCT

Etc/Universal

Etc/UTC

Etc/Zulu

Factory

GB

GB-Eire

GMT

GMT+0

GMT-0

GMT0

Greenwich

Hongkong

HST

Iceland

Iran

Israel

Jamaica

Japan

Kwajalein

Libya

MET

MST

MST7MDT

Navajo

NZ

NZ-CHAT

Poland

Portugal

PRC

PST8PDT

ROC

ROK

Singapore

Turkey

UCT

Universal

UTC

W-SU

WET

使用是公司同事以前的电脑了它用的是php2.17了,小编觉得它旧了于时升级到了php5.4了,结果发现运行ecshop中现Redefining already defined constructor for class 错误了,那么这个问题如何处理?我们一起来看看吧。

本地PHP环境PHP5.4,安装ecshop2.7.3后,很多地方会报如下的错

Redefining already defined constructor for class XXX

检查代码可以发现,对应的位置是某个类的构造函数,具体写法如下:


/**
     * 构造函数
     *
     * @access  public
     * @param
     *
     * @return void
     */
    function alipay()
    {
    }

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

其中使用和类名相同点函数名作为构造函数是php4时代的写法,php5时代的构造函数是 __construct(),ecshop为了兼容老版本的php,所以采用了上面的写法。

但是从php5.4开始,对于这样的两种写法同时出现的情况,要求必须__construct()在前,同名函数在后,所以只需要对调两个函数的位置即可。

朋友的一个网站导出会员信息时,导出的csv文件中的身份证号码显示为科学计数法,最后几位直接显示为0,解决的办法其实很简单

其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法;如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0。

$idcard = “\t”.$idcard;

顺便看到如果是phpexcel导出的话,把”\t”换成” “即可(双引号直接有个空格)

标签:[!--infotagslink--]

您可能感兴趣的文章: