php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07

前几篇笔记中已经提到过 $_GET 和 $_POST 以及 $_FILES,这篇笔记就将$_REQUEST $_SERVER 和 $_COOKIE $_SESSION来简单说明一下.

1、$_REQUEST

使用$_REQUEST既可以获取GET方式提交的数据,也可以获取POST方式提交的数据 $_REQUEST = array_merge( $_GET,$_POST)

<form action="req.php" method="post">
    <input type="text" name="t1"><br>
    <input type="submit" value="提交">
</form>

<br>

<form action="req.php" method="get">
    <input type="text" name="t2"><br>
    <input type="submit" value="提交">
</form>

<?php
// 获取表单参数 并且 使用 $_REQUEST 来获取表单的参数

// 因为两个表单的数据name值不一样,且为了安全,判断一下 获取到的数据是否是定义过的

if(isset($_REQUEST['t1'])){
    echo $_REQUEST['t1']."我是post提交的表单"."</br>";
}


if(isset($_REQUEST['t2'])){
    echo $_REQUEST['t2']."我是get提交的表单"."</br>";
}

当采用GET 和 POST 混合提交数据的方式后,预定义变量是使用了POST还是GET提交的参数,与php.ini配置文件有关.
request_order = “GP” ,GP 决定 预定义变量GET 和 POST提交的顺序 (感觉画蛇添足,没啥大用处),只要知道使用 $_REQUEST预定义变量可以获取POST和GET方式提交的数据即可

2、$_SERVER

通过$_SERVER获取服务器主机和浏览器的一些相关信息

预定义变量使用功能
$_SERVER[“REMOTE_ADDR”]浏览器主机IP
$_SERVER[“SERVER_ADDR”]服务器主机IP
$_SERVER[“SERVER_NAME”]服务器主机名
$_SERVER[“SERVER_PORT”]服务器占用端口号
$_SERVER[“HTTP_HOST”]服务器主机名
$_SERVER[“PHP_SELF”]当前执行php程序的相对路径
$_SERVER[“QUERY_STRING”]查询字符串
$_SERVER[“DOCUMENT_ROOT”]web服务器根目录
$_SERVER[“REQUEST_URI”]请求URI

tip:$_SERVER["QUERY_STRING"] 需要在url进行拼接才会显示 req.php?xxx=yyy&zzz=mmm 这样

使用如下:

一个表单:

<form action="req.php" method="post">
    <input type="text" name="t3"><br>
    <input type="submit" value="提交">
</form>

处理表单请求参数并且显示的页面 req.php

// 通过$_SERVER获取服务器主机的一些相关信息
if(isset($_REQUEST['t3'])){
    echo "浏览器主机IP-".$_SERVER["REMOTE_ADDR"]."<br>"; //::1
    // 有的web服务器不支持 这个 $_SERVER["SERVER_ADDR"]
    echo "服务器主机IP-". $_SERVER["SERVER_ADDR"]."<br>";
    echo "服务器主机名-".$_SERVER["SERVER_NAME"]."<br>";// localhost
    echo "服务器占用端口号-".$_SERVER["SERVER_PORT"]."<br>";// 81
    echo "服务器主机名-".$_SERVER["HTTP_HOST"]."<br>";//localhost:81
    echo "当前程序的执行相对路径名-".$_SERVER["PHP_SELF"]."<br>";//   /req.php
    echo "查询字符串-".$_SERVER["QUERY_STRING"]."<br>";// 需要在url进行拼接才会显示  req.php?xxx=yyy&zzz=mmm 这样
    echo "web服务器根目录-".$_SERVER["DOCUMENT_ROOT"]."<br>";//D:\phpstudy_pro\WWW\phpProjects\demo1
    echo "请求URI-".$_SERVER["REQUEST_URI"]."<br>";// /req.php
}

3、$_COOKIE

cookie 常用于识别用户(比如账号的自动登录)。cookie 是一种服务器留在用户计算机上的小文件。

cookie 是一组"键值对"信息,该信息由web服务器的php程序生成,最终保存到浏览器端主机内存或者浏览器端主机硬盘文件中。

在这里插入图片描述

3.1 cookie的内容

Cookie是一段不超过4KB的小型文本数据,由一个键值对,和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。

(1)name 和 value:设置Cookie的标记名称(字符串)及相对应的值,对于认证Cookie,Value值包括Web服务器所提供的访问令牌 。

(2)expire属性:设置Cookie的生存期(过期时间),通常为整数数据类型。有两种存储类型的Cookie:会话性与持久性。expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效 。

(3)path属性:指定Cookie在web服务器的有效路径,即web服务器访问站点。。

(4)domain属性:指定了可以访问该 Cookie 的 有效域名。

(5)secure属性:指定Cookie 信息是通过 Http协议还是 Https协议加入请求头,取值范围为 true | flase。默认值为false,表示只有使用Http协议时才将cookie加入请求头中;true的话就是使用Https协议才…

3.2 cookie的分类

有两种存储类型的Cookie:会话性与持久性。expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效

  • 会话cookie

    会话cookie仅保存在客户端内存中,并在用户关闭浏览器时失效.会话cookie的典型应用是实现session会话技术。

  • 持久cookie

    持久性Cookie会保存在用户的硬盘中。
    持久性Cookie失效的情况及原因:

    • 当cookie的过期时间到了以后,cookie失效
    • 浏览器用户手动删除cookie(清理缓存)
    • 浏览器主机存放的cookie太多,浏览器自动清除cookie.

3.3 php中cookie的使用

使用 setcookie()函数 或者 header()函数 ,可以在php中自行设定cookie.

setcookie()函数
语法格式:bool setcookie(string name [ [ [ [ ,string value], int exprie ], string path ], string domain ], int secure)
函数功能: 成功创建cookie则返回true,否则返回false

header()函数
直接通过 header("Set-Cookie:name=value")即可在请求头中添加cookie。

tip:一般设定cookie的过期时间即expire属性值时,使用 time() 函数 或者 mktime() 函数。

time() 函数
语法格式: int time(void)
函数功能:返回一个时间戳(从1970-1-1到目前时间)

cookie的删除:
使用 setcookie()函数将cookie的值设置为空,或者使用setcookie()函数将expire过期时间设置为过去的时间,即可删除cookie.

3.4 cookie自动登录小demo

login.php:

<?php
    // cookie的获取,用于实现自动登录
    $uName ="";
    $uPwd ="";
    if(isset($_COOKIE['uName'])){
        $uName = $_COOKIE['uName'];
    }
    if(isset($_COOKIE['uPwd'])){
        $uPwd = $_COOKIE['uPwd'];
    }
?>

<!--创建一个登录表单-->
<form action="checkLogin.php" method="post">
    账号:<input type="text" name="uName" value="<?php echo $uName?>"><br>
    密码:<input type="password" name="uPwd" value="<?php echo $uPwd?>"><br>
    <input type="submit" value="提交">
</form>

checkLogin.php:

<?php

// 1.使用 $_REQUEST 来获取表单参数

$uName = $_REQUEST['uName'];
$uPwd = $_REQUEST['uPwd'];

// 2.登录验证,如果是 admin  1234,则允许登录
$flag1 = boolval("admin"==$uName&&1234==$uPwd);
if($flag1 ){
    echo "登录成功"."<br>";
    echo "账号:".$uName."<br>密码:".$uPwd."<br>";
}
if (!$flag1){
    echo "登录失败请重新登录!点击下面的链接即可返回登录页面"."<br>";
    echo "<a href='login.php'>返回登录页面</a>";
}

// 3.设定用户登录cookie,只要不超过cookie的过期时间,下次就可以自动登录啦
$expireTime = intval(60*60*24*3);// 3天  60*60*24*3 设定cookie的过期时间是三天
setcookie("uName",$uName,time()+$expireTime);// 设置 cookie
setcookie("uPwd",$uPwd,time()+$expireTime);
echo "你的账号信息已经存放与cookie中,".$expireTime."秒 后过期";

运行图:
在这里插入图片描述

使用F12开发者工具对网络进行抓包查看,我们自己设定的cookie是否存在于请求头中。

在这里插入图片描述
在这里插入图片描述

再次回到login.php,发现cookie已经自动填充好啦

在这里插入图片描述

4、$SESSION

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,当浏览器关闭时,会话cookie从浏览器中删除,与浏览器cookie对应的session依旧存在,直到当服务器关闭,session销毁失效,或者session的过期时间到了session失效

cookie不设置过期时间的会话就是session,cookie保存至浏览器端,session文件保存在服务器的硬盘中。

php中提供了预定义变量$_SESSION用来解析和修改Session文件PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

4.1 session的工作原理

session的工作原理:
(1)当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

4.2 session的使用

4.2.1 修改php.ini中的session配置

php.ini配置文件中有一组Session的配置选项,用于管理Session的自身属性。

  • 1.session.save_hanler = files :设置服务器保存用户个人信息的保存方式,默认为“files”,表示用文件存储session信息。如果想要使用数据库存储session信息,则将其改为 session.save_hanler = user。
  • 2.session.save_path = "自定义路径": 在save_handler设为files时,用于设置session文件的保存路径。
  • 3.session_use_cookies =1:默认值为1,代表SessionID使用cookie传递,为0时使用查询字符串传递sessionID.
  • 4.session.name = PHPSESSID:session的名称,默认值为"PHPSESSID"。
  • 5.session.auto_start=0:浏览器请求服务器页面时,是否自动开启session,默认值为0,表示不自动开启session。
  • 6.session.cookie_lifetime =0:设置sessionID在cookie中的过期时间,默认值为0(浏览器关闭sessionID即失效)。
  • 7.session.cookie_path= / :使用cookie传递sessionID时cookie的有效路径,默认为/
  • 8.session.cookie_domain = : 使用cookie传递sessionID时cookie的有效域名,默认为空。
  • 9.session.gc_maxlifetime = 1440,设置session文件中的最大过期时间,默认为1440秒,即如果1440秒之内没有访问session文件,则该session文件失效。

下面的是session在php.ini中默认的配置:

