由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。
Session 是存储在服务器端的,远程用户没办法修改 Session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。
使用session页面登录入口
新建一个简单的登录页面:
<form action="loginchuli.php" method="post"> <div>用户名:<input type="text" name="uid" /></div> <div>密码:<input type="password" name="pwd" /></div> <input type="submit" value="登录" /> </form>
新建一个类文件来访问数据库:
<?php class DBDA { public $host="localhost"; public $uid = "root"; public $pwd = ""; public $dbname = "12345"; //成员方法 public function Query($sql,$type=1) { $db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname); $r = $db->query($sql); if($type==1) { return $r->fetch_all(); } else { return $r; } } }
同目录下新建 loginchuli.php:
<?phpd session_start(); //启动 Session 会话,并创建一个 $uid 变量: include("../fengzhuang/DBDA.class.php"); $db = new DBDA(); $uid = $_POST["uid"]; $pwd = $_POST["pwd"]; $sql = "select pwd from users where uid='{$uid}'"; $attr = $db->Query($sql); $mm = $attr[0][0]; if(!empty($pwd) && $pwd==$mm) { $_SESSION["uid"] = $uid; header("location:main.php"); } else { echo "登录失败!"; }
登录之后的主界面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <?php session_start(); //echo $_SESSION["uid"]; if(empty($_SESSION["uid"])) //防止用户跳过登录入口通过网页链接直接进入 { header("location:login.php"); exit; } $uid = $_SESSION["uid"]; include("../fengzhuang/DBDA.class.php"); $db = new DBDA(); $sql = "select name from users where uid='{$uid}'"; $attr = $db->Query($sql); ?> <body> <?php echo "<h1>欢迎登录:{$attr[0][0]}</h1>"; ?> </body> </html>
用户只有登录成功后才可进入主界面,并且不能跳过登录口直接进入。
session实现的购物车效果:
可以通过session 设置中间变量
首先新建产品列表:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <table width="100%" border="1" cellpadding="0" cellspacing="0"> <tr> <td>名称</td> <td>价格</td> <td>产地</td> <td>库存</td> <td>操作</td> </tr> <?php include("../fengzhuang/DBDA.class.php"); $db = new DBDA(); $sql = "select * from fruit"; $attr = $db->Query($sql); foreach($attr as $v) { echo "<tr> <td>{$v[1]}</td> <td>{$v[2]}</td> <td>{$v[3]}</td> <td>{$v[4]}</td> <td><a href='jia.php?code={$v[0]}'>加购物车</a></td> </tr>"; } ?> </table> </body> </html>
结果:
判断有三种情况:
1.如果是第一次点击加购物车,做一个二维数组扔到SESSION里
2.如果不是第一次点击加购物车并且该水果第一次点击,做一个该水果的一维数组扔到SESSION的二维数组里面
3.如果不是第一次点击加购物车并且该水果不是第一次点击,将SESSION数组里面该水果的数量加1
规定路径下新建jia.php
<?php session_start(); //将传过来的水果加到购物车 $code = $_GET["code"]; if(empty($_SESSION["gwc"])) //判断是否传入数据 { //1.如果是第一次点击加购物车,做一个二维数组扔到SESSION里 $attr = array( array($code,1) ); $_SESSION["gwc"] = $attr; } else { //判断该水果代号是否在SESSION数组里面出现 $attr = $_SESSION["gwc"]; if(PanDuan($code,$attr)) { //3.如果不是第一次点击加购物车并且该水果不是第一次点击,将SESSION数组里面该水果的数量加1 for($i=0;$i<count($attr);$i++) { if($code == $attr[$i][0]) { $attr[$i][1]++; } } $_SESSION["gwc"]=$attr; } else { //2.如果不是第一次点击加购物车并且该水果第一次点击,做一个该水果的一维数组扔到SESSION的二维数组里面 $arr = array($code,1); $attr[] = $arr; $_SESSION["gwc"]=$attr; } } var_dump($_SESSION["gwc"]); //判断v是不是在arr里面出现 function PanDuan($v,$arr) { $n = 0; foreach($arr as $a) { if($v == $a[0]) { $n++; } } if($n==0) { return false; } else { return true; } }
点击苹果:
有一个一维数组被扔到session 传导的二维数组里面
返回产品列表
再次点击苹果:
数量增加了1.
返回点击菠萝:
有新的一维数组被传入。
自此通过 session 将购物车的信息传入 session中,每个网页都可访问到。
退出及清理:
unset()不可以一次注销整个数组,这样会禁止整个会话功能 ,
<?php unset($_SESSION['views']); //删除单个session ?>
<?php session_register(); $_SESSION["admin"]="aa"; $_SESSION['name']="叶凌月"; $_SESSION['age']=16; echo "<pre>"; print_r($_SESSION); echo "</pre>"; //删除多个会话,把一个空数组给$_SESSION,把之前的值覆盖了,这样并不是将$_SESSION销毁 ,还可以重新赋值 $_SESSION=array(); echo "<pre>"; print_r($_SESSION); echo "</pre>"; ?>
结束当前的会话:
<?php Session_start(); //销毁全部session //... session_destroy(); ?>