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特点

  1. 文本文件,保存在客户端。

  2. 由服务端写入。

  3. 每次浏览器访问服务器,将 cookie 的发送给服务器。

  4. cookie 有有效期:可分为会话型和长效型。

  5. 每个网站都可以有自己的 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有效期:

  1. 修改 php.ini 中的默认值,session.gc_maxlifetime=1440

  2. 使用 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. sessioncookie 的比较

方面 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');
?>

 

以上内容转载自我老师的讲义,便以后知识点的复习。

posted @ 2019-12-30 14:31  淡定莫慌w  阅读(285)  评论(0编辑  收藏  举报