PHP-会话管理和控制

(。・∀・)ノ


PHP 会话管理和控制


一. 前言

标准的http协议是无状态的,无连接的。
???什么意思?⊙﹏⊙∥

【无状态】

  1. 协议对于事务处理没有记忆能力【事物处理】【记忆能力】
  2. 对同一个url请求没有上下文关系【上下文关系】
  3. 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况【无直接联系】【受直接影响】
  4. 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器【状态】

【无连接】

  1. 每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的
  2. 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接


具体内容以及为什么使用Session和Cookie参考下面博文:

[http协议无状态中的 “状态” 到底指的是什么?!]


二. Cookie概述

什么是Cookie?
请参考本站博客[HTTP协议请求头部的User-Agen和Cookie]


三. PHP中的Cookie

这节我们通过一个用户首次登陆网站后,再次访问不需要重复输入用户名和密码的例子来学习Cookie。

php中提供了一个函数来让我们设置cookie,这个函数是:bool setcookie();
[PHP setcookie() 函数]
需要注意的是,这个函数每次只能设置Cookie中的一个参数,比如一次只能设置用户名、密码等字段。
bool setcookie  (
        string $名字
        [, string $值]
        [, int $过期时间  = 0]
        [, string $路径]
        [, string $域名]
        [, bool $安全  = false]
        [, bool $http只读  = false]
    );
参数 描述
$名字 必需。规定 cookie 的名称。
$值 可选。规定 cookie 的值。
$有效期 可选。规定 cookie 的有效期。
$路径 可选。规定 cookie 的服务器路径。
$域名 可选。规定 cookie 的域名。
$安全 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
$http只读 可选。如果true,那么js就无法读取改cookie,增加安全性。

1.一般来说,我们其实用不到上面那么多参数,对于这个函数,我们一般这么用:setcookie(cookie名,cookie值,cookie有效期);
2.没错,就那么3个。如此一来,我们就可以在服务端通过$_COOKIE[‘name’] 来读取cookie了。



以下是示例:

  1. 我们将文件名命名为:cookie.php。
  2. 我们来模拟我们在互联网上见到最常见的例子:输入用户名和密码,登陆成功的过程。
  3. 我们来建一个数据库login,其中有表user,有username和password这两个字段。
<?php
//第一次登陆的时候,通过用户输入的信息来确认用户
if ( ( $_POST['username'] != null ) && ( $_POST['password'] != null ) ) {
    $userName = $_POST['username'];
    $password = $_POST['password'];
    //从db获取用户信息
    //PS:数据库连接信息改成自己的 分别为主机 数据库用户名 密码
    $conn = mysqli_connect('localhost','root','root');

    mysqli_select_db($conn,'test');

    $sql = "select * from user where `username` = '$userName' ";
    $res = mysqli_query($conn,$sql);
    $row = mysqli_fetch_assoc($res);
    if ($row['password'] == $password) {
        //密码验证通过,设置cookies,把用户名和密码保存在客户端
        setcookie('username',$userName,time()+60*60*24*30);//设置时效一个月,一个月后这个cookie失效
        setcookie('password',$password,time()+60*60*24*30);
        //最后跳转到登录后的欢迎页面
        header('Location: welcome.php' . "?username=$userName");
    }
}

//再次访问的时候通过cookie来识别用户
if ( ($_COOKIE['username'] != null)  && ($_COOKIE['password'] != null) ) {
    $userName = $_COOKIE['username'];
    $password = $_COOKIE['password'];

    //从db获取用户信息
    //PS:数据库连接信息改成自己的 分别为主机 数据库用户名 密码
    $conn = mysqli_connect('localhost','root','root','test');
    $res = mysqli_query($conn,"select * from user where `username` =  '$userName' ");
    $row = mysqli_fetch_assoc($res);
    if ($row['password'] == $password) {
        //验证通过后跳转到登录后的欢迎页面
        header('Location: welcome.php' . "?username=$userName");
    }
}

?>
<html>
<head>

</head>
<body>
<form action="" method="POST">
    <div>
        用户名:<input type="text" name="username" />
        密  码:<input type="text" name="password" />
        <input type="submit" value="登录">
    </div>
</form>
</body>
</html>


跳转到的welcome.php代码

<?php
$user = $_GET['username'];
?>
<html>
<head>

</head>
<body>
   welcome,<?php echo $user;?>
