欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

从零开始之ecshop基础篇(19)

程序员文章站 2024-02-11 08:43:46
...

(为入口文件减负,将入口文件实现的功能,挪到框架的基础类中)

在框架目录增加Framework.class.php

计划:将需要初始化的公共功能,分模块,形成框架基础类的各个方法,分别调用执行,则可以完成项目的初始化功能。

使用静态的方法类完成:(看成功能的集合,而不是图纸设计对象;练习静态使用)

注意,对魔术常量的处理

dirname()函数可以取得一个地址中的路径部分

2
3
'

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 初始化路径常量
 */      }

 

注意:将保存请求参数的变量,让在所有地方都可以被访问到。

2
3
4
5
6
7
8
9
10
11
12
13
14
            }

注意:需要将保存配置信息的数组,全局化。

2
3
4
5
6
7
8
9
/**
 * 初始化配置文件
 */      }

因此,使用时,应该找到全局的config变量:

在初始化默认平台时:

2
define(

 

2
3
4
5
6
7
8
9
10
11
12
13
14
        $action_name();

 

此时自动加载功能:

有函数的实现专程了 类静态方法的实现

但是,PHP只认识一个叫__autoload()的函数,也就是php不能找到这个函数了。

处理方法:

告知php,在你需要找自动加载函数时,找我们定义的自动加载方法即可。

将一个普通函数(或者方法),注册成自动加载功能函数

利用一个php函数:spl_autoload_register();将普通函数(方法)注册成自动加载

参数,需要注册的函数或者方法

参数函数:函数名即可,使用一个字符串即可

参数方法:类(对象)和方法名。使用一个数组,第一个元素类名,第二个元素方法名

spl_autoload_register(array('Framework','userAutoload));

2
3
4
5
6
7
 * 注册自动加载方法
 */     spl_autoload_register( }

注意:自动加载的方法应该是公共的。

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 * 注册自动加载方法
 */     spl_autoload_register( }
 
   * 自动加载方法
  */               FRAME_PATH .          FRAME_PATH .          FRAME_PATH .     );            } 
                }   
                }
  }

在入口文件,加载Framework.class.php框架基础类,运行run()程序运转

index.php

2
3
4
5
6

判断管理员登陆状态

是否登陆标识(状态)

 

应该如何保存登陆标识?

保存登陆标识的数据特征:

总结:需要一个在同一个浏览器的多次请求间可以将数据传递(共享)处理方案。

难点就在于,php程序(凡事b/s,基于http协议),所有资源的最大生命周期就是脚本周期。

在浏览器上记录数据,最核心的解决方案。

cookie,session,会话技术。

 

 

setcookie()即可完成

setcookie('名字','值')

application/controller/back/AdminController.class.php

indexAction();

 

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    session_start();
                    $result = $model_admin->checkByCookie();
                            }             jump(        }
    }
    }

 

setcookie(名,值,有效期,有效目录,有效域名)

setcookie第二个,只能字符串

setcookie('name',array('itcast','php'))

