php_mvc实现步骤十
shop34-19-商品添加
功能:添加商品表单
Index.php?p=back&c=Goods&a=add
Controller-Action:
新建商品控制器类
Application/back/controller/GoodsController.class.php
addAction():
Model:
View-template:
增加视图层模板:
Application/back/view/goods_add.html
需要相应的js:
留下部分选项卡,及表单元素:
补充
修改菜单的menu.html模板,请求添加动作:
Back/view/menu.html
功能:处理商品添加数据
Index.php?p=back&c=Goods&a=insert
控制器-动作
Back/GoodsController->insertAction();
Checkbox在提交时:
如果选中:则其值为value属性的值。
如果未选中:则表单不会提交其数据(_POST中没有该元素)
推荐:
采用数组方式命名,并且值就是需要插入到表中的数据:
处理:
实现insertAction();
模型
为goods表建立操作模型:
Application/back/model/GoodsModel.class.php
格式化字符串:
Sprintf()可以完成对字符串的格式化:
Sprintf(格式,格式中需要的数据)
Tip:数据参与SQL的执行,一定要防止SQL注入,使用转义!
此时在模型层面,提供可以对数组内的所有数据,进行批量转义功能:
基础模型增加方法:
escapeStringAll();
需要时调用该方法:
Back/GoodsModel->insertGoods()
视图-模板
补充:
商品列表
shop34-20-表前缀的处理
模型-前缀处理
真实表名 = 前缀(项目) + 逻辑表名(功能)
前缀:通过配置文件配置。
Config/application.config.php
逻辑表名:模型类自身来确定。
模型类中增加属性:_logic_table
拼凑真实表名:
基础模型中,增加初始化真实表名的操作:
表名使用反引号包裹!
实例化模型对象时,完成对真实表名的初始化工作:
基础模型的构造方法中:
使用真实表名:
在模型中,拼凑SQL语句时,使用$this->_table:
shop34-21-文件上传工具
文件上传
上传:
从浏览器端传输的到服务器端。
请求时:
数据从浏览器端传输到服务器端。
可见:
上传,发生在浏览器向服务器发出请求过程中。
文件,对于浏览器来讲,就是表单中的一个特殊类型的数据而已。
浏览器表单中的数据:两种类型。
1, 字符串类型。(字节流编码)
2, 文件类型。(二进制编码)
(tip:文件就是表单中数据的一部分)。
提交表单时,浏览器自动将表单内的数据,传输到服务器端,文件型也会包含在内。
服务器角度:
在接受浏览器的请求时,处理好表单内数据。
根据数据类型不同(2种),采用不同的处理方法:
1, 字符串类型,存储在$_POST变量中(内存中)
2, 文件型数据,存储到上传临时目录中。
表单提交时:浏览器会默认的认为,表单内的数据都是字符串类型(即使使用file文件域),通过在form上,增加属性,告知浏览器表单内的数据类型不仅仅有字符串。
Form enctype=”multipart/form-data”
PHP服务器在接受到文件型的表单数据后:
将文件,存储于上传临时目录。就是临时文件,有效期脚本周期内有效。
通过PHP的php.ini配置:
默认为服务器操作系统临时目录。
需要,将临时上传文件持久化存储!(将其移动到指定位置)
函数:
Move_uploaded_file(上传临时地址,目标地址);
完成
需要使用$_FILES数组,存储了上传的临时文件的信息,包括临时地址!
每个上传的临时文件,有5个信息,name:原始文件名,type:类型,tmp_name,临时地址,error:是否有错误及错误类型,size:大小。
典型的上传代码
通过对文件的属性信息的判断,决定文件是否可用!
类型:表示方式 2种:
后缀名:文件系统中,标识文件的方案。
MIME(多用途internet邮件扩展):网络上传输资源时,使用的资源类型表示方法。
Text/html; image/png
后缀名截取:
$file = 'x.y.z.png';
echo strrchr($file, '.');
// 找到字符串中某个子字符串的最后出现位置,从该位置截取到字符串末尾。
Array_merge()数组合并
array_unique()去掉数组中重复的元素值
重命名文件:
使用原名。(重名,特殊字符, 不具备逻辑含义)
起名:uniqID();
UniqID()可以生成一个唯一的字符串,并且允许设置前缀。
类型检测:
后缀和MIME
以上两个值,都是由浏览器端请求提供的。
需要服务器PHP自身完成MIME的检测:
需要 PHP的扩展: fileinfo 完成对文件的信息的检测。
提供面向对象和函数两套语法:
使用面向对象语法吧:
开启该扩展:
Apache restart
分子目录存储上传文件
原则:业务逻辑。文件数量。按照时间。
Mkdir(目录地址)创建目录
Is_dir(目录地址)检测目录
Date()获得日期时间
项目中使用
上传的工具类:
完成自动加载:
添加商品时使用:
Back/GoodsController->insertAction();
模型中,处理goods_image_ori:
Back/GoodsModel->insertGoods();
修改表单,使之可以上传文件,并设置file表单元素,起名字。
Back/iew/goods_add.html
php_mvc实现步骤十的更多相关文章
- php_mvc实现步骤九(登录验证码,退出-登录标记)
shop34-17-登录验证码 验证码的分析 登录:防止暴力破解 论坛:防止灌水水 展示类:被抓取. 需要技术: 图片处理技术. 会话session技术. PHP图片处理技术 – GD 具体操作步骤 ...
- php_mvc实现步骤八
shop34-10-框架类 框架类(框架初始化类) 将原来入口文件中功能,放在该类中完成,入口文件变得简单,轻量! 将入口文件中的各个功能,由框架类的各个方法,完成: 为了简单化,使用纯静态的类.(看 ...
- php_mvc实现步骤七
shop34-5-登录表单 登录功能分析 功能:登录表单 C控制器-动作 back后台admin控制器loginAction动作完成该功能. Application/back/controller/A ...
- php_mvc实现步骤六
shop34-1-目录布局 存在项目的根目录 shop34 框架代码与应用程序代码划分 框架代码: 在各个应用程序间可以通用的代码. 应用程序代码: 当前项目的业务逻辑实现的代码. 分别创建两个子目录 ...
- php_mvc实现步骤五
5.match_controller 控制器层典型实现 控制器类 依据功能的相关性,将一系列相关的功能,使用一个控制器类来处理,而该控制器的每个方法,就对因某个功能. 注意:控制器是按照功能划分的.( ...
- php_mvc实现步骤三,四
3.match_mvc MVC 以ecshop的前台为例: 功能一: 首页 购物车数据,商品分类数据,其他的首页需要的数据 功能二: 拍卖活动 购物车数据,商品分类数据,拍卖相关数据 功能三: 团购商 ...
- php_MVC实现步骤二
2.match_split 显示逻辑相分离 将功能强制分成两个部分,显示html文件,和逻辑PHP文件: 要求浏览器请求负责功能的PHP逻辑文件: 该PHP逻辑文件,对需要的显示内容进行载入. 逻辑P ...
- php_MVC实现步骤一
1.Match 基本实现 功能,比赛列表,球队信息 数据表初始化: 比赛列表: 球队一 比分 球队二 比赛时间 韩国 1:2 澳大利亚 15-01-31 17:00 从SQL思考,如何完成上面的查询: ...
- 转载:CentOS7下部署Django项目详细操作步骤
部署是基于:centos7+nginx+uwsgi+python3+django 之上做的 文章转自:Django中文网 https://www.django.cn/article/sh ...
随机推荐
- linux /lib64/libc.so.6: version `GLIBC_2.17′ not found
使用root权限安装Glances,需要用到glibc,安装失败后所有命令都不好用了,执行回报“/lib64/libc.so.6: version `GLIBC_2.17′ not found ”的错 ...
- js判断是否是在微信浏览器中打开
// js判断是否是在微信浏览器中打开 function is_weixn(){ var ua = navigator.userAgent.toLowerCase(); if(ua.match(/Mi ...
- ztree异步加载---------补发周日内容
上周六老师要求和大三的进行JAVA知识交流,总体来说就是给大三学长做的东西打分,然后大三学长再教我们如果构建ztree.毕竟第一次接触ztree,所以有很多不了解,但通过周六日努力,还是做出来了.现在 ...
- php 常用操作数组函数
我们有很多操作数组的元素,我们这一节先讲一些.在6.3里面我们会总结更多的数组常用函数.深圳dd马达 下面的几个主要是移动数组指针和压入弹出数组元素的和个函数. 函数 功能 array_shift 弹 ...
- Django 实现文件下载
1. 思路: 文件,让用户下载 - a标签+静态文件 - 设置响应头(django如何实现文件下载) 2. a标签实现 <a href="/static/xxx.xlsx"& ...
- MongoDB TTL集合与固定集合
1.固定集合 MongoDB可以创建固定长度的集合,可以设置最大的集合空间或最大的集合数.创建集合的语法如下: db.createCollection("collection ...
- 2019.12.07 java基础
编译时报错,叫做编译失败 class Demo01 { public static void main(String[] args) { int a; a=12; System.out.println ...
- 查看.NET应用程序中的异常(下)
为什么要使用内存转储进行调试? 在两种主要情况下,您可能需要使用内存转储进行调试.第一种情况是应用程序有一个未处理的异常并崩溃,而您只有一个内存转储.第二种情况是,在生产环境中出现异常或特定行为,并且 ...
- CLR内部异常(上)
当我们提到CLR里的“异常”,要注意一个很重要的区别.有通过如C#的try/catch/finally暴露给应用程序,并由运行时提供机制全权实现的托管异常.也有运行时自己使用的异常.大部分运行时开发人 ...
- WinDbg命令窗口的使用
调试器命令窗口是windbg中的主要调试信息窗口.可以在此窗口中输入调试程序命令并查看命令输出.Windbg的命令窗口是我们进行调试时,主要打交道的窗口.界面如下 对于windbg,“调试器命令窗口” ...