PHP cookie使用方法与注意事项

 更新时间:2016年11月25日 15:44  点击:2046
cookie是一个用于存储信息到客户端浏览器中的我们可以利用cookie来记录用户的一些相关信息,像站长统计代码就基于cookie与ip来实现的,下面我来介绍cookie使用与注意事项。

PHP cookie用法

 代码如下 复制代码

setcookie('mycookie','value');
//函数原型:int setcookie(string name,string value,int expire,string path,string domain,int secure)
echo($mycookie);
echo($HTTP_COOKIE_VARS['mycookie']);
echo($_COOKIE['mycookie']);

删除Cookie

(1)调用只带有name参数的setcookie();
(2)使失效时间为time()或time-1;

 代码如下 复制代码

<?php setcookie('name'); ?>

setcookie('mycookie');或setcookie('mycookie','');或setcookie("mycookie",false);
//setcookie('mycookie','',time()-3600);
echo($HTTP_COOKIE_VARS['mycookie']);
print_r($_COOKIE);

建议删除方法:

 代码如下 复制代码

setcookie('mycookie','',time()-3600);

PHP提供一个很好用的函数mktime()。
你只要按顺序传送给mktime()你希望表示的小时,分钟,秒数,月份,日期,及年份,
mktime()就会返回该日期自1970年1月1日的总秒数。

因此,如果需要模拟 Y2K 问题:

 代码如下 复制代码
$y2k = mktime(0,0,0,1,1,2000);
setcookie('name','value',$y2k);
setcookie('name', 'value', time+3600);
setcookie('name', 'value', $y2k, '~/myhome', '.domain.com');

获取COOKIE过期时间的办法

 代码如下 复制代码

$expire = time() + 86400; // 设置24小时的有效期
setcookie ("var_name", "var_value", $expire); // 设置一个名字为var_name的cookie,并制定了有效期
setcookie ("var_name_expire", $expire, $expire); // 再将过期时间设置进cookie以便你能够知道var_name的过期时间

注:

在发送 cookie 时,cookie 的值会自动进行 URL 编码。接收时会进行 URL 解码。
如果你不需要这样,可以使用 setrawcookie() 代替。

PHP设置、获取与删除COOKIE

 

 代码如下 复制代码

//--------设置COOKIE,1小时后过期------//
setcookie('TestCookie','hello word 秦迷',time()+3600);
//setrawcookie不进行URL编码
header('Content-type: text/html');
 

//查看发送的报头
var_dump(headers_list());#array(2) { [0]=> string(85) "Set-Cookie: TestCookie=hello+word+%C7%D8%C3%D4; expires=Tue, 19-Apr-2011 10:06:14 GMT" [1]=> string(23) "Content-type: text/html" }
echo '<br>';
echo $_COOKIE['TestCookie'];#hello word 秦迷
//兼容旧版本(淘汰)
if(isset($HTTP_COOKIE_VARS["TestCookie"])){
    echo $HTTP_COOKIE_VARS["TestCookie"];
}
 

echo '<br>';
//输出所有 cookie
print_r($_COOKIE);#Array ( [key] => value [TestCookie] => hello word 秦迷 )
?>
 

<script type="text/javascript">
<!--
alert(document.cookie);
//-->
</script>
 

 

<?php
//-----设置数组COOKIE-------//
setcookie("cookie[one]","oneVal",time()+3600);
setcookie("cookie[two]","twoVal",time()+3600);
 

echo '<br>';
echo $_COOKIE['cookie']['two'];#twoVal
echo '<br>';
 

//输出 cookie (在重载页面后)
if (isset($_COOKIE["cookie"]))
{
    foreach ($_COOKIE["cookie"] as $name => $value)
    {
       echo "$name : $value <br>";
       /**
        * two : twoVal
        * one : oneVal
        */
 

    }
}
 

 

//设置过期,删除COOKIE
//setcookie('TestCookie', '', time() - 3600);
//setcookie('cookie[one]', '', time() - 3600);


方法一:

在PHP里Cookie的使用是有一些限制的。
1、使用setcookie必须在<html>标签之前
2、使用setcookie之前,不可以使用echo输入内容
3、直到网页被加载完后,cookie才会出现
4、setcookie必须放到任何资料输出浏览器前,才送出

由于上面的限制,在使用setcookie()函数时,学会遇到 “Undefined index”、”Cannot modify header information – headers already sent by”…等问题,解决办法是在输出内容之前,产生cookie,可以在程序的最上方加入函数 ob_start();

ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。

方法二:

解决Warning: Cannot modify header information – headers already sent by ……

前几天装了个php的大头贴系统测试,发现报错Warning: Cannot modify header information – headers already sent by ….今天又装openads,还是出现这个问题。怒了。上网找了半天,有人说要在文件开头写上ob_start();,结果失败。后来打开 php.ini 然后把 output_buffering 设为 on 。重起appache,OK。看来这才是解决办法。

特别注意:如果使用utf-8编码,一定要去掉UTF-8中的BOM,这都是因为utf-8编码文件含有的bom原因,而php4,5都是不支持bom的。去掉bom,可以用Notepad++打开转换一下。切记,切记,切记!(这问题害我折腾了半天。)

方法三:

当前设置的Cookie 不是立即生效的,而是要等到下一个页面时才能看到.这是由于在设置的这个页面里
Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器的原
因。在同一个页面设置Cookie,实际是从后往前,所以如果要在插入一个新的Cookie之前删掉一个,你必须
先写插入的语句,再写删除的语句,否则可能会出现不希望的结果。

删除一个COOKIE时,该COOKIE的值在当前页面仍然是有效的,也就是值还是存在的,在下次请求该页面或其它页面时就不会存在了。也就是说PHP的COOKIE相关操作都是异步的,当前面设置或删除了COOKIE,要等到下次请求时才能正确反应出来。

删除COOKIE时最好不要用setcookie(cookie名)这种方法,这样很容易删除整个COOKIE数组,具体我不细说了,注意就行了,删除COOKIE的最好方法是设有效时间为过去,当浏览器发现COOKIE有效期过后会确发删除COOKIE事件,还有一点要注意的时,设置COOKIE时有几个参数,删除时也要有几个参数,否则容易出错。

在php中获取IP地址的方法有很多种,下面我介绍利用linux命令获取IP地址然后转换成数组输出,下面也介绍了一些常用关于php ip地址处理实例。

PHP获取服务器IP地址

用PHP执行ifconfig获得Linux服务器IP并输出为数组,下面是代码:

 代码如下 复制代码

<?php
function getServerIp(){ //用ifconfig读取服务器IP并输出为数组
  $ss = exec('/sbin/ifconfig | sed -n 's/^ *.*addr:\([0-9.]\{7,\}\) .*$/\1/p'',$arr);
  return $arr;
  }
$ips=getServerIp();
 
foreach($ips as $k=>$v){//过滤IP
 if(substr($v,0,3)=='127' || substr($v,0,3)=='10.' || substr($v,0,7)=='192.168' || substr($v,0,6)=='172.16'){
  unset($ips[$k]);
 }
}
shuffle($ips);//重新排序
print_r($ips);
?>

一些php获取ip地址例

 代码如下 复制代码

<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
  $cip = $_SERVER["HTTP_CLIENT_IP"];
}
elseif(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){
  $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
elseif(!empty($_SERVER["REMOTE_ADDR"])){
  $cip = $_SERVER["REMOTE_ADDR"];
}
else{
  $cip = "无法获取!";
}
return $cip;
}
echo GetIP();
?>

我这里有一个比较公用的方法来获取用户ip地址:

 

 代码如下 复制代码
function get_user_ip() {
        if (isset($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP']!='unknown') {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']!='unknown') {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }

PHP获取IP所在地区(调用新浪API获取IP所在地)

 

 代码如下 复制代码
function get_location($ip){
 $curl = curl_init();
        curl_setopt($curl,CURLOPT_URL, "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=".$ip);
 $location = curl_exec($curl);
        $location = json_decode($location);
        if($location===FALSE) return "";
        return empty($location->desc) ? $location->province.$location->city.$location->district.$location->isp : $location->desc;
}
今天我们给大家介绍如何判断数组中存在我们要找的元素值哦,这里介绍如果是一维数据就直接in_array但多维数据复杂一点。

我们先来解一下in_array检查数组中是否存在某个值

 代码如下 复制代码

<?php
$os = array("Mac", "NT", "Irix", "Linux");

echo “(1)”;
if (in_array("Irix", $os)) {
    echo "Got Irix";
}
if (in_array("mac", $os)) {//in_array() 是区分大小写的
    echo "Got mac";
}

 

$a = array('1.10', 12.4, 1.13);
echo "(2)";

if (in_array('12.4', $a, true)) {//in_array() 严格类型检查
    echo "'12.4' found with strict checkn";
}
if (in_array(1.13, $a, true)) {
    echo "1.13 found with strict checkn";
}
 

 

$a = array(array('p', 'h'), array('p', 'r'), 'o');
echo "(3)";

if (in_array(array('p', 'h'), $a)) {
    echo "'ph' was foundn";

}

if (in_array(array('f', 'i'), $a)) {//in_array() 中用数组作为 needle
    echo "'fi' was foundn";
}
if (in_array('o', $a)) {
    echo "'o' was foundn";
}
?>

 

程序运行结果是:

(1)Got Irix

(2)1.13 found with strict check

(3)'ph' was found    'o' was found


上面都是一维数组了很简单,下面来看多维数据是否存在某个值

 代码如下 复制代码

$arr = array(
   array('a', 'b'),
   array('c', 'd')
);
 
in_array('a', $arr); // 此时返回的永远都是 false
deep_in_array('a', $arr); // 此时返回 true 值
 
function deep_in_array($value, $array) { 
    foreach($array as $item) { 
        if(!is_array($item)) { 
            if ($item == $value) {
                return true;
            } else {
                continue; 
            }
        } 
         
        if(in_array($value, $item)) {
            return true;    
        } else if(deep_in_array($value, $item)) {
            return true;    
        }
    } 
    return false; 
}

 


该方法是在php帮助手册in_array方法详解页面下的评论看到的,平时没事多看看帮助手册,特别是后面的经典评论,里面收集了不少人的经典方法啊。

我们这里介绍php与KindEditor编辑器使用时如何利用KindEditor编辑器的分页功能实现文章内容分页,KindEditor编辑器在我们点击分页时会插入
代码,我们只要以它为分切符,就可以了,具体分页方法如下。

我的理解核心代码

 代码如下 复制代码

$news = array(
'title'=>'first',
'content' =>'<p>this is paragraph 1</p>'
 .'<p>this is paragraph 2</p>'
 .'Now i make a page end. [--page--] page 2 start~~~~~'
);

$newsModel->insert($news);
=================================

//news_detail.php?p=2 :

$news_one = $newsModel->get(1);

$content_pages = explode('[--page--]',$news_one['content']);

$cur_page = min( max(1,intval($_GET['p'])), count($content_pages) );

$news_one['content'] = $content_pages[$cur_page-1];

return render('news_detail.html', $news_one);

我们知道在很多在线编辑器里都有插入分页的功能,像在KindEditor中点击插入分页编辑器会在光标的地方插入如下的代码:

 代码如下 复制代码
<hr style="page-break-after:always;" class="ke-pagebreak" />

而UEditor则会在光标处加入:

_ueditor_page _break_tag__ueditor_page和_break_tag_之间是没有空格的,由于本网站也是用的ueditor使用的分页符是break_tag,所以上面加了空格避免影响

下面我以KindEditor为例,贴上我的代码:

 代码如下 复制代码

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<?php
$content=<<<str
        <p>上海顶想信息科技有限公司(TOPThink Inc.)是国内领先的WEB应用和服务提供商致力于WEB应用平台、产品和应用的研发和服务,为企事业单位提供基于WEB的应用开发快速解决方案和产品。公司成立于2008年9月,是一家拥有自主知识产权的高新企业。</p>
        <hr />
        <p>公司长期专注于WEB应用框架、应用平台和企业解决方案的研究,公司的核心技术框架ThinkPHP由创始人刘晨于2006年创立,经过6年多的精心打造和发展,具有广泛的用户基础和良好的业内口碑,已经成长为国内领先和最具影响力的WEB应用开发框架,国外同比也具有相当大的优势。其应用领域分布于各个行业,在门户、社区和电子商务领域有着非常良好支持以及拓展,大小案例不下千家,在安全、效率、负载上都有很大优势,已经成为WEB应用的快速开发解决方案和最佳实践!</p>
                <hr />
        <p>
        公司总部位于上海,由从事互联网和用户体验研究达10年的资深专家领军,拥有一批专业的策划、设计和技术团队以及广泛的社区技术力量。公司长期以来凭借业内的影响力、良好的客户和合作关系,邀请了众多安全和项目专家作为顾问,有力得保证了客户项目的开发和实施。公司还拥有一支资深用户体验和设计研究队伍,针对不同用户量身定做用户体验流程,有着良好的产品设计和设计概念。<br/>2009年获得上海市重大文艺创作项目选题推荐。</p>
str;

$content = preg_replace("'<hr(.*)/>'iUs", "<hr>", $content);
$content = explode("<hr>", $content);
$count = count($content);
$p = empty($_GET['page']) ? 1 : (int) $_GET[page];
$p = $p == 0 ? 1 : $p;
$p = $p > $count ? $count : $p;
$p--;
$content = $content[$p];
$p++;
if ($count > 1) {
    $page = '<a class="first" href="?page=1">首页</a>';
    for ($i = 1; $i <= $count; $i++) {
        $page.=$i == $p ? '【<a class="on" style="color:red;" href="javascript:void(0)">' . $i . '</a>】' : '【<a href="?page=' . $i . '">' . $i . '</a>】';
    }
    $page.='<a class="end" href="?page=' . $count . '">尾页</a>';

}
echo "<h1>上海顶想信息科技有限公司</h1>";
echo $content;

echo "<div>{$page}</div>";

?>
</body>
</html>

按照上面的代码你就可以实现文章分页了,效果如下图:

如果你用的是UEditor编辑器分页符默认是:_ueditor_page _break_tag_ (你可以在ueditor.config.js中修改pageBreakTag的设定)则可以将上面的代码稍作修改即可:

 代码如下 复制代码

$content = preg_replace("'<hr(.*)/>'iUs", "<hr>", $content);
$content = explode("<hr>", $content);

改为:

$content = explode("_ueditor_page _break_tag_", $content);

这样就可以了,当然你可以自定义任何分页符

php冒泡排序就是实现数据交换然后找最大最小之间的,最后交换位置进行排序了,这个是我们以前用得最多的排序法了。

冒泡排序(BubbleSort)的基本概念是:

依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

例1,简单实现冒泡排序

 代码如下 复制代码

<?php
#冒泡排序法
$arr = array(12,45,89,3,24,55,223,76,22,11,89,2,4,5,28,112,20,434,23,65,65,765,6,8,23,5,33,553,45,423,64,77,84,23);
$tmp;
for($i=0;$i<count($arr)-1;$i++ ){      
    for($j=0;$j<count($arr)-1-$i;$j++){
        if($arr[$j] > $arr[$j+1]){
            $tmp = $arr[$j];
            $arr[$j] = $arr[$j+1];
            $arr[$j+1] = $tmp;
        }
    }
}

print_r($arr);

例2

 代码如下 复制代码

<?php
   
    //冒泡排序方法     function bubblesort(&$arr){
            //定义一个变量保存交换的值         $temp =0;
        for($i=0;$i<count($arr);$i++){
           
            for($j=0;$j<count($arr)-$i-1;$j++){
                       
                if($arr[$j]>$arr[$j+1]){
                    //如果前面的那个数大于后面的那个数,那么他们就进行交换                     $temp=$arr[$j];
                    $arr[$j]=$arr[$j+1];
                    $arr[$j+1]=$temp;
                }
            }           
        }
    }

    $arr=array(100,99,200,5,-4,6,-7);
    bubbleSort($arr);
    print_r($arr);   //数组是值传递,所以传递的时候加个&符号就是地址传递,改变外部变量
?>

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • JS使用cookie实现DIV提示框只显示一次的方法

    本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • 使用jquery修改表单的提交地址基本思路

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • 总结android studio注意事项及打不开等问题解决方法

    经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08