一. 前言
标准的http协议是无状态的,无连接的。
???什么意思?⊙﹏⊙∥
【无状态】
- 协议对于事务处理没有记忆能力【事物处理】【记忆能力】
- 对同一个url请求没有上下文关系【上下文关系】
- 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况【无直接联系】【受直接影响】
- 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器【状态】
【无连接】
- 每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的
- 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接
具体内容以及为什么使用Session和Cookie参考下面博文:
二. 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了。
以下是示例:
- 我们将文件名命名为:cookie.php。
- 我们来模拟我们在互联网上见到最常见的例子:输入用户名和密码,登陆成功的过程。
- 我们来建一个数据库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>
- 这样,当我第一次访问cookie.php的时候,我需要输入用户名和密码,输入完毕后跳转到了welcome.php。然后我关闭浏览器,再次打开cookie.php,这次没有要求我输入用户信息,而是直接跳转到了welcome.php,因为之前我们存的cookie信息被浏览器自动发送到了服务端,服务端做完处理直接跳转到了welcome.php,服务器认识我们了!知道我是之前那个登陆过的用户,这样我们就通过cookie技术让无状态的HTTP协议保持了状态。
照着这个做一遍,我相信你会用cookie了。- 只不过!!!只不过!!!只不过!!!重要的事要说3遍,我们一般是不会把用户名和密码放到cookie中的,因为这并不安全,容易泄露自己的信息,请不要把重要的信息放到cookie中。我们这个只是一个学习cookie的例子。
四. PHP中使用session
什么是session以及一些使用方法?可参考博文:
[php中Session使用方法详解][PHP会话机制—session的基本使用]
[W3school PHP Sessions]
- 注意:session_start()函数之前不能有任何输出,session_start() 函数必须位于
<html>
标签之前:<?php session_start(); ?>
<\html>
<body>
</body>
</html>
- 当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。同时,也在服务器端创建一个以Session ID命名的文件,用于保存这个用户的会话信息。当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session文件,将这之前为这个用户保存的会话信息读出,在当前脚本中应用,达到跟踪这个用户的目的。 Session以数组的形式使用,如:$_SESSION[‘session名’]
- 注册一个会话变量和读取Session
- 在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个文件:
- login.php,用于登陆界面;
- 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个文件:
- goodsList.php 这个是商品展示页,还有功能:如果是第一次购买某物品,则在购物车中加入该商品信息和计算总价,如果再次点击购买,则已购商品数量加1,总价重新计算,查看购物车链接可以到购物车页面。
- buy.php 此页完成购买功能,然后再次跳转到商品列表。主要是做了在session中处理购买商品操作。
- 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>
效果图如下: