PHP项目开发实例(二)(未使用框架)

3.后台登录管理

后台控制器

        要写2个控制器

BaseController
开始SESSION
LoginController

                        后台其他控制器继承 BaseController,检验是否登录

继承BaseController
显示效果

               登录验证

login.html
登录动作
AdminModel模型

                退出

html
方法

4.项目安全

 后台登录的操作实际上存在安全隐患,实际项目中要考虑的几个基本安全问题。

三个安全问题:1. 恶意攻击; 2. SQL注入;3. XSS攻击

            (1)恶意攻击

                 get方式,通过url,dos攻击,通常是从硬件和网络的角度,防火墙。(程序员不用管)

                 post方式,通过表单提交,穷举法,恶意破解,灌水。从程序的角度来防止。可以使用验证码。

                在登录页面显示验证码

LoginController中
html
更换验证码
验证

            (2)SQL注入

            在请求的时候,输入一些特殊的字符,然后构造成可以执行的sql语句,达到攻击的目的。

            POST请求 和 GET请求

            A.POST请求    在没有进行 md5 加密的情况下

            万能密码   xxx' or '1

万能密码

            Sql语句显示:

SELECT * FROM cz_admin WHERE admin_name = 'xxxx' AND password = 'xxx' or '1' LIMIT 1;

            or 1  永远都是 true ,就会将一条管理员信息返回。

            应对方法   MD5 加密

对密码加密

              Sql语句显示:

SELECT * FROM cz_admin WHERE admin_name = 'xxxx' AND password = 'e747940143cedc0d7cc1f20c3cd47719' LIMIT 1

            密码加密的原因:

                 防止万能密码攻击

                 保护用户的隐私

         万能用户名  xxx' or 1#

万能用户名

             Sql语句显示:

SELECT * FROM cz_admin WHERE admin_name = 'xxx' or 1#' AND password = 'b59c67bf196a4758191e42f76670ceba' LIMIT 1

        #号后面全部被 注释掉    照样能顺利登陆

             应对方法

            用户名不要加密   

            关键是单引号,让单引号失效,可以将其转义,有以下两种方式:

            在php的层面来转义,php提供 addslashes()函数;

            在mysql的层面来转义,mysql扩展提供的mysql_real_escape_string()函数。

addslashes()函数

            转义后,将单引号转义

            SELECT * FROM cz_admin WHERE admin_name = 'xxx\' or 1#' AND password = 'b59c67bf196a4758191e42f76670ceba' LIMIT 1

            结论:千万不要相信用户的输入,对用户的输入一定要做验证和处理。


            B.GET请求

         比如,删除商品分类的时候要传一个参数 cat_id

            shop.com/index.php?p=admin&c=category&a=delete&cat_id=7 or 1

            请求,拼接的sql语句如下:

            delete form cz_category where cat_id = 7 or 1;

             结果全部删除了,非常不安全。

            应对方法

             将cat_id  转成整型,将 7 or 1 整个当做一个整型

             ①强制转换,(int)变量  ,使用intval()函数

             ②隐式转化,让其参与运算,用+

转成整型

    (3)XSS攻击

            XSS:CrossSite Script,跨站脚本攻击。

            恶意攻击者往Web页面里插入恶意html和JavaScript代码,当用户浏览该页之时,嵌入其中Web里面的html和JavaScript代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS攻击

                应对方法

                本质,都是html标签惹的祸。

                措施:对html标签进行实体转义,在php中,有两个函数可以完成这个功能:

                 htmlspecialchars()函数

                 htmlentities()函数

转义
未转义和转义的效果

            转义形式

            空格: &nbsp;     版权: $copy;      < :  &lt ;    >: &gt;   

      (4)  定义辅助函数完成批量转义

            array_map 将回调函数作用到给定数组的单元上

            array_map(callable $callback,array $arr1[,array $.......]);

辅助函数
引入辅助函数

 5.错误管理

        保持良好的代码书写习惯是避免错误的有效途径。 

        使用 ①Echo + exit;②var_dump() + exit;③file_put_contents();来查看错误。

        增加sql语句执行日志:使用file_put_contents()将sql语句写到日志文件中。

        PHP_EOL:换行符 常量

            Windows:\n\r

                Linux: \n

                Mac:\r

增加日志
配置文件
显示

 6.商品类型管理

          ① 明确目标:完成商品类型的增删该查(CRUD)

          ② 业务逻辑分析

表结构

           ③ 添加商品类型

                     控制器与上一篇中的CategoryController 基本一致

                    一控制器、一模型、一表,六个方法,三个视图!!!!!!

TypeController
增加
对应html

               

                ④显示商品类型