2
3
4
$arr = setcookie(setcookie(

此时,在获取该变量时:

$_COOKIE['info']就变成一个有2个元素的数组

$_POST['info'] = array()

默认,浏览器关闭,也称临时cookie

利用setcookie的第三个参数,则可以被配置:使用一个时间戳,来表示有效期

time()获得当前的时间戳。做加减,得到其他时间的时间戳。

典型的设置方法

2
3
4
5
6

 

 

2
3
4
5
'//但是,浏览器端的还是itcast

cookie是保存浏览器端,php通过发出命令,才能在浏览器上保存数据。

浏览器上的cookie

利用firebug上网络面板,监控浏览器发出的请求与接到的响应:

在响应数据内,应该将数据发送的浏览器端,告知浏览器保存该cookie变量:

服务器,利用响应数据的一部分(响应头),将设置的cookie的信息,发送到浏览器:

在浏览器发送的请求数据中将浏览器认为有效的cookie携带到服务器端。

此时,服务器接收的该请求,发现存在cookie数据,利用这个数据,形成$_COOKIE数组,供用户脚本使用

 

 

session与cookie,所解决的问题是相同的。

得到可以在同一个浏览器的多次请求,将数据传递一个方法。

cookie劣势:

数据直接存储在浏览器端,两个显著的问题:

方案:

在服务器上,保存数据。

如何保证数据可以在浏览器的多次请求间传递,并且区分浏览器。

在服务器端,为每个来访的浏览器端,都建一个独立的数据空间。为每个数据空间分配一个唯一的标识,让浏览器保存这个唯一的标识。浏览器每次请求时,携带标识过来,利用标识确定唯一的数据空间

总结:

session技术:将会话数据保存在服务器端,是浏览器端保存存储数据空间标识,浏览器请求时携带标识,服务器负责利用标识,在相应的存储空间内做数据处理。

 

session_start()可以开启

利用预定义变量$_SESSION变量进行操作。增,删,改,查都在$_SESSION上完成。

2
3
4
5
6
7
8

Tips;session技术时基于cookie技术,需要在cookie保存标识

在开启session时,服务器会为浏览器分配一个保存sessionID(session的标识)的cookie变量,保存到浏览器端。

Tips:是一个整站有效的cookie变量

在浏览器的接下来的请求中,都是携带该cookie变量,sessionID到服务器端:

 

默认的:php以文件的形式,保存每个独立的数据空间的。被保存在,服务器端系统的临时目录内。

文件名,以当前的sessionID命名,保证空间唯一性。

可见,保存的时候是学历恶化的结果。

两个基本步骤:

 

 

只有$_SESSION的元素下表才能是数值型的。

2

 

unset($_SESSION['key']);删除$_SESSION内的一个元素

如果删除所有的session数据呢?

$_SESSION = array();

不对的:unset($_SESSION);,不会导致session数据丢失,php内部的session机制,还可以找到已经存在的处理好的session数据,将其写到session数据空间内。

删除session相关的存储文件

session_destroy()函数可以完成

2

但是,删除文件,$_SESSION数组内的数据还在:

但是,在执行session_destroy()后,脚本周期后的写操作,则不执行。

 

如何完全删除一个session的全部数据?

文件,$_SESSION,cookie内的sessionID变量

session_destory();

$_SESSION = array();

setcookie('PHPSESSID','',time() - 1);

 

典型的通过执行session_start()完成

支持,在配置文件中,自动开启

但是,session如果重复开启,则会报告一个错误:

典型的将错误屏蔽了即可

 

 

可以被配置:

session.save_handler php使用的session数据的处理的方式

可以改成user,表示用户自定义

session.save_path

 

 

存储位置不同

敏感度低,需要永久保存的数据,存到cookie内(用户体验)

安全性高,会话周期内存在的数据,保存到session内(数据合法性,合理性,完整性)

session可以保存各种数据类型

 

典型的将登陆验证标识,保存到session中:

application/controller/back/AdminController.class.php

2
3
4
5
6
7
8
9
10
11
12
            jump(    jump(}

 

application/controller/back/IndexController.class.php

2
3
4
5
6
7
8
            jump(        
    }   
}

 

 

记录登陆状态

在登陆成功后,判断是否选择了保存登陆信息:

application/controller/back/AdminController.class.php

signinAction()

2
3
4
    

记录什么格式:

保密,可以被验证

不能保存,后台登陆的信息

至少要成对,可以被验证

设计成:

admin_id

处理过的密码(在md5的基础上,再加密处理)

2
3
4
5
        setcookie(}

application/controller/back/IndexController.class.php

indexAction()

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        $result = $model_admin->checkByCookie();
                    $session_start();
            }         jump(    }
}

模型

在AdminModel内增加一个checkByCookie()方法:

application/model/AdminModel.class.php

2
3
4
5
6
7
8
9
10
                }
        db->fetchRow($sql);
}