页面跳转
header(‘Location: url‘);
优势:在于立即跳转!
劣势:没有办法在跳转前给出提示!
?
header功能是,发送响应头信息!相应头信息,是相应信息的一部分!通知浏览器应该做哪些事情的部分!但是要求,相应头信息,要先于响应主体(相应信息的其他部分)先被发送到浏览器!
因此,无论如何也是看不到echo的提示:
甚至,上面的代码会出现语法错误!
默认在于php有个叫:输出缓冲功能,会默认缓存所有的主体输出!
?
因此,编程上建议在使用header函数时,前面不应该有任何的输出!包含html输出和phpecho输出!
?
location.href=‘url‘,javascript
提示是,样式不易控!(可以用弹出层)
?
但是,js的支持,需要浏览器支持才可以!
?
meta:Refresh
refresh 是刷新的意思,可以提供一个秒数,刷新的间隔!
同时,支持设置刷新的目标url !
?
有需要当前页面执行结束后才会刷新,因此容易给出提示,包括提示的样式!
?
因此项目中典型的提示跳转都由 refresh完成!
?
?
项目中的跳转实现
?
基础控制器
跳转功能典型的是一个项目流程控制,应该属于Controller控制器!
所有的控制器都可能使用到跳转方法!
问:应该写在哪里?
答:一个控制器公共的地方!
?
参考模型的模式:
增加一个基类控制器,将所有控制器公共操作都放在其中,所有的实例控制器都继承自公共基础控制器类:
?
framework/Controller.class.php
?
控制器继承自,基础控制器:
?
同时,完善 自动加载方法,可以达到自动载入基础控制器类的目的:
index.php:
完善跳转方法,jump()
framework/Controller.class.php
jump()
?
?
?
格外注意:
跳转的代码执行结束后,脚本是没有停止的!
因此,跳转的代码后边强制脚本停止!
?
?
?
?
项目公共类
用于完成成项目的整体初始化工作!
原本在index.php入口文件,完成的工作,放入到一个项目的框架公共类中!
?
在 框架目录增加一个类文件:
Framework.class.php
index.php内的每个功能映射 一个Framework类中的某个方法!
?
为了练习静态成员!
framework类中所有的方法定义成静态的!
?
?
一个总的方法,去调用上面的各个方法:
?
入口文件,直接调用run即可完成项目的运行:
index.php
?
?
自动加载方法的处理
?
将自动加载的函数,也变成Framework类的一个方法:
此时的问题是php不知道调用该方法,只会调用__autoload的函数,但是没有!
应该告知 php,在需要自动加载时,调用我们定义的方法!
注册自动加载方法
利用 系统函数:
spl_autoload_registser()
?
如果需要注册的是一个函数:直接提供函数名即可
?
如果是方法的话:需要给出类或者对象(是否是静态) 和 方法名!
此时需要一个数组,使用两个元素,分别表示
array(类名或对象,方法名);
?
在初始化项目是,也需要注册自动加载方法:
?
?
配置文件系统
- 增加一个文件,保存配置信息
- 项目运行时,将配置文件载入,就可以使用配置信息!
?
增加配置文件
在app目录增加一个config子目录,用于管理配置文件:
在配置文件目录,增加一个app.config.php文件,管理相应的配置文件信息
?
设计配置数据的格式:
将配置分组:
最终是一个二维数组!
?
注意,增加return
用于,在载入该文件时可以返回内部的数据!
?
?
载入配置文件
增加一个框架级别的基础操作,载入配置信息!
在framework/Framework.class.php
增一个方法,在run方法中执行即可!
注意:1需要使用一个路径常量,管理配置文件目录!2,需要一个数据变量接收配置数据
考虑获得数据的变量:
保证保存配置信息的变量的全局性!使用$GLOBALS
?
使用配置信息
在基础模型实例化MysQLDB类时需要使用
framework/Model.class.php
?
?
增加后台首页
后台整体首页
控制器
增加一个后台的首页模块控制器
app/controller/back/IndexController.class.php
indexAction()
展示后台模板即可!
是一个框架集frameset布局!
?
?
模型
暂时不需要模型
?
视图
增加一个后台首页模板
app/view/back/index.html
?
注意,此时是一个框架集布局:
结构如下:
上
下(左中右)
?
其他
在登录验证用户合法后,跳转到后台首页!
app/controller/back/AdminController.class.php
signinAction();
各个部分
除了后台整体页面之外,还需要
top:
menu,
drag
main
以上四个功能才能形成一个完整的后台首页
?
问题,如何处理以上四个功能?
每个功能都应该是一个项目的完整的功能,应该mvc三部分组成!
因此,所有的请求地址:都应该是请求当前项目的一个控制器动作才可以!
?
后台首页主体模板:
app/view/ back/index.html
?
?
需要项目中的4个动作完成:
app/controller/back/IndexController.class.php
?
完善以上四个动作:
载入不同的模板即可!
提供四个模板:
app/view/back/下:
?
?
?
?
后台的登陆验证
?
判断是否经登陆,!
?
问:这个判断条件(依据)从哪里来?
答:应该登陆成功后,为浏览器用户设置登陆凭证,在请求后台首页时进行判断!
?
问:使用什么来作为登陆凭证?
答:
变量可否?不行,已经消失!找一个不会消失的!
url传递是否可以?不行,凭证可以轻易仿照!找一个可以向向下传递,并且不能被轻易模拟的!
数据不向下次请求传递,就获得不了!
服务器本身是不存在在多次请求间传递的数据。抛出数据库,文件中的持久数据!
文件可否?不行,数据永远存在,对所有的浏览器都好用!
?
因此总结:
既能够在多次请求间向下传递,还要区分浏览器,最好不能被(用户看到)轻易模拟!
由于web服务器都是基于http协议,http协议是无状态的,导致任何请求之间没有任何关系间可言。导致php所有资源在脚本结束都消失!
?
解决该问题的本质方法,需要浏览器参与!
?
此时,可以使用 浏览器上的cookie技术!
?
cookie技术
浏览器的技术,可以在浏览器上保存数据的一门技术!cookie就是指的是浏览器上保存的数据!
PHP支持cookie技术!php可以向浏览器发出指令,从而将数据保存到浏览器上!
?
浏览器负责保存数据,而php负责控制浏览器保存那些数据!
(php在是使用浏览器上cookie技术)
?
?
保存在浏览器上的cookie数据,可以在浏览器每次项服务器请求时,都可以携带该数据,向服务器发出请求,此时服务器上的脚本就可以获得该数据!
?
基本使用
设置cookie变量,增,改,删
利用内部函数 setcookie完成
setcookie(名字,值)
取得cookie变量,读
使用预定义数组变量:$_COOKIE
该变量内保存所有从浏览器请求时所携带的cookie数据!
每个元素就是一个cookie变量数据!下标是名字,值,就是值!
?
?
基本原理
利用firebug的网络选项卡:
设置时,做了什么?
在响应时,服务器发送了一条指令,在浏览器上增加一个cookie变量!
浏览器接到该指令后,在浏览器上增加了一个cookie数据!
?
?
获取时,做了什么?
浏览器会将当前站点的所有的cookie在请求时都携带到服务器上!
php会自动获得到浏览器携带的cookie,形成$_COOKIE数组,用户脚本使用!
?
?
高级使用
- cookie数据只能是字符串数据!
?
- setcookie函数,可以完成增,修改,删除!
不存在,则增加,存在则修改!
删除,可以采用将值,置空的形式!
?
- cookie变量的失效期
cookie数据存在有效期的概念:
默认,临时cookie。会保存到浏览器关闭!
同时,支持,增加setcookie的第三个参数,来修改cookie变量的有效期。有效期的表示方式,是一个时间戳,表示到哪个时间点,失效!
php可以通过 time()函数,获得当前的时间戳,time()增加增量的形式延长cookie时间!
此时,服务器会向浏览器发出如下指令:
网络上表示时间,都是用 格林威治平时!没有时区概念的那个时间!GMT
浏览器知道cookie变量的有效期!
?
常用的操作:
?
- cookie存在有效路径的概念
cookie变量是只在当前目录,及其后代目录才会生效!
?
test/下设置
test/sub/下可以访问
反过来:
?
那是由于该cookie:
?
可以更改cookie数据的有效路径:
通过setcookie的第四个参数做修改:
/表示站点根目录有效!整站有效!
?
?
5,cookie子域名的概念
cookie是严格区分域名的。
?
支持在子域名之间是可以共享的:
利用第五个参数设置
?
?
有效期,有效路径,有效子域名!
6,$_COOKIE是捕获不了当前脚本所设置的cookie变量的!
?
$_COOKIE是,浏览器请求时所携带的所有cookie!
当前设置的在下次使用请求才好用!
?
session技术,会话技术
场景:
cookie的问题
由于是数据本身是在浏览器端:
数据的安全性问题!
数据总要在请求时携带!
?
怎么解决,注意保持在浏览器的多次请求间共享数据!
?
将数据放在服务器端,同时是数据区分浏览器,在浏览器的多次请求间共享数据!
?
在服务器上,为来访的每台浏览器增加一个数据空间,然后为这些数据空间分配不同唯一的标识!为每个浏览器分配一个唯一的标识,该标志应该服务器端数据库空间的标识应该一一对应
要求,浏览器每次请求时携带标识,此时服务器可以获得标识,利用标识确定数据空间,但却请求的所有的数据处理,都在当前的确定的空间内完成!
?
将服务器分配给浏览器的唯一标识存在浏览器的cookie内,可以保证浏览器每次来时都携带!
服务器为每一个新浏览器访问(没有确定标识的浏览器),确定 标识,和在服务器上生成一个唯一的数据空间!
?
?
基本使用
直接操作$_SESSION数组,就可以完成session数据的存,取!
每个session数据,就对应$_SESSION内的一个元素!对元素操作,就是对session数据做操作!
?
但是,session技术,包括生产session标识,开辟session数据空间,为浏览器分配session标识等等,都需要PHP的session机制支持!
因此,需要先开启session的支持,才能操作$_SESSION变量,从而去操作session数据!
?
开启:
session_start();
?
操作:
$_SESSION;
?
先开启后操作:
?
更新和删除:
?
?
基本原理
?
浏览器端cookie中保存的sessionID:
?
当前浏览器第一次对服务器发出请求时,服务器不能确定浏览器的标识
会重新生成一个唯一标识,以cookie的形式保存到浏览器端!
其中默认的cookie变量名为:PHPSESSID。
该cookie标量,也被称之为 sessionID!
?
当浏览器拥有了sessionid这个cookie变量后,接下来的请求都会携带该ID发出请求:
?
服务器的端的是session数据空间
默认情况下,php,会将保存session数据的空间,生成一个文件来完成!通过文件的名称来区分属于哪个ID的!
默认的被保存在服务器操作系统的临时目录内:
?
?
大概的流程:
?
?
?
测试:
使用session来完成登陆标识验证:
?