跟随我在oracle学习php(57)

shop34-11-配置文件系统

配置文件

在application目录中,增加一个子目录config用于管理项目中所出现的配置文件:

 

 

设计,配置文件存储数据的格式:

对配置进行分组管理:

 

 

初始化项目时,载入该配置文件,获取配置信息

在框架类中,增加载入配置的操作:

 

在初始化完路径常量后,就可以完成对配置的初始化:

 

 

使用配置完成:

分发参数:

 

 

数据库服务器信息:

Model:

 

SessionDB:

 

 

shop34-12-防止SQL注入

项目中添加防止SQL注入的代码

在MySQLDB中,添加一个可以完成转义的方法,在模型中,需要时调用!

/*防止sql注入  自动转义传值*/

function escapeString($str){

return $this->db->real_escape_string($str);

}

 

 

 

 

项目中使用,AdminModel中,完成转换:

 

 

为了避免,整型数据可能不被SQL中增加引号,强制在转换后的数据使用引号包裹;

 

拼凑SQL的数据不需要增加引号:

 

 

 

Tip:

PHP中魔术引号(magic quotes),PHP中自动为请求数据(GET,POST)增加转义的一种防止SQL注入机制。

 

 

 

shop34-13-DAO层抽取

项目中对PDO的使用

使用PDO,实现与mysqlDB这个DAO对象外部操作一致的另外一种DAO的实现,可以做到,模型切换DAO,是不需要更改模型内的任何代码(热插拔,无缝切换)

 

增加DAO的操作接口(I_DAO),使所有DAO的定义(mysql扩展,PDO扩展)都实现相同的DAO操作接口(I_DAO)

 

 

 

 

 

shop34-14-后台首页展示

后台首页功能

主体功能

框架集布局,各个框架中,都需要请求项目的某个功能动作,完成最终的展示!

 

Back/ManageController->indexAction()

 

 

完成后台模板index.html

 

 

各个frame功能

 

 

实现对应的视图模板:

 

shop34-15-平台控制器-集中验证

后台公共登录验证 – 平台控制器

后台不仅Manage->indexaction()需要登录验证,而且其他动作需要登录验证。

该操作属于当前平台后台的公共控制器功能。

 

增加后台的平台控制器,完成相应验证工作:

 

平台中其他的控制器,都继承自平台控制器:

 

 

 

 

将验证登录操作,移动到PlatformController:

实现:

 

 

调用时机:

实例化后台控制器对象的时候(构造方法执行时):

 

 

测试:

 

发现,已经可以验证未登录,并跳转到登录,但是登录页面没有正常加载:

Why?

请求admin的login时,也要判断是否登录,没有由跳转到admin的login,导致死循环。

 

可见:后台的绝大多数的动作都需要登录验证后在执行,但是存在特例:登录相关,找回密码之类。

应该判断是否登录时,如果是特例动作则不判断:

如何判断特例?

 

 

 

由于开启session在公共的位置,后台的动作中,就不需要再次开启session了:

adminController->checkAction()

 

 

 

shop34-17-登录验证码

验证码的分析

登录:防止暴力破解

论坛:防止灌水水

展示类:被抓取。

 

 

 

需要技术:

图片处理技术。

会话session技术。

 

 

PHP图片处理技术 – GD

具体操作步骤

开启GD扩展

 

Apache restart

 

 

场景:

制作500×300的绿色图片

创建画布

画布,一种资源型数据。可以操作的图像资源。

 

创建新画布(新建)

ImageCreate(宽,高),创建基于调色板的画布。

imageCreateTrueColor(宽,高);创建真彩色的画布。

基于图片创建画布(打开)

imageCreateFromJPEG(图片地址);

imageCreateFromPNG(图片地址);

imageCreateFromGIF(图片地址);

 

 

 

 

操作画布

分配颜色:如果需要在画布上使用某个颜色,应该先将颜色分配到画布上。

使用函数:

颜色标识 = imageColorAllocate(画布,R,G,B);

颜色的表示方式:

RGB

 

 

 

填充画布:将填充点,连续并且颜色相同的点进行填充(替换)

使用函数:

imageFill(画布, 填充位置x, 填充位置Y,颜色标识)完成

位置采用坐标进行管理:

原点:0,0,画布的左上角。

向右,x轴增加,向下Y轴增加。

右下角坐标:width-1,height-1

 

 

输出画布

将画布中处理好的图样信息,输出出来。

 

典型的:

1输出到图片文件。

2直接输出。

使用函数:

imagePNG(画布[, 文件地址]):

imageJPEG();

imageGIF();

如果没有第二个参数,表示直接输出。

 

 

 

 

如果直接输出到浏览器,需要告知浏览器,响应数据的类型应该是PNG格式的图片:

使用指令Content-type

 

tip:一个画布可以输出多次,输出为各种格式!

 

 

销毁画布资源

imageDestroy();

 

 

项目中实现验证码

验证码工具

Framework/tool/Captcha.class.php

 

 

自动加载:

 

 

生成验证码图片:

 

Session开启重复避免:

 

 

背景图位置:

 

 

登录表单时展示

在登录表单页面,通过IMG标签,请求生成图片的URL地址,展示图片。

<img src=”URL” />

 

增加一个动作,用于完成生成后台登录界面的验证码图片:

Back/AdminController->captchaAction();

 

 

页面的img标签的src属性,请求该动作:

 

 

Tip:如果图片显示失败,如何调试?

应该直接请求生成图片的地址,而不是在img标签中查看。

 

我的程序,应该将captchaAction()也列为登入认证例外:

后台的平台控制器:

 

 

结果:

 

 

点击更换:

通过点击事件,对生产验证码图片的地址重新请求,形成新的验证码,进行展示!

如果img标签的src属性被更改,则浏览器会对新的url进行请求,展示在img图片区域内。

 

上一篇:CSharpGL(57)[译]Vulkan清空屏幕


下一篇:Python爬虫系列之美团优选商家端商品自动化管理(商品发布、商品排期、订单采集)