</body>
</html>

  1. 这样,当我第一次访问cookie.php的时候,我需要输入用户名和密码,输入完毕后跳转到了welcome.php。然后我关闭浏览器,再次打开cookie.php,这次没有要求我输入用户信息,而是直接跳转到了welcome.php,因为之前我们存的cookie信息被浏览器自动发送到了服务端,服务端做完处理直接跳转到了welcome.php,服务器认识我们了!知道我是之前那个登陆过的用户,这样我们就通过cookie技术让无状态的HTTP协议保持了状态。
    照着这个做一遍,我相信你会用cookie了。
  2. 只不过!!!只不过!!!只不过!!!重要的事要说3遍,我们一般是不会把用户名和密码放到cookie中的,因为这并不安全,容易泄露自己的信息,请不要把重要的信息放到cookie中。我们这个只是一个学习cookie的例子。


四. PHP中使用session

什么是session以及一些使用方法?可参考博文:

[php中Session使用方法详解]
[PHP会话机制—session的基本使用]
[W3school PHP Sessions]

  1. 注意:session_start()函数之前不能有任何输出,session_start() 函数必须位于 <html> 标签之前:
    <?php session_start(); ?>
    <\html>
    <body>
    </body>
    </html>
  2. 当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。同时,也在服务器端创建一个以Session ID命名的文件,用于保存这个用户的会话信息。当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session文件,将这之前为这个用户保存的会话信息读出,在当前脚本中应用,达到跟踪这个用户的目的。 Session以数组的形式使用,如:$_SESSION[‘session名’]
  3. 注册一个会话变量和读取Session
  4. 在PHP中使用Session变量,除了要启动之外,还要经过注册的过程。注册和读取Session变量,都要通过访问$_SESSION数组完成。在$_SESSION关联数组中的键名具有和PHP中普通变量相同的命名规则。

4.1 开启session

使用函数:bool session_start()

[PHP setcookie(void) 函数]

首先我们要开启session,那么第一个要学习的函数就是
bool session_start()了,这个函数没有参数。在php文件的开始使用

session_start();

4.2 (注册)添加session数据

开启会话之后,那么在接下来的处理中,我们就可以使用$_SESSION变量来存取信息了。我们要知道的是$_SESSION变量是个数组。当我们要把信息存入session的时候应该这么写:

 $_SESSION['userName'] = 'wang';

4.3 读取session数据

读取很简单,就像我们使用数组一样,如下:

   $userName = $_SESSION['userName'];

当然也可以 $_SESSION[‘userName’] 来用。和数组一样的使用

4.4 销毁session数据

我们可以使用很多种方式来销毁session数据。

a) unset函数
我们通过使用类似
   unset($_SESSION['XXX']);

来销毁session中的 XXX 变量。

请不要!请不要!请不要unset($_SESSION),会导致后续无法使用$_SESSION这个变量!!!

b) 空数组赋值给session变量
   $\_SESSION = array();

之前我们说过$_SESSOIN变量是个数组,那么空数组赋值的话也是相当于将当前会话的$_SESSION变量中的值销毁。

c) session_destory() 函数
这个函数会销毁当前会话中的全部数据,并结束当前会话。但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。

4.5 session的扩展

我们可以使用很多种方式来销毁session数据。
默认session存储在哪里?

1.在php.ini配置文件中有这么一行 session.save_handler = files,
files说明了php默认的是用文件读写的方式来保存session的。那么在哪个目录呢?继续看。session.save_path = “/tmp”,这一行前面有个 ; ,说明是被注释的,不过即便这样,php默认的session 也是保存在这里的,/tmp目录。


五. SESSION应用实例

5.1 登陆例子

2个文件:

  1. login.php,用于登陆界面;
  2. welcome.php,用于接收从login.php的跳转并设置session。

首先建立数据库信息:
新建一个名为 login 的数据库,再建一个 user 表,表的结构有2个字段:
username varchar(20)
password varchar(20)


login.php

<?php
session_start();
if ( ( $_POST['username'] != null ) && ( $_POST['password'] != null ) ) {
   $userName = $_POST['username'];
   $password = $_POST['password'];

   //从db获取用户信息   数据库信息改成自己的
   $conn = mysqli_connect('host','username','password','login');
   $res = mysqli_query($conn,"select * from user where `username` =  '$username' ");
   $row = mysqli_fetch_assoc($res);
   if ($row['password'] == $password) {
       //密码验证通过,设置session,把用户名和密码保存在服务端
       $_SESSION['username'] = $username;
       $_SESSION['password'] = $password;

       //最后跳转到登录后的欢迎页面 //注意:这里我们没有像cookie一样带参数过去
       header('Location: welcome.php');
   }
}

