Web交互编程复习
一、PHP提供了很多预定义的超全局变量,用来获取HTTP请求信息
超全局变量 | 值 |
$_POST | 获取客户端以POST方式发送的HTTP请求信息。 |
$_GET | 获取客户端以GET方式发送的HTTP请求信息。 |
$_REQUEST | 包含了$_GET,$_POST和$_COOKIE数组中信息。 |
$_SERVER | 获取HTTP请求中的环境变量信息。 |
$_SESSION | 存储单个用户的信息。 |
$_COOKIE | 读取和写入客户端的Cookie信息。 |
$_FILE | 获取通过POST方式上传文件时的相关信息,为多维数组。 |
二、$_POST[ ]: 获取POST方式提交的表单数据
语法:$_POST[控件名称]
1. 登录实例
login.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>系统登录</title> </head> <body> <form action="check.php" method="post" name="frm" onsubmit="return check();"> <p> <input type="text" name="username" placeholder="用户名" > </p> <p> <input type="password" name="password" placeholder="密码"> </p> <p> <label> <input type="checkbox" name="save_username" >记住密码 </label> </p> <p> <input type="submit" value="登录"> </p> </form> <script> //前端数据验证 function check(){ var username=frm.username; if (username.value=='') { alert('用户名不能为空'); username.focus(); return false; } return true; } </script> </body> </html>
check.php
<?php header("Content-type: text/html; charset=utf-8"); $username=trim($_POST['username']); //服务器端验证 if (empty($username)) { echo '<script>alert("用户名必须输入");history.back()</script>'; exit(); } //防止xss攻击 $username=htmlspecialchars((strtolower($username))); $password=$_POST['password']; if ($username=='admin' && $password=='123') { echo '登录成功!'; }else{ echo '用户名或密码错误'; } ?>
2. 多值表单
city.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>多值表单</title> </head> <body> <form action="city.php" method="post"> 你去过的城市: <label> <input type="checkbox" name="city[]" value="bj">北京 </label> <label> <input type="checkbox" name="city[]" value="sh">上海 </label> <label> <input type="checkbox" name="city[]" value="gz">广州 </label> <label> <input type="checkbox" name="city[]" value="sz">深圳 </label> <input type="submit" value="提交"> </form> </body> </html>
city.php
<?php $city=$_POST['city']; // echo implode(',',$city); foreach ($city as $key => $value) { var_dump($value); } ?>
3. 在线考试
test1.php
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>试卷</title> </head> <body> <form action="test2.php" method="post"> <?php $x=mt_rand(0,9); $y=mt_rand(0,9); $z=$x+$y; $op=mt_rand(0,3); ?> <p> <?=$x?> + <?=$y?> = <?php for ($i=0; $i < 4; $i++) { ?> <label> <input type="radio" name="Q" value="<?=$z+$i-$op?>"><?=$z+$i-$op?> </label> <?php } ?> </p> <input type="hidden" name="answer" value="<?=$z?>"> <input type="submit" value="提交"> </form> </body> </html>
test2.php
<?php header('Content-type:text/html;charset=utf8'); // var_dump($_POST); $result=intval($_POST['Q']); $answer=intval($_POST['answer']); if ($result==$answer) { echo "回答正确"; }else{ echo "回答错误"; } ?>
三、$_GET[]
:获取GET方式提交的表单数据
url传递变量:http://网址?变量1=值1&变量2=值2…
语法:$_GET[变量名]
1.
搜索案例
:(客户端实现)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>$_GET</title> </head> <body> <form action="search.php" method="post" name="frmSearch"> <p> <input type="text" name="key" placeholder="搜索"> <input type="button" value="搜索" id="btn-search"> </p> <p> <label> <input type="radio" name="rdo" value="baidu">百度 </label> <label> <input type="radio" name="rdo" value="bing" checked>必应 </label> <label> <input type="radio" name="rdo" value="taobao">淘宝 </label> </p> </form> <script> var btn=document.getElementById('btn-search'); btn.onclick=function(){ key=frmSearch.key.value; if (key.length==0) { alert('请输入搜索的关键字'); return false; } var rdo=frmSearch.rdo.value; var url; switch(rdo){ case 'baidu': url='https://www.baidu.com/s?wd='+key; break; case 'bing': url='http://cn.bing.com/search?q='+key; break; default: url='https://world.taobao.com/search/search.htm?q='+key; break; } location.href=url; } </script> </body> </html>
搜索案例:(服务器端实现)
serach.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>$_GET</title> </head> <body> <form action="search.php" method="post"> <p> <input type="text" name="key" placeholder="搜索"> <input type="submit" value="搜索"> </p> <p> <label> <input type="radio" name="rdo" value="baidu">百度 </label> <label> <input type="radio" name="rdo" value="bing" checked>必应 </label> <label> <input type="radio" name="rdo" value="taobao">淘宝 </label> </p> </form> </body> </html>
search.php
<?php header('Content-type:text/html;charset=utf-8'); $rdo=$_POST['rdo']; $key=$_POST['key']; // var_dump($rdo); // exit(); if (empty($key)) { echo '<script>alert("搜索关键字不能为空");history.back();</script>'; exit(); } switch ($rdo) { case 'baidu': $url='https://www.baidu.com/s?wd='.$key; break; case 'bing': $url='http://cn.bing.com/search?q='.$key; break; default: $url='https://world.taobao.com/search/search.htm?q='.$key; break; } header('Location:'.$url); ?>
四、$_SERVER[]
:用于获取http请求的相关信息
常用的属性如下:
元素 |
描述 |
$_SERVER['PHP_SELF'] |
返回当前执行脚本的文件名。 |
$_SERVER['REQUEST_METHOD'] |
返回访问页面使用的请求方法(例如 POST )。 |
$_SERVER['PHP_SELF'] |
返回当前执行脚本的文件名。 |
$_SERVER['REMOTE_ADDR'] |
返回浏览当前页面的用户的 IP 地址。 |
$_SERVER['REMOTE_HOST'] |
返回浏览当前页面的用户的主机名。 |
$_SERVER['HTTP_USER_AGENT'] |
返回访问者浏览器信息。 |
$_SERVER['HTTP_COOKIE'] |
返回传递的cookie信息。 |
五、header()
函数
header()
函数用于设置服务器发送给客户端网页的头信息。
因为是设置头信息,所以header()
函数应该放在所有内容输出之前。
常用用法:
1. 重定向网页
<?php $url='http://web.3eol.com.cn'; header("Location:$url"); ?>
2. 延迟转向
<?php //3秒后,挑战到微博 header('refresh:3;url=http://weibo.com'); ?>
3. 设置网页字符集
header('Content-type:text/html;charset=utf-8;');
4. 强制下载文件
<?php $filename='test.gif'; header('Content-type:image/gif'); header('Content-Disposition:attachment; filename="'.$filename.'"'); header('Content-Length:'.filesize($filename)); ?>
六、HTTP 协议
http
协议是一种无状态协议。
无状态 是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时,它的应答就较快。
无状态性客户端与服务端连接通信运行速度快,服务器应答也快,因为无状态,协议对事务处理是没有记忆性的,是独立的。所以为了满足后面事务需要前面的事务有关信息,所以事务有关的信息要在协议外发送。
为了让无状态的http协议能够记住先前的状态,Web采用了 Cookie
和 session
的技术。
七、cookie
最早是网景公司的前雇员Lou Montulli在1993年3月的发明。Cookie
是当你浏览某网站时,服务器存储在你机器上的一个小文本文件,再次来到该网站时,网站通过读取 Cookie
,得知你的相关信息,就可以做出相应的动作。
1. cookie数据 传递
Cookie
是利用网页代码中的 HTTP
头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie
传递。
http request
:浏览器向服务器发起的每个请求都会带上cookie:Host: www.example.org Cookie: foo=value1;bar=value2 Accept: */*
服务器将Cookie
添加到网页的HTTP
头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑的Cookie
设置选择是否保存这些数据。
如果浏览器不允许Cookie
保存,则关掉浏览器后,这些数据就消失。
http response
:服务器给浏览器的返回可以设置cookie:HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Set-Cookie: name2=value2; Expires=Wed,09 June 2021 10:18:32 GMT (content of page)
2. 生命周期
Cookie
有一个Expires
(有效期)属性,这个属性决定了Cookie
的保存时间,服务器可以通过设定Expires
字段的数值,来改变Cookie
的保存时间。
如果不设置该属性,或设为0,那么Cookie
只在浏览网页期间有效,关闭浏览器,这些Cookie
自动消失。
3.cookie特点
-
文本文件,保存在客户端。
-
由服务端写入。
-
每次浏览器访问服务器,将
cookie
的发送给服务器。 -
cookie
有有效期:可分为会话型和长效型。 -
每个网站都可以有自己的
cookie
,但是每个网站只能读取自己的cookie 。
4. 应用场景
-
记录用户登录信息,简化登录。
-
记录用户行为,提供个性化服务。
在php 中,利用setcookie()
函数创建和修改cookie
,以及设置cookie
的有效期;而使用$_COOKIE[]
数组可以读取cookie变量的值。
5. 创建 cookie
语法:
setcookie(name, value, expire, path, domain,secure,httponly);
setcookie()
函数必须位于 <html> 标签之前,cookie变量的值总是字符串型。
<?php setcookie('username','admin'); //会话型cookie,浏览器关闭即删除 setcookie('username','admin',time()+60);//长效型cookie,有效期为60秒 setcookie('username','admin',time()+24*60*60);//长效型cookie,有效期为1天 ?>
6. 修改 cookie
修改cookie
方法仍然是采用setcookie
,注意要带上有效时间,否则cookie
将变成会话型cookie。
<?php setcookie('username','teacher',7*24*3600);//将username的值改为teacher,并且有效期更新为1个月 ?>
7. 删除 cookie
没有直接删除cookie
的方法,要删除一个cookie
,就是将该cookie
的有效期设置为过期。
<?php // set the expiration date to one hour ago setcookie("user", "", time()-3600); ?>
8. 读取 cookie
PHP 的 $_COOKIE
变量用于取回 cookie
的值。
<?php foreach ($_COOKIE as $key => $value) { var_dump($value); }
9. 实例1:访问记录
<?php header('content-type:text/html;charset=utf-8'); if (!isset($_COOKIE['login']['count'])) { echo '欢迎您第一次访问本网站<br>'; setcookie('login[count]',1,time()+24*3600); setcookie('login[time]',strval(time()),time()+24*3600); }else{ $log_count=intval($_COOKIE['login']['count']); $log_count++; $log_time=intval($_COOKIE['login']['time']); echo "欢迎你第" . $log_count . '次访问本网站<br>'; echo '上次访问的时间是:' . date('Y-m-d H:i:s' ,$log_time); setcookie('login[count]',strval($log_count),time()+24*3600); setcookie('login[time]',strval(time()),time()+24*3600); } ?>
10. 实例2:自动登录
login.php
<?php if ($_COOKIE['auto']!='') { header('Location:index.php'); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>系统登录</title> </head> <body> <form action="check.php" method="post" name="frm" onsubmit="return check();"> <p> <input type="text" name="username" placeholder="用户名" > </p> <p> <input type="password" name="password" placeholder="密码"> </p> <p> <label> <input type="checkbox" name="auto_login" value="1">十天内免登录 </label> </p> <p> <input type="submit" value="登录"> </p> </form> </body> </html>
check.php
<?php header("Content-type: text/html; charset=utf-8"); $username=trim($_POST['username']); $username=htmlspecialchars((strtolower($username))); $password=$_POST['password']; if ($username=='admin' && $password=='123') { if ($_POST['auto_login']=='1') { setcookie('auto',$username,10*24*3600); } header('Location:index.php'); }else{ echo '用户名或密码错误'; } ?>
八、session
Session
用于存储用户的信息。存储于 Session
中的变量持有单一用户的信息,并且对于一个应用程序中的所有页面都是可用的,用 session_id
来标识每一个会话。
1. 为什么要使用 Session
HTTP
协议是一种无状态(stateless)的协议,每一次请求之间都是独立的,利用HTTP
协议无法跟踪用户,无法记录访问行为。
session
的创建和使用过程:![](https://img2018.cnblogs.com/common/1618284/201912/1618284-20191230120538245-325299657.jpg)
session
会话时,session_id
会分别保存在客户端和服务端两个位置,对于客户端使用临时的 cookie
保存(Cookie
名称为PHPSESSID
)或者通过URL字符串传递,服务端也以文本文件形式保存在指定的Session目录中。
session
通过ID接受每一个访问请求,从而识别当前用户、跟踪和保存用户具体资料,以及 session
变量(在session
活动期间,可在 session
中存储数字或文字资料),比如 session_name
等等,这些变量信息保存在服务端。
每个会话都有一个独立的 session
对象,该 session
对象含有一个session ID来标识它,还包含0个到多个独立的 session
变量。
2. 开始 PHP session
在存取 PHP session
中之前,首先必须启动会话。
session_start()
函数必须位于 <html> 标签之前:
<?php session_start(); ?> <html> <body> </body> </html>
上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
3. 存取 session 变量
存储和取回 session
变量的正确方法是使用 PHP $_SESSION
变量:
<?php session_start(); // store session data $_SESSION['views']=1; ?> <html> <body> <?php //retrieve session data echo "Pageviews=". $_SESSION['views']; ?> </body> </html>
4.session 有效期
session
的默认有效期为24分钟(1440秒)。
修改session有效期:
-
修改
php.ini
中的默认值,session.gc_maxlifetime=1440。
-
使用
ini_set()
方法修改session有效期。
<?php session_start(); ini_set('sesson.gc_maxlifetime',60); //保存1分钟 setcookie(session_name(),session_id(),time()+60,"/"); ?>
5. 删除和销毁 session
如果您希望删除某些 session
数据,可以使用 unset()
或 session_destroy()
函数。
unset()
函数可以删除指定的 session
变量,使用session_unset()
函数可删除当前内存中的 $_SESSION
数组中的所有元素。
<?php session_start(); unset($_SESSION['username']);//删除$_SESSION中的一个session变量 session_unset(); //删除$_SESSION中所有的session变量 ?>
但 session_unset
只能删除 $_SESSION
中的所有元素,并不能删除对应的SessionID,也不能删除保存SessionID的文件。而session_destroy()
函数能删除 SessionID,并销毁Session文件,但他不会删除内存中的 $_SESSION
数组中的所有元素。
因此,如果要彻底删除Session,实现用户的安全注销功能,可以将 session_unset()
与session_destroy()
函数结合使用。
<?php session_start(); session_unset(); session_destroy(); ?>
6. session 与 cookie 的比较
方面 | session | cookie |
功能 | 存储和跟踪特定用户的信息。 | 同。 |
优势 | 在整个网站的所有页面都可以访问。 | 同。 |
建立方式 | 每次访问网页时会自动建立session对象。 | 需要代码建立。 |
存储位置 | 服务器端。 | 客户端。 |
应用场合 | 记住正在访问的用户信息。 | 记住曾经访问过的用户信息。 |
优缺点 | session需要cookie的支持。 |
cookie大小有限制:文件大小不超过4k,每个 站点最多20个,且会泄露用户隐私,不够安全。 |
7. 实例1:session计数器,可以观察不同会话session的变化
<?php session_start(); echo session_id().'<br>'; if(isset($_SESSION['views'])){ $views=intval($_SESSION['views']) $_SESSION['views']=strval($views+1); }else{ $_SESSION['views']=1; } echo "Views=". $_SESSION['views']; ?>
8. 实例2:防跳墙
<?php session_start(); if(!isset($_SESSION['username'])){ echo '<script>alert("登录超时");location.href="login.html";</script>'; } ?>
9. 实例3:购物商城
登录页(login.html)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>系统登录</title> </head> <body> <form action="check.php" method="post" name="frm" onsubmit="return check();"> <p> <input type="text" name="username" placeholder="用户名" > </p> <p> <input type="text" name="password" placeholder="密码"> </p> <p> <label> <input type="checkbox" name="save_username" >记住密码 </label> </p> <p> <input type="submit" value="登录"> </p> </form> </body> </html>
登录验证页(check.php)
<?php session_start(); header("Content-type: text/html; charset=utf-8"); $username=trim($_POST['username']); //防止xss攻击 $username=htmlspecialchars((strtolower($username))); $password=$_POST['password']; if ($username=='admin' && $password=='123') { // echo '登录成功!'; $_SESSION['username']=$username; header('Location:index.php'); }else{ echo '用户名或密码错误'; } ?>
商城首页(index.php)
<?php session_start(); if (!isset($_SESSION['username'])) { header('Location:login.html'); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>商城首页</title> </head> <body> <h3>商品分类</h3> <ul> <li><a href="book.php">图书</a></li> <li><a href="toy.php">玩具</a></li> </ul> <ul> <li><a href="show_car.php">查看购物车</a></li> <li><a href="log_out.php">退出</a></li> </ul> </body> </html>
图书列表页(book.php)
<?php session_start(); if (!isset($_SESSION['username'])) { header('Location:login.html'); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图书</title> </head> <body> <h3>图书</h3> <form action="add_car.php" method="post"> <ul> <li> <label> <input type="checkbox" name="goods[]" value="C">C语言从入门到放弃 </label> </li> <li> <label> <input type="checkbox" name="goods[]" value="Andriod">Andriod从入门到改行 </label> </li> <li> <label> <input type="checkbox" name="goods[]" value="Cplus">C++从入门到崩溃 </label> </li> <li> <label> <input type="checkbox" name="goods[]" value="bigdata">大数据从被忽悠到会忽悠 </label> </li> </ul> <button type="submit">加入购物车</button> </form> </body> </html>
玩具列表页(joy.php)
<?php session_start(); if (!isset($_SESSION['username'])) { header('Location:login.html'); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图书</title> </head> <body> <h3>图书</h3> <form action="add_car.php" method="post"> <ul> <li> <label> <input type="checkbox" name="goods[]" value="ball">球 </label> </li> <li> <label> <input type="checkbox" name="goods[]" value="bear">小熊 </label> </li> <li> <label> <input type="checkbox" name="goods[]" value="minicar">小汽车 </label> </li> <li> <label> <input type="checkbox" name="goods[]" value="watergun">水枪 </label> </li> </ul> <button type="submit">加入购物车</button> </form> </body> </html>
加入购物车(add_car.php)
<?php session_start(); if (!isset($_SESSION['username'])) { header('Location:login.html'); } header('Content-type:text/html;charset=utf-8'); $car=$_POST['goods']; // unset($_SESSION['car']); var_dump($car); if (isset($_SESSION['car'])) { foreach ( $_SESSION['car'] as $key => $value) { $good_name=$value['good_name']; // var_dump($good_name); $index=array_search($good_name,$car); // var_dump($index); if ($index!==false) { $_SESSION['car'][$key]['count']++; unset($car[$index]); } } } foreach ($car as $key => $value) { $good=array( 'good_name'=>$value, 'count'=>1, ); $_SESSION['car'][]=$good; } var_dump($_SESSION['car']); // unset($_SESSION['car']); ?>
查看购物车(show_car.php)
<?php session_start();?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>查看购物车</title> </head> <body> <table> <thead> <tr> <th>商品</th> <th>数量</th> <th>操作</th> </tr> </thead> <tbody> <?php // var_dump($_SESSION['car']); if (isset($_SESSION['car'])) { foreach ($_SESSION['car'] as $key => $value) { ?> <tr> <td><?php echo $value['good_name'];?></td> <td><?php echo $value['count']; ?></td> <td><a href="del_car.php?good_name=<?php echo $value['good_name']; ?>">删除</a></td> </tr> <?php } }else{ echo '购物车无商品'; } ?> </tbody> </table> <a href="clear_car.php">清空购物车</a> </body> </html>
删除购物车(del_car.php)
<?php session_start(); if (!isset($_SESSION['username'])) { header('Location:login.html'); } var_dump($_SESSION['car']); $good_name=$_GET['good_name']; if (isset($_SESSION['car'])) { foreach ($_SESSION['car'] as $key => $value) { if ($value['good_name']==$good_name) { unset($_SESSION['car'][$key]); } } } header('Location:show_car.php'); ?>
清空购物车(clear_car.php)
<?php session_start(); if (!isset($_SESSION['username'])) { header('Location:login.html'); } unset($_SESSION['car']); header('Location:index.php'); ?>
注销(logout.php)
<?php session_start(); session_unset(); session_destroy(); header('Location:login.html'); ?>
以上内容转载自我老师的讲义,便以后知识点的复习。