用cookies来跟踪识别用户


Posted in PHP onOctober 09, 2006

让我们来看看保存在浏览器中的内容。如果你用的是IE5,在windows目录下有一个cookies的目录,里面有很多文本文件,文件名都是类似于wudong@15seconds[1].txt这样的,这就是浏览器用来保存值的cookies了。在以前的IE版本中,cookies的内容是可以察看的,但现在内容已经被编码了。在浏览器得到一个Web页面之前,它会先看这个页面的域名,是否在cookie中存在,如果有相比配的,浏览器会先把匹配的cookie传送到服务器,然后才接受处理服务器传送过来的页面。


先举个cookies应用的例子:当我连接到Amazon.com时,浏览器在接受第一个页面之前会把它以前设置的cookies的内容传送给Amazon。然后Amazon.com对传送过来的内容加以检查,看看在数据库中有没有相关资料,在匹配之后,在为我建立一个定制的页面传送到过来。

为cookies赋值


必须在服务器传送任何内容给客户浏览器之前为Cookies赋值。要做到这一点,cookies的设置就必须放在<HEAD>标签内:

<?php

setcookie("CookieID",$USERID);

?>

<HTML>

<BODY>

</BODY>

</HTML>

setcookie函数一共有六个参数,用逗号来分隔:


cookie的名称,是一个字符串,例如:"CookieID"。其间不允许有冒号,逗号和空格。这个参数是必须的,而其它的所有参数都是可选的。如果只有这一个参数被给出,那么这个cookie将被删除。


cookie的值,通常是一个字符串变量,例如:$USERID。也可以为它赋一个??来略过值的设置。


cookie失效的时间。如果被省略(或者被赋值为零),cookie将在这个对话期(session)结束后失效。这个参数可以是一个绝对的时间,用DD-Mon-YYHH:MM:SS来表示,比如:"24-Nov-9908:26:00"。而更常用的是设置一个相对时间。这是通过time()函数或者mktime函数来实现的。比如time()+3600将使得cookie在一个小时后失效。


一个路径,用来匹配cookie的。当在一个服务器上有多个同名的cookie的设置,为避免混淆,就要用到这个参数了。使用"/"路径的和省略这个参数的效果是一样的。要注意的是Netscape的cookie定义是把域名放在路径的前面的,而PHP则与之相反。


服务器的域名,也是用来匹配cookie的。要注意的是:在服务器的域名前必须放上一个点(.)。例如:".friendshipcenter.com"。因为除非有两个以上的点存在,否者这个参数是不能被接受的。


cookie的安全级,是一个整数。1表示这个cookie只能通过“安全”的网络来传送。0或者省略则表示任何类型的网络都可以。


Cookies和变量


当PHP脚本从客户浏览器提取了一个cookie后,它将自动的把它转换成一个变量。例如:一个名为CookieID的cookie将变成变量$CookieID.


Cookies的内容被报存在HTTP_COOKIE_VARS数组中,你还可以通过这个数组和cookie的名称来存取指定的cookie值:


print$HTTP_COOKIE_VARS[CookieID];


记住每一个用户


回过头在来看看上面的submitform.php3文件,它的作用是把客户的姓名添加到数据库中,现在我想为它添加一些东西。我想为每个用户都分配一个唯一的用户标志,然后把这个标志放在Cookies中,这样每当用户访问我的网站的时候,通过cookie和其中的用户标志,我就能够知道他是谁了。


MySQL能够被设置成为每一个新的纪录自动的分配一个数字,这个数字从1开始,以后每次自动加1。用一行SQL语句,你就可以轻松的为数据表添加这样的一个字段,我把它叫做USERID:

ALTERTABLEdbname

ADDCOLUMN

USERIDINT(11)NOTNULL

PRIMARYKEYAUTO_INCREMENT;


对这个字段我们作了一些特别的设置。首先,通过“INT(11)”定义它的类型为11位的整数;然后用“NOTNULL”关键字让这个字段的值不能为NULL;再用“PRIMARYKEY”把它设置为索引字段,这样搜索起来就会更快;最后,“AUTO_INCREMENT”定义它为自动增一的字段。


当把用户的姓名插入到数据库后,就应该在他们的浏览器上设置cookie了。这时利用的就是刚才我们谈到的USERID字段的值:


<?php

mysql_connect(localhost,username,password);

mysql_select_db(dbname);

mysql_query("INSERTINTOtablename(first_name,last_name)

VALUES('$first_name','$last_name')

");

setcookie("CookieID",

mysql_insert_id(),

time()+94608000,

"/");/*三年后cookie才会失效*/

?>


PHP函数mysql_insert_id()返回在最后一次执行了INSERT查询后,由AUTO_INCREMENT定义的字段的值。这样,只要你不清除掉浏览器的Cookies,网站就会永远“记住”你了


读取cookie


我们来写一个像Amazon.com所作的那样的脚本。首先,PHP脚本会先检查客户浏览器是否发送了cookie过来,如果是那样的话,用户的姓名就会被显示出来。如果没找到cookie的话,就显示一个表单,让客户登记他们的姓名,然后把他添加到数据库中,并在客户浏览其中设置好cookie。


首先,先来显示cookie的内容:

<?php

print$CookieID;

?>

然后,就可以把名字显示出来了:

<?php

mysql_connect(localhost,username,password);

mysql_select_db(dbname);

$selectresult=mysql_query("SELECT*FROMtablename

WHEREUSERID='$CookieID'

");

$row=mysql_fetch_array($selectresult);

echo"欢迎你的光临",$row[first_name],"!";

?>

就是这样的了。我在其中没有作判断,交给你自己来完成好了  

PHP 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
ASP和PHP都是可以删除自身的
Apr 09 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
Aug 20 PHP
ThinkPHP 表单自动验证运用示例
Oct 13 PHP
php文件缓存类汇总
Nov 21 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
使用sockets:从新闻组中获取文章(一)
Oct 09 #PHP
使用sockets:从新闻组中获取文章(三)
Oct 09 #PHP
PHP+MYSQL的文章管理系统(二)
Oct 09 #PHP
使用sockets:从新闻组中获取文章(二)
Oct 09 #PHP
通过ODBC连接的SQL SERVER实例
Oct 09 #PHP
如何对PHP程序中的常见漏洞进行攻击(下)
Oct 09 #PHP
模拟OICQ的实现思路和核心程序(三)
Oct 09 #PHP
You might like
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
载入进度条 效果
2006/07/08 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
js正则相关知识点专题
2018/05/10 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
法国珠宝店:CLEOR
2017/01/29 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
生产车间实习自我鉴定
2013/09/23 职场文书
大学新生军训个人的自我评价
2013/10/03 职场文书
护理工作感言
2014/01/16 职场文书
运动会通讯稿600字
2015/07/20 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
i7 6700处理器相当于i5几代
2022/04/19 数码科技