[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
session.save_handler = files

; Argument passed to save_handler.  In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
;
; The path can be defined as:
;
;     session.save_path = "N;/path"
;
; where N is an integer.  Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
; store the session data in those directories.  This is useful if
; your OS has problems with many files in one directory, and is
; a more efficient layout for servers that handle many sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
;         You can use the script in the ext/session dir for that purpose.
; NOTE 2: See the section on garbage collection below if you choose to
;         use subdirectories for session storage
;
; The file storage module creates files using mode 600 by default.
; You can change that by using
;
;     session.save_path = "N;MODE;/path"
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
; http://php.net/session.save-path
;session.save_path = "/tmp"

; Whether to use strict session mode.
; Strict session mode does not accept an uninitialized session ID, and
; regenerates the session ID if the browser sends an uninitialized session ID.
; Strict mode protects applications from session fixation via a session adoption
; vulnerability. It is disabled by default for maximum compatibility, but
; enabling it is encouraged.
; https://wiki.php.net/rfc/strict_sessions
session.use_strict_mode = 0

; Whether to use cookies.
; http://php.net/session.use-cookies
session.use_cookies = 1

; http://php.net/session.cookie-secure
;session.cookie_secure =

; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 1

; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = PHPSESSID

; Initialize session on request startup.
; http://php.net/session.auto-start
session.auto_start = 0

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 0

; The path for which the cookie is valid.
; http://php.net/session.cookie-path
session.cookie_path = /

; The domain for which the cookie is valid.
; http://php.net/session.cookie-domain
session.cookie_domain =

; Whether or not to add the httpOnly flag to the cookie, which makes it
; inaccessible to browser scripting languages such as JavaScript.
; http://php.net/session.cookie-httponly
session.cookie_httponly =

; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
; Current valid values are "Strict", "Lax" or "None". When using "None",
; make sure to include the quotes, as `none` is interpreted like `false` in ini files.
; https://tools.ietf.org/html/draft-west-first-party-cookies-07
session.cookie_samesite =

; Handler used to serialize data. php is the standard serializer of PHP.
; http://php.net/session.serialize-handler
session.serialize_handler = php

修改一下session文件的保存路径
在这里插入图片描述

4.2.2 开启session

session的使用不同于cookie,必须在php程序中调用session_start()函数启动session后才能使用session.

session_start()

语法格式:bool session_start ( void )

函数功能如下:

  • 1.加载php.ini配置文件中session的配置信息(session的生存周期,session的保存路径)加载到web服务器的内存中。

  • 2.创建SessionId 或者使用原有的SessionID。若Cookie请求头中不存在相应的SessionID则表示第一次访问,则创建一个新的SessionID来标识,若已经存在,则直接使用Cookie请求头中的已有的SessionID.

  • 3.在web服务器创建Session文件或者解析已有的Session文件.如果是新的SessionID,则创建Session文件,$_SESSION为空数组,反之若是已经存在的SessionID,则直接将Session文件中的内容到$_SESSION数组中。

  • 4.产生Cookie响应头信息,Cookie响应头会随着响应发送给浏览器。(响应头形如 ``)

4.2.3 删除和销毁session

php提供了session_unset() 和 session_destory()用来删除session数据。

session_unset()用于释放指定的 session 变量,只清空对应SessionID的数据,保留SessionID。
语法格式:void session_unset( void )

session_destory()用于彻底删除销毁session,SessionID也被清除置为0。
语法格式:bool session_destory(),销毁session成功后返回true,否则返回false。

4.3 session 图书上传信息添加和修改例子

addBook.php,添加书籍信息页面:


<form action="toAddBook.php" method="post" >
    作者:<input type="text" name="author" placeholder="请输入文章作者"><br>
    标题:<input type="text" name="title" placeholder="请输入文章标题"><br>
    类型:<select name="bookType">
        <option value="--------请选择类型--------" disabled selected></option>
        <option value="文学类">文学类</option>
        <option value="科普类">科普类</option>
        <option value="教辅类">教辅类</option>
    </select><br>
    内容:<textarea name="content"></textarea><br>
    <input type="submit" value="添加图书">
</form>


toAddBook.php,php处理添加图书信息页面:

<?php

// 获取表单上传的文本信息
$author = $_POST['author'];
$title = $_POST['title'];
$bookType = $_POST['bookType'];
$content = $_POST['content'];

//1.启动session
session_start();
// 2.设定session
$_SESSION['author'] = $author;
$_SESSION['title'] = $title;
$_SESSION['bookType'] = $bookType;
$_SESSION['content'] = $content;

// 3.页面重定向到 showBook.php
// 使用header()函数进行重定向
header("location:showBook.php");

showBook.php,显示图书信息页面:

<?php

// 获取session数据

$author = "";
$title = "";
$bookType ="";
$content = "";
// 每个需要session的地方都需要使用session_start();来开启
session_start();
// 用isset函数判断下,不然报错就不好了
if(isset($_SESSION['author'])){
    $author = $_SESSION['author'];
}
if(isset($_SESSION['title'])){
    $title = $_SESSION['title'];
}
if(isset($_SESSION['bookType'])){
    $bookType = $_SESSION['bookType'];
}
if(isset($_SESSION['content'])){
    $content = $_SESSION['content'];
}

// 定界符输出
echo <<<div

<p>作者:$author</p>
<p>标题:$title</p>
<p>文章类型:$bookType</p>
<p>文章内容:$content</p>
<p>
    <button οnclick="window.location.href='updateBook.php'">修改图书内容</button>
</p>
div;

updateBook.php,图书更新表单页面:

<?php
    // 获取session数据

    $author = "";
    $title = "";
    $bookType ="";
    $content = "";
    // 每个需要session的地方都需要使用session_start();来开启
    session_start();
    // 用isset函数判断下,不然报错就不好了
    if(isset($_SESSION['author'])){
        $author = $_SESSION['author'];
    }
    if(isset($_SESSION['title'])){
        $title = $_SESSION['title'];
    }
    if(isset($_SESSION['bookType'])){
        $bookType = $_SESSION['bookType'];
    }
    if(isset($_SESSION['content'])){
        $content = $_SESSION['content'];
    }

?>
<form action="toUpdateBook.php" method="post" >
    作者:<input type="text" name="author" value="<?php echo $author?>"><br>
标题:<input type="text" name="title" value="<?php  echo $title;?>"><br>
类型:<select name="bookType">
        <option value="--------请选择类型--------" disabled selected></option>
        <?php
            if ("文学类"==$bookType){
                echo '<option value="文学类" selected>文学类</option>
                      <option value="科普类">科普类</option>
                      <option value="教辅类">教辅类</option>';
            }
            if ("科普类"==$bookType){
                echo '<option value="文学类" >文学类</option>
                      <option value="科普类" selected>科普类</option>
                      <option value="教辅类">教辅类</option>';
            }if ("教辅类"==$bookType){
                echo '<option value="文学类" >文学类</option>
                      <option value="科普类">科普类</option>
                      <option value="教辅类" selected>教辅类</option>';
            }
        ?>

    </select><br>
内容:<textarea name="content"><?php echo $content?></textarea><br>
    <input type="submit" value="修改图书">
</form>

toUpdateBook.php,图书更新表单数据处理页面:

<?php
$author = $_POST['author'];
$title = $_POST['title'];
$bookType = $_POST['bookType'];
$content = $_POST['content'];

//1.启动session
session_start();
// 2.设定session
$_SESSION['author'] = $author;
$_SESSION['title'] = $title;
$_SESSION['bookType'] = $bookType;
$_SESSION['content'] = $content;
// 3.页面重定向到 showBook.php
// 使用header()函数进行重定向
header("location:showBook.php");

tip:每个需要session的地方都需要使用session_start();来开启

运行代码,启动服务:

依次抓包,查看session
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行过程中 的 sessionID PHPSESSID=e2l88u5bva8bhl6ikjeuti5pm1

**打开我们的session文件保存的位置,进行查看:

其底层存储方式为author|s:6:"张三";title|s:21:"杀死一只知更鸟";bookType|s:9:"文学类";content|s:2:"77";**

在这里插入图片描述


好啦,这篇笔记就到这里啦!!!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀死一只知更鸟debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值