php学习笔记-php会话控制及web常用的预定义变量-day07
- 1、$_REQUEST
- 2、$_SERVER
- 3、$_COOKIE
- 3.1 cookie的内容
- 3.2 cookie的分类
- 3.3 php中cookie的使用
- 3.4 cookie自动登录小demo
- 4、$SESSION
- 4.1 session的工作原理
- 4.2 session的使用
- 4.2.1 修改php.ini中的session配置
- 4.2.2 开启session
- 4.2.3 删除和销毁session
- 4.3 session 图书上传信息添加和修改例子
前几篇笔记中已经提到过 $_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";
**
好啦,这篇笔记就到这里啦!!!