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的创建和使用过程:
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');
?>
以上内容转载自我老师的讲义,便以后知识点的复习。
浙公网安备 33010602011771号