php setcookie值为null或空字符串删除cookie解析

 更新时间:2016年11月25日 17:38  点击:1540
很多朋友在使用setcookie设置值为空或NULL时系统会自动把cookie给删除掉,下面我来给大家分析cookie值为null或空字符串删除cookie原因吧,有需要学习的朋友可参考。

官方文档中也是这样写的:


#2 setcookie() delete example

 代码如下 复制代码

<?php
// set the expiration date to one hour ago
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);
?>

今天遇到一件奇怪的事, 在setcookie的时候,传了一个空字符串给$value,结果竟然是此cookie被删除了…

 代码如下 复制代码

$name = "post_url";
$value =  "";
setcookie($name, $value,  time()+60*60*3, "/" );

去翻php 5.4.13 的源码结果得知

参数中的value在C语言中的类型是char * , 还有一个 value_len标明了它的长度。
如果value_len为0的话,就写了下面的cookie:
值为”deleted”, 过期时间为 Thu, 01-Jan-1970 08:00:01 CST 或者说是 Thu, 01-Jan-1970 00:00:01 GMT

看来setcookie($name, “”) 确实可以删除这个cookie了…
同理,在php中,strval(NULL) === “” , 所以 setcookie($name, NULL) 也就相当于 setcookie($name, “”),同样可以删除此cookie.

出现中文截取乱码的问题一般是中文文合混时比较多,如果你截取英文不会有问题,中文就会有,主要原因是:字符串编码为UTF-8的,一个中文字符占三个字节而字符串编码为GB2312的,一个中文字符占两个字节了。下面我来先来看实例。

字符串编码为GB2312的,一个中文字符占两个字节:

 代码如下 复制代码

public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
        $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
        for($i = $start; $i < $strlen;) {
            if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
                $tmpstr .= substr ( $str, $i, 2 ); // 每次取出两位字符赋给变量$tmpstr,即等于一个汉字
                $i=$i+2; // 变量自加2
            } else{
                $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
                $i++;
            }
        }
        return $tmpstr; // 返回字符串
    }

字符串编码为UTF-8的,一个中文字符占三个字节:

 代码如下 复制代码


public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
        $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
        for($i = $start; $i < $strlen;) {
            if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
                $tmpstr .= substr ( $str, $i, 3 ); // 每次取出三位字符赋给变量$tmpstr,即等于一个汉字
                $i=$i+3; // 变量自加3
            } else{
                $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
                $i++;
            }
        }
        return $tmpstr; // 返回字符串
    }

上面虽然解决了这个问题,但是要注意编码问题,相对来说比较麻烦,下面写了一个不管什么编码都没问题的解决办法。

 代码如下 复制代码

/**
 * Utf-8、gb2312都支持的汉字截取函数
 * cut_str(字符串, 截取长度, 开始长度, 编码);
 * 编码默认为 utf-8
 * 开始长度默认为 0
 */
function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
{
    if($code == 'UTF-8')
    {
        $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
        preg_match_all($pa, $string, $t_string);
        if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."…";
        return join('', array_slice($t_string[0], $start, $sublen));
    }
    else
    {
        $start = $start*2;
        $sublen = $sublen*2;
        $strlen = strlen($string);
        $tmpstr = '';
        for($i=0; $i< $strlen; $i++)
        {
            if($i>=$start && $i< ($start+$sublen))
            {
                if(ord(substr($string, $i, 1))>129)
                {
                    $tmpstr.= substr($string, $i, 2);
                }
                else
                {
                    $tmpstr.= substr($string, $i, 1);
                }
            }
            if(ord(substr($string, $i, 1))>129) $i++;
        }
        if(strlen($tmpstr)< $strlen ) $tmpstr.= "…";
        return $tmpstr;
    }
}

在通过IE的后退按钮或者网页中的history.go(-1)时,我们看到的将是缓存页,但使用了session_start后,这个函数会强制当前页面不被缓存,导致出现“警告: 网页已经过期”。

解决方法一:

在session_start之后加一句

 代码如下 复制代码
header("Cache-control: private");

注意在此之前程序不能有任何输出。

解决方法二:

在session_start前加上

 代码如下 复制代码
session_cache_limiter('private');

//不清空表单,只在session生效期间

 代码如下 复制代码
session_cache_limiter还有另两个参数的含义:
session_cache_limiter('nocache');// 清空表单
session_cache_limiter('public'); //不清空表单,如同没有使用session

解决方法三

 更改配置文件php.ini。将该文件中

 代码如下 复制代码
