session操作
session详细使用
session的开启
session_start();
?
自动开启
session可以自动开启!在当前的脚本执行之前,就完成开启!
通过php的配置文件,修改即可!
?
注意,在session已经开启的情况下再开启,则会触发错误!
?
因此典型的开启session是如下的代码:
?
session_start()前的输出问题
session_start前也不应该有任何的输出,因为可能会使用到响应头信息(类似于header函数)
?
?
$_SESSION的使用
$_SESSION 变量只能是字符串下标数组,不支持数值下标数组!
?
没有session_start时是没有$_SESSION的。
但是语法上可以向一个普通数组一样处理,此时不会对_SESSION内的数据做保存!
?
删除session
删除某个session数据
unset($_SESSION[‘key‘]);
?
删除所有的session数据
注意,不能unset($_SESSION);
但是:
?
删除session的文件
session_destroy()
session_destroy()只删除文件,不处理$_SESSION变量!
因此$_SESSION是有值的!
但是,一旦执行了session_destroy(),则在脚本结束,不会在执行写操作!
?
如何完全删除一个session?
将于当前session相关的数据都删除掉。
$_SESSION: unset,或者$_SESSION=array()
session文件: session_destroy();
cookie中的sessionID: secookie(‘PHPSESSID‘, ‘‘, time()-1);
?
?
服务器端session数据的处理
处理服务器上所保存的session数据的文件
修改保存目录
?
默认的保存在系统临时目录下,windows/temp下:
?
可以通过修改 php的配置。session.save_path进行修改!
注意,php不能自动创建该目录:
?
?
分子目录保存session文件
每个session一个session文件,当请求变多时,session文件增多! 分子目录保存!
?
通过 修改 session.save_path完成!
在temp下,分1级子目录的形式保存:
应该放在t目录下:
使用 sessionid的相应字母完成判断放入到哪个目录!
也是不能自动创建子目录!需要手动创建需要的子目录!
究竟应该创建好多少个?由sessionid字符的可能性!
通过下面两个配置得到:
sessionid的形成算法来决定:
2^5可能性!
?
session数据入库
重写session的存储机制!
?
?
session面临的问题:
1量大!难管理
2服务器多,难共享!
?
将session数据,放置在数据库服务器上进行保存管理!(内存)
?
将session数据存入到数据库中!
?
分析:
需要的工作
提供可以操作数据的功能代码!(读,写,删除)
告知php,在需要的时候,调用我们所定义的代码!
?
增加六个session存储的处理函数(方法)
将以上六个方法设置到session处理的各个部分
利用系统函数,设置session存储所需要的处理器,为当前定义好的 这六个函数:
session_set_save_handler();
?
?
增加一个表保存session数据
保存在文件中变成保存到数据表中!
一个文件对应????一条记录
文件名????????????某个字段,sessionID
文件内容????????字段,当前session数据
完善六个函数,处理session数据
*读,read
在session_start()session执行!
?
?
*写,write
?
*销毁,destroy
在调用了 session_destroy()系统函数时,被自动调用!
负责的功能时,利用当前id,删除当前的session记录!
?
初始化,open
在session开启时执行,负责完成session存储所需要资源的初始化工作!
?
关闭,close
在整体session存储机制结束时,负责释放占用的资源!
?
?
垃圾回收,gc
如果一条记录(一个文件)在多久之内,没有被使用过了,则认为该数据是垃圾!
默认的时间,是1440s秒。24分钟!可以通过php的配置:
?
什么时候执行删除的动作?
在session_start()时,有一定的几率,执行垃圾回收!
默认是 1/1000 千分之一!
可以通过php修改:
?
需要增加一个字段,表示当前记录的最后修改时间
在,插入或者更新时,都要将时间设置成当前的时间戳!
修改写的方法,增加对该字段的处理:
?
此时,需要在垃圾回收函数内,判断哪些记录是否过期,删除!
?
?
?
?
?
session常用处理
session与cookie的区别与联系?
?
session 的 sessionID存在 cookie内!
?
session数据有效期?原因是什么?
浏览器关闭。
原因是保存在浏览器端的sessionid丢失!
默认的sessionID的cookie变量是临时的cookie变量!
?
如何持久化session?
?
持久化sessionID这个cookie变量!
?
使用函数:session_id函数得到当前的sessionID!
?
php还提供一个专门的修改sessionID的cookie变量的函数:
session_set_cookie_params();设置该cookie变量的选项的!
在表示有效期的第一个参数,是时间周期,而不是时间戳!
留意,应该在session-start()之前,就完成cookie选项的设置!
(类似于 session_set_save_handler一样)
?
此外还应该保证,服务器端垃圾判定的时间要与session持久化的时间尽量一致!
session.gc_maxlifetime = 3600;
?
留意,少用!
?
cookie禁用session是否可用?
session是基于cookie的,因此cookie禁用,session不应该可用!
?
如果非要用,也是可以的!
办法是:
url上传递sessionID!
?
此时,需要修改php的配置达到目的:
1,开启对url上传递的支持!将仅仅使用cookie传递sessionid关闭!
?
2,增加url上参数
?
此时php就在浏览器没有cookie使用的情况下,可以采用url进行sessionID的传递:
?
?
注意,php只会自动在html代码的a连接的地址上增加url的传递SessionID
php代码内的url不能自动增加!
?
tip:表单请求时,该参数如何传递!php会自动增加表单项隐藏域,name="PHPSESSID" 值为="session_ID()"
?
无限分类
商品分类!
?
无限分类,就是树状列表的展示!
?
利用 关系型数据库 与 php业务逻辑,实现一个树状分类列表的展示
?
树状列表
?
树:N个节点,与N-1条边,组成一种结构,要求,每一个节点都要有一条边指向另一个节点,除了根!
节点:
边:指明一个节点与另一个节点的之间关系!
?
根节点:
子节点:
父节点:
祖先节点(先辈节点):
后代节点:
兄弟节点:
叶子节点:
?
一个分类就是一个节点!
而分类之间的关系,就是一条边!
?
?
设计分类表
表:关系型!每个分类就是一条记录!
结果:树!每个分类就是一个节点!
?
如何利用关系型表,表示,树结构!
?
?
只要在分类上记录,其边(父类的标识)即可!
?
增加一个字段,保存其父分类的ID即可!
?
两部分:
分类自然信息!
分类的父ID!
?
先从 查询树状列表完成!
先插入模拟数据:
?
根节点的父分类ID为0。没有!
?
简单分类列表
控制器
新增一个后台的分类管理控制器类!
app/controller/back/CategoryController.class.php
增加一个列表动作:
并完成:
?
模型
增加分类表操作模型
并增加一个方法返回所有数据getList
app/model/CategoryModel.class.php
?
视图
展示分类
增加模板!
app/view/back/category_list.html
?
?
其他
增加一个菜单链接,点击请求到当前分类类表动作!
修改menu.html即可!
?
树状分类列表
?
按照级别缩进!
按照上下级关系,对数据排序!
?
排序
单纯按照某个字段排序!
而是应该按照级别关系进行排序!
?
利用 0 先找到顶级根节点。再利用该根节点找其子节点,当找到第一个子节点时,利用该子节点,再找下级节点!直到当前子节点上所有的后代节点都查找到,才会去执行下一个根节点的子节点!
?
如何实现:
典型的递归方式解决!
?
递归点,和递归出口:出口在,如果当前节点没有子节点,则不需要递归调用!
?
编程实现:
按照父分类id,查找子分类的过程!其中一直需要从所有的数据分类中查找!
?
一步:获得所有的分类!放入到数组列表!
二步:在该数组列表内,完成上面的递归查找!
?
确定分类的缩进级别
递归的运行图:
分析发现:
分类应该缩进的级别,与递归找到该分类的函数的调用深度是一致的!
?
?
因此,需要记录递归调用的深度!
?
递归调用一次,深度+1
利用一个参数即可!将参数的值,每次递归时,值被+1:
将深度赋值个当前函数确定的分类即可!
利用级别缩进:
字符串函数:
重复的结果:str_repeat(‘需要重复的字符串‘, 次数);
重复字符串!可将一个字符串重复多少次!
?
?
更新项目简单列表为树状列表
?
控制器
修改获得数据的调用的模型方法
app/controller/back/CategoryController.class.php
模型
增加一个getTreeList方法,获得排序和计算好深度的分类列表数据
app/model/CategoryModel.class.php
在来一个 getTree完成递归:
视图
增加缩进的展示
app/view/back/category_list.html
?
?
结果: