php中如何同时使用session和cookie来保存用户登录信息


Posted in PHP onJuly 05, 2013

同时使用session和cookie来保存用户登录信息
1、数据库连接配置页面:connectvars.php

<?php
//数据库的位置
define('DB_HOST', '127.0.0.1');
//用户名
define('DB_USER', 'root');
//口令
define('DB_PASSWORD', '19900101');
//数据库名
define('DB_NAME','test') ;
?>

2、登录页面:logIn.php
<?php
//插入连接数据库的相关信息
require_once 'connectvars.php';
//开启一个会话
session_start();
$error_msg = "";
//如果用户未登录,即未设置$_SESSION['user_id']时,执行以下代码
if(!isset($_SESSION['user_id'])){
    if(isset($_POST['submit'])){//用户提交登录表单时执行如下代码
        $dbc = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
        $user_username = mysqli_real_escape_string($dbc,trim($_POST['username']));
        $user_password = mysqli_real_escape_string($dbc,trim($_POST['password']));
        if(!empty($user_username)&&!empty($user_password)){
            //MySql中的SHA()函数用于对字符串进行单向加密
            $query = "SELECT user_id, username FROM mismatch_user WHERE username = '$user_username' AND "."password = SHA('$user_password')";
            $data = mysqli_query($dbc,$query);
            //用用户名和密码进行查询,若查到的记录正好为一条,则设置SESSION和COOKIE,同时进行页面重定向
            if(mysqli_num_rows($data)==1){
                $row = mysqli_fetch_array($data);
                $_SESSION['user_id']=$row['user_id'];
                $_SESSION['username']=$row['username'];
                setcookie('user_id',$row['user_id'],time()+(60*60*24*30));
                setcookie('username',$row['username'],time()+(60*60*24*30));
                $home_url = 'loged.php';
                header('Location: '.$home_url);
            }else{//若查到的记录不对,则设置错误信息
                $error_msg = 'Sorry, you must enter a valid username and password to log in.';
            }
        }else{
            $error_msg = 'Sorry, you must enter a valid username and password to log in.';
        }
    }
}else{//如果用户已经登录,则直接跳转到已经登录页面
    $home_url = 'loged.php';
    header('Location: '.$home_url);
}
?>
<html>
    <head>
        <title>Mismatch - Log In</title>
        <link rel="stylesheet" type="text/css" href="style.css" />
    </head>
    <body>
        <h3>Msimatch - Log In</h3>
        <!--通过$_SESSION['user_id']进行判断,如果用户未登录,则显示登录表单,让用户输入用户名和密码-->
        <?php
        if(!isset($_SESSION['user_id'])){
            echo '<p class="error">'.$error_msg.'</p>';
        ?>
        <!-- $_SERVER['PHP_SELF']代表用户提交表单时,调用自身php文件 -->
        <form method = "post" action="<?php echo $_SERVER['PHP_SELF'];?>">
            <fieldset>
                <legend>Log In</legend>
                <label for="username">Username:</label>
                <input type="text" id="username" name="username"
                value="<?php if(!empty($user_username)) echo $user_username; ?>" />
                <br/>
                <label for="password">Password:</label>
                <input type="password" id="password" name="password"/>
            </fieldset>
            <input type="submit" value="Log In" name="submit"/>
        </form>
        <?php
        }
        ?>
    </body>
</html>

效果图:

php中如何同时使用session和cookie来保存用户登录信息

3、登入页面:loged.php

<?php
//使用会话内存储的变量值之前必须先开启会话
session_start();
//如果会话没有被设置,查看是否设置了cookie
if(!isset($_SESSION['user_id'])){
    if(isset($_COOKIE['user_id'])&&isset($_COOKIE['username'])){
        //用cookie给session赋值
        $_SESSION['user_id']=$_COOKIE['user_id'];
        $_SESSION['username']=$_COOKIE['username'];
    }
}
//使用一个会话变量检查登录状态
if(isset($_SESSION['username'])){
    echo 'You are Logged as '.$_SESSION['username'].'<br/>';
    echo '<a href="logOut.php"> Log Out('.$_SESSION['username'].')</a>';
}
/**在已登录页面中,可以利用用户的session如$_SESSION['username']、
 * $_SESSION['user_id']对数据库进行查询,可以做好多好多事情*/
?>

效果图:
php中如何同时使用session和cookie来保存用户登录信息
4、注销session与cookie页面:logOut.php(注销后重定向到lonIn.php)
<?php
/**同时注销session和cookie的页面*/
//即使是注销时,也必须首先开始会话才能访问会话变量
session_start();
//使用一个会话变量检查登录状态
if(isset($_SESSION['user_id'])){
    //要清除会话变量,将$_SESSION超级全局变量设置为一个空数组
    $_SESSION = array();
    //如果存在一个会话cookie,通过将到期时间设置为之前1个小时从而将其删除
    if(isset($_COOKIE[session_name()])){
        setcookie(session_name(),'',time()-3600);
    }
    //使用内置session_destroy()函数调用撤销会话
    session_destroy();
}
//同时将各个cookie的到期时间设为过去的某个时间,使它们由系统删除,时间以秒为单位
setcookie('user_id','',time()-3600);
setcookie('username','',time()-3600);
//location首部使浏览器重定向到另一个页面
$home_url = 'logIn.php';
header('Location:'.$home_url);
?>
PHP 相关文章推荐
PHP 页面编码声明方法详解(header或meta)
Mar 12 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
php使用sql数据库 获取字段问题介绍
Aug 12 PHP
php中的路径问题与set_include_path使用介绍
Feb 11 PHP
关于js和php对url编码的处理方法
Mar 04 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
PHP内存使用情况如何获取
Oct 10 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 PHP
php记录代码执行时间(实现代码)
Jul 05 #PHP
如何修改和添加Apache的默认站点目录
Jul 05 #PHP
解析php类的注册与自动加载
Jul 05 #PHP
php 注册时输入信息验证器的实现详解
Jul 05 #PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 #PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 #PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 #PHP
You might like
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php flv视频时间获取函数
2010/06/29 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
js 函数的副作用分析
2011/08/23 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
JS常用正则表达式总结【经典】
2017/05/12 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
实体的生命周期
2013/08/31 面试题
最新计算机专业自荐信
2013/10/16 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
售房委托书
2014/08/30 职场文书
六查六看自查报告
2014/10/14 职场文书