session.cache_limiter = nocache

改为

 代码如下 复制代码
session.cache_limiter = 或者session.cache_limiter = none

,然后重新启动apache。

可能用很多朋友使用json数据时利用php自带的函数JSON_DECODE/JSON_ENCODE处理中文内容时会碰到出现NULL或乱码问题,下面我来给大家介绍为什么会出现这样的问题。

 代码如下 复制代码

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

输出结果

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

完全正确没有任何问题,那么我们测试中文

 代码如下 复制代码

<?php
$json = '{"a":"中国人人"}';

var_dump(json_decode($json));

?>

结果

{"text":null,"status":1}

后来从php手册中得出,json_encode 和 json_decode只支持utf-8编码的字符,GBK的字符要用json就得转换一下,这样我们就好办了

转换一个编码

 代码如下 复制代码

/*
    字符串GBK转码为UTF-8,数字转换为数字。
*/
function ct2($s){
    if(is_numeric($s)) {
        return intval($s);
    } else {
        return iconv("GBK","UTF-8",$s);
    }
}
/*
    批量处理gbk->utf-8
*/
function icon_to_utf8($s) {

  if(is_array($s)) {
    foreach($s as $key => $val) {
      $s[$key] = icon_to_utf8($val);
    }
  } else {
      $s = ct2($s);
  }
  return $s;

}

echo json_encode(icon_to_utf8("厦门"));

这样还是有时会有问题,后来找了一种在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。

写了个函数

 代码如下 复制代码

/**************************************************************
*
*    使用特定function对数组中所有元素做处理
*    @param    string    &$array        要处理的字符串
*    @param    string    $function    要执行的函数
*    @return boolean    $apply_to_keys_also        是否也应用到key上
*    @access public
*
*************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            arrayRecursive($array[$key], $function, $apply_to_keys_also);
        } else {
            $array[$key] = $function($value);
        }

        if ($apply_to_keys_also && is_string($key)) {
            $new_key = $function($key);
            if ($new_key != $key) {
                $array[$new_key] = $array[$key];
                unset($array[$key]);
            }
        }
    }
}

/**************************************************************
*
*    将数组转换为JSON字符串(兼容中文)
*    @param    array    $array        要转换的数组
*    @return string        转换得到的json字符串
*    @access public
*
*************************************************************/
function JSON($array) {
    arrayRecursive($array, 'urlencode', true);
    $json = json_encode($array);
    return urldecode($json);
}

在php中我们要设置时间的方法有很多种,最常用的就是直接在php.ini中进行修改了date.timezone,如果没有服务器权限可以直接使用date_default_timezone_set函数进行设置下面我给大家介绍。

能修改php.ini。打开php.ini查找date.timezone 去掉前面的分号= 后面加XXX,重启http服务(如apache2或iis等)即可

关于XXX,大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木


在php.ini中设置时区

 代码如下 复制代码

date.timezone = PRC

在代码中设置时区

 代码如下 复制代码

date_default_timezone_set('Asia/Shanghai');//'Asia/Shanghai' 亚洲/上海

date_default_timezone_set('Asia/Chongqing');//其中Asia/Chongqing'为“亚洲/重庆”

date_default_timezone_set('PRC');//其中PRC为“中华人民共和国”

ini_set('date.timezone','Etc/GMT-8');

ini_set('date.timezone','PRC');

ini_set('date.timezone','Asia/Shanghai');

ini_set('date.timezont','Asia/Chongqing');

上面的代码我们可以直接在在 PHP 页面头中设置。

 代码如下 复制代码

date_default_timezone_set('PRC');

测试:

echo date('Y-m-d H:i:s');

[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • C#实现对字符串进行大小写切换的方法

    这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 【C#基础】Substring截取字符串的方法小结(推荐)

    这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 使用PHP similar text计算两个字符串相似度

    在网站开发中,我们经常使用php similar text 计算两个字符串相似度;1,similar_text的用法 如果我想计算"ly89cn"和"ly89"的相似程度,有两种表示方法复制代码 代码如下: echo similar_text('ly89cn', 'ly89'); ...2015-11-08
  • C#实现将字符串转换成日期格式的方法

    这篇文章主要介绍了C#实现将字符串转换成日期格式的方法,涉及C#操作时间及字符串的相关技巧,非常简单实用,需要的朋友可以参考下...2020-06-25
  • C# 16进制与字符串、字节数组之间的转换

    在串口通讯过程中,经常要用到 16进制与字符串、字节数组之间的转换...2020-06-25