显示
获取数据
显示
显示效果

            分页效果(重点)

        分页原理:

            假如,每页要显示3条,用pagesize,用current 来表示当前页数

            第一页:SELECT * FROM shop.cz_goods_type order by type_id limit 0,3

            第二页:SELECT * FROM shop.cz_goods_type order by type_id limit 3,3

            第三页:SELECT * FROM shop.cz_goods_type order by type_id limit 6,3

            ......

            第N页:

            SELECT * FROM shop.cz_goods_type order by type_id limit (current-1)*pagesize pagesize

            要完成分页显示效果,需要结合两个模型,数据库模型和工具类模型

                 数据库模型,完成的是取数据的任务

                 工具类模型,完成的是显示分页信息,并提供上下页的链接,分页类。

                ① 数据库模型

分页获取商品类型
引入分页类
分页类构造函数
Typecontroller
页面实现
显示效果

7.商品属性管理

        ① 明确目标:完成商品扩展属性的增删该查(CRUD)

            商品的属性分成两类:

             通用属性,每个商品都具备的属性,如名称,价格,图片等,存放在goods表中

             扩展属性,不同类型的商品它的属性是不同的,它是存放在goods_attr表中

        ② 业务逻辑分析

            type_id:类型id,表明当前这个属性是属于哪个类型的。

            atrr_type:属性的类型,通常有唯一单选多选之分,

            attr_input_type:属性的输入类型,通常有文本框下拉列表文本域之分

            attr_value:属性的可选值(默认值)

        ③添加属性

             控制器与 TypeController 基本一致

            一控制器、一模型、一表,六个方法,三个视图!!!!!!

AttributeController

            商品属性管理的入口 在 商品类型 列表中 goods_type_list.html

html显示
修改路径

        添加属性

获取商品类型
获取商品类型
html
显示效果
添加属性

         ④显示属性列表

            商品属性管理的入口 在 商品类型 列表中 goods_type_list.html,点击 商品属性 会传该类型的 id 过来

 商品属性管理的入口 
获取该类型属性
要连表查询

                需要输出商品类型的名称,就要通过连表查询。

                连表方式, 内联inner join;   左连接left join

                凡是能够使用inner join的地方,完全可以使用left join。

                能够使用left join的地方,不一定能使用inner join。

                总结:所有的地方都可以使用left join

连表
html
显示

    分页显示

分页
sql
页面代码
获取所有商品类型
获取所有类型
获取所有类型

        然后需要给下拉列表注册onchange事件

JS

[注意]:对于这种复杂的功能,要一步步分步实现。


 8.商品管理

     ① 明确目标:完成商品的增删该查(CRUD)

     ② 业务逻辑分析

      ③显示添加页面

            与其他控制器相同

      一控制器、一模型、一表,六个方法,三个视图!!!!!!

Controller

        先处理   商品添加

添加商品页面
goods_add.html
goods_add.html
商品属性

        知识点:选择商品类型,显示它对应的所有的属性,并且以表单的形式。

        使用局部  刷新技术,两种方式:①Ajax ② 使用iframe实现

        iframe 的技术要点就是在 页面中 增加一个 新的窗口 ,然后使用 Js 改变 iframe 的 src请求地址,来请求后台接口,获取数据, 然后操作DOM ,将获取的 数据 显示在页面上,一般操作DOM 的 innerHTML ; 一般 iframe 隐藏起来, 而将 需要输出的数据 显示在需要的地方。

        分部完成复杂的地方

第一步创建iframe
第二步下拉菜单事件

        下拉菜单 onchange 事件

改变iframe的src属性

        第三步  getAttrs 方法

getAttrs
AttributeModel的方法
效果

        ④添加商品

            难点 多表插入(连表)

连表添加
表单提交地址
insertAction
insertAction

                strtotime()函数:将所有的表示日期时间的字符串转成时间戳

自动生成文件夹保存
显示

六 前台功能

前台

    ① 显示首页

首页
view
静态资源
修改路径

        ②展示所有商品分页

            难点(递归) 层层获取子类

递归
数据表

 需要将平行的二维数组转成包含关系的多维数组,如图:

数组的转换
数据处理
处理数据
index.html
显示

        ③获取推荐商品

            is_best 字段  在模型中定义一个方法,获取推荐商品

            不要使用*,可以提高查询效率,节省资源;避免出现逻辑错误

GoodsModel
调用方法
显示

总结    

    粗糙的跟着视频做了个项目,基本了解MVC框架的整体流程,对MVC操作有个基本了解。

    从请求到从数据库取数据有个大概了解。

     M,model,表示模型,完成具体的业务逻辑,V,view,表示视图,用来展示页面,C,controller,控制器,专门用来负责调度数据的。

    难点:递归,数据库设计,小的知识点。

    要不断复习各个知识点,熟悉MVC。

    熟悉PHP 语法和书写规范。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容