?>
<html>
<head>
<!-- 这里指明页面编码 -->
<meta charset="utf-8">
</head>
<body>
   <form action="" method="POST">
       <div>
           用户名:<input type="text" name="username" />
           密  码:<input type="text" name="password" />
           <input type="submit" value="登录">        
       </div>
   </form>
</body>
</html>



welcome.php 这里我们用的是session中的信息,而不是像cookie一样在url中带参数过来

<?php
session_start();
$username = $_SESSION['username'];
?>
<html>
<head>

</head>
<body>
   welcome,<?php echo $username;?>
</body>
</html>

5.2 购物车例子

3个文件:

  1. goodsList.php 这个是商品展示页,还有功能:如果是第一次购买某物品,则在购物车中加入该商品信息和计算总价,如果再次点击购买,则已购商品数量加1,总价重新计算,查看购物车链接可以到购物车页面。
  2. buy.php 此页完成购买功能,然后再次跳转到商品列表。主要是做了在session中处理购买商品操作。
  3. shoppingCart.php 此页展示购物车中的商品、价格、总价等信息。


首先建立数据库信息:
建立名为test的数据库,库中有个shop表,表结构有3个字段:
id int(10)
name varchar(20)
price varchar(20)


goodsList.php

<?php
   $goods = array();
   //从数据库获取商品信息存入$goods二维数组
   $i = 0;
   //这里请换上自己的数据库相关信息
   $conn = mysqli_connect('host','username','password','test');
   $res = mysqli_query($conn,'select * from shop');
   //这里把商品信息放到$goods二维数组,每一维存的是单个
   //商品的信息,比如商品名、价格。
   while ($row = mysqli_fetch_assoc($res)) {
       $goods[$i]['id'] = $row['id'];
       $goods[$i]['name'] = $row['name'];
       $goods[$i]['price'] = $row['price'];
       $i++ ;
   }

?>
<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
   <?php
   //取出商品信息显示在页面上,并添加购买功能
       foreach ($goods as $value) {
           echo ' 商品名 ' . $value['name'] . ' 价格 ' . $value['price'];
           echo "<a href=buy.php?name=" . $value['name'] . '&price=' . $value['price'] .">购买</a>";
           echo '<br />';
       }

   ?>
   <a href="shoppingCart.php">查看购物车</a>
</body>
</html>


buy.php

<html>
<head>
   <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
<?php
   //开启session
   session_start();

   //获取传过来的商品名和价格
   $name = $_GET['name'];
   $price = $_GET['price'];

   //把session中的商品信息和传过来的(刚买的)商品信息对比
   $goods = $_SESSION['goods'];
   if ($name == $goods[$name]['name']) {
       //买过的话,则总价格增加,相应商品数量增加
       $_SESSION['totalPrice'] += $price;
       $goods[$name]['number'] += 1;
   } else {
       //第一次买的话,将相应的商品信息添加到session中
       $goods[$name]['name'] = $name;
       $goods[$name]['price'] = $price;
       $goods[$name]['number'] += 1;
       $_SESSION['totalPrice'] += $price;
   }

   $_SESSION['goods'] = $goods;
   //购买处理完毕后跳转到商品列表
   header('location: goodsList.php');
?>
</body>
</html>


shoppingCart.php

<html>
<head>
   <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
<?php
session_start();
//将session中的商品信息(即购物车中的商品)和总价显示到页面
$goods = $_SESSION['goods'];
echo '您买了:<br />';
foreach ($goods as $value) {
   echo $value['name'] . ' 价格 ' . $value['price'] . ' 数量 ' . $value['number'] . '<br />';
}
echo '总价:' . $_SESSION['totalPrice'] . '<br />';

?>
<a href="goodsList.php">返回商品列表</a>
</body>
</html>


效果图如下:

1


  Reprint please specify: Treecatee PHP-会话管理和控制

 Previous
Python-基础 Python-基础
从今天开始Python的学习吧……ヾ(๑╹◡╹)ノ”本文参考: [Python3 教程][廖雪峰的官方网站Python教程][Python编程:从入门到实践][Python 中文学习大本营-Python 3.6.X 官方教程] &
2019-02-27
Next 
PHP操作MySQL数据库 PHP操作MySQL数据库
😁   PHP操作MySQL数据库    一. 数据库连接步骤将数据库连接整理成了最重要的8个步骤,我戏称它为:“数据库连接天龙八步”。😊 (。・∀・)ノ   第一步: 连接数
2019-02-24
  TOC