[TOC]

Cookie是将资料存在用户浏览器的技术, 最常见的用法, 就是做多少天内免登陆.

但是由于Cookie存在用户的浏览器中, 所以比较不安全, 容易被伪造.

#Cookie的设置

bool setcookie(string $name [,string $value [,int $expire [,string $path [,string $domain [,bool $secure]]]]])
参数 描述 示例
$name Cookie的识别名称,即key 使用$_COOKIE["cookiename"]调用
$value Cookie的,即value,可以为数值和字符串 echo $_COOKIE["cookiename"];
$expire Cookie的生命周期,是UNIX时间戳 time()+60*60*24*7, 即为一周后失效.不设置,在会话结束后立即失效.
$path Cookie的路径,只有指定路径能访问到 /为整个域名有效, /php/就只能在 /php/子目录内有效, 默认为设定Cookie的当前目录
$domain Cookie的有效域名 如果有子域名,也要生效,设为.whphp.com, 如果设为www.whphp.com, 那就只有这个域名可用.
$secure 是否通过https连接传送 设为true,仅可在https中使用, 默认为false.

例子

setcookie("username", "aaron", time()+60*60*24*7);
setcookie("username", "aaron", time()+60*60*24*7, "/test", "www.whphp.com", 1);

在PHP中读取Cookie

$_COOKIE其实就是个数组, 所以就当成数组使用即可.

print_r($_COOKIE);

#数组形态的Cookie 注意,setcookie() 第二个参数,必须为字符串, 所以不能直接把数组存进来, 可用采用以下方法

setcookie("user[username]", "aaron");
setcookie("user[password]", md5("123456"));
setcookie("user[email]", "canonpd@gmail.com");

print_r($_COOKIE);

#删除Cookie

// 只设置第一个参数, 表示删除该Cookie
setcookie("user");

//直接设为过期时间, 同样可用删除Cookie
setcookie("user", "", time()-1);

#Cookie登陆实例

index.php

<?php
//判断用户是否通过了身份验证
if($_COOKIE["isLogin"]) {
    //从Cookie中获取登录用户名输出
    echo '您好:'.$_COOKIE["username"].',  ';
    //为用户提供一个退出的操作链接
    echo '<a href="login.php?action=logout">退出</a>';
} else {
    //如果用户没有通过身份验证
    //页面跳转至登录页面
    header("Location:login.php");

    //终止程序继续执行
    exit;
}
?>
<html>
<head>
    <title>网站主页面</title>
    <meta charset="utf-8" />
</head>
<body>
    <p>这里显示网页的主体内容</p>
</body>
</html>

login.php

<?php
//声明一个删除Cookie的函数,调用时清除在客户端设置的所有Cookie
function clearCookies() {
    //删除Cookie中的标识符为username的变量
    setCookie('username', '', time()-3600);

    //删除Cookie中的标识符为isLogin的变量
    setCookie('isLogin', '', time()-3600);
}

//判断用户是否执行的是登录操作
if($_GET["action"]=="login") {
    //调用时清除在客户端先前设置的所有Cookie
    clearCookies();

    //检查用户是否为admin,并且密码是否等于123456
    if($_POST["username"]=="admin" && $_POST["password"]=="123456") {
        //向Cookie中设置标识符为username,值是表单中提交的,期限为一周
        setCookie('username', $_POST["username"], time()+60*60*24*7);
        //向Cookie中设置标识符为isLogin,用来在其他页面检查用户是否登录
        setCookie('isLogin', '1', time()+60*60*24*7);
        //如果Cookie设置成功则转向网站首页
        header("Location:index.php");
    }else{
        die("用户名或密码错误!");
    }
} else if($_GET["action"]=="logout") {
    //判断用户是否执行的是退出操作
    //调用时清除在客户端设置的所有Cookie
    clearCookies();
}
?>
<html>
<head>
    <title>用户登录</title>
    <meta charset="utf-8" />
</head>
<body>
     <!--  以HTML形式输出用户登录表单,提交给本页面 -->
    <table border="1" width="300" align="center" cellpadding="5" cellspacing="0">
        <caption><h1>用户登录</h1></caption>
        <form action="login.php?action=login" method="post">
            <tr>
                <th>用户名</th> 
                <td><input type="text" name="username" size=25></td>
            </tr>
            <tr>
                <th>密  码</th> 
                <td><input type="password" name="password" size=25></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="登录">
                    <input type="reset" value="重置">
                </td>
            </tr>
        </form>
    </table>
</body>
</html>

以上范例并不安全, 真实工作中,还需要在cookie保存用户名,和加密字符串,例如MD5加密并截取过的用户密码.

再与数据库的中比对验证, 达到免登陆的效果.