在很多php框架中都有自动过滤,自动填充,自动验证等三大自动功能,用来对POST表单传过来的数据进行加工,以便能够更加规范的导入数据库。这一功能在添加商品,添加商品分类中有很大的用处。比如thinkphp框架就有自动过滤,自动填充,和自动验证功能。

今天我们就以MVC的思维方式编写三大自动功能。

(1) 首先,来写比较简单的自动过滤功能。假如从post表单中传递过来的 数据我么定义为数组$array.即$array=$_POST

 <?php

 class Model{

       protected $table = NULL; // 是model所控制的表
protected $db = NULL; // 是引入的mysql对象
protected $pk = '';//该表的主键 protected $fields=array();//用来自动过滤的数组。该数组主要存放model所控制表的所有字段
protected $_auto=array();//用来自动填充的数组。存放post没有但要填充的字段。如添加时间。
protected $_valid=array();//用来存放需要验证的字段和相关验证信息
protected $error = array();//用来存放错误信息 // 当实例化model类时,mysql类同时完成实例化
public function __construct() {
$this->db = mysql::getIns();
}
} //完成表单的自动过滤
public function _facade($array=array()){
$data=array();
foreach($array as $k=>$v){ if(in_array($k,$this->fields)){ $data[$k]=$v;
}
}
return $data; }  (2)完成自动过滤有我们可以得到一个没有违法字段的$data数组。接下来需要完成的是自动填充
public function _autoFill($data){
foreach($this->_auto as $k=>$v){
if(array_key_exists($v[0],$data){ switch($v[1]){ case 'value':
$data[$v[0]]=$v[2];
break;
case 'function':
$data[$v[0]]=call_user_func($v[2]);
$break; } } } return $data;
}

(3).也是最难的,也就是完成自动验证。

首先要写一个验证函数,然后进行自动验证。

 //先写一个检测函数
protected function check($value,$rule='',$parm=''){ switch($rule){
case 'require':
return !empty($value);
case 'number':
return is_numeric($value);
case 'in':
return in_array($value,explode(',',$parm);
case 'between':
list($min,$max)=explode(',',$parm);
return $value>=$min&&$value<=$max;
case 'length':
list($min,$max)=explode(',',$parm);
return strlen($value)>=$min&&strlen($value);
default:
return false;
}
}

然后我们根据以上的验证函数来对二维数组进行验证。

 public function _validate($data){
if(empty($_valid)){
return true;
}
$this->error=array();
foreach($_valid as $k=>$v){
switch($v[1]){
case 1:
if(!isset($v[0])){
$this->error=$v[2];
return false;
}
if(!$this->check($v[0],$v[3])){
$this->error=$v[2];
return false;
}
break;
case 0:
if(isset($v[0])){ if(!$this->check($v[0],$v[3],$v[4])){
this->error=$v[2];
return false;
}
}
break;
case 2:
if(isset($v[0]))&& !empty($v[0]){
if(!this->check($v[0],$v[3],$v[4])){
$this->error=$v[2];
return false;
}
} break;
} } return true;
}

手把手写php框架中三大“自动功能”的更多相关文章

  1. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

  2. Android开发之手把手教你写ButterKnife框架(二)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开 ...

  3. CSS面试复习(三):预处理器、工程化方案、三大框架中的CSS

    一.预处理器 1.介绍 基于CSS的另一种语言.通过工具编译成CSS.添加了很多CSS不具备的特性.能提升CSS文件的组织 2.less嵌套 3 .sass嵌套 4. less变量 5.sass变量 ...

  4. Angular Vue React 框架中的 CSS

    框架中的 CSS Angular Vue React 三大框架 Angular Vue 内置样式集成 React 一些业界实践 Angular Angular . js (1.x):没有样式集成能力 ...

  5. 漫谈 GOF 设计模式在 Spring 框架中的实现

    原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 漫谈 GOF 设计模式在 Spring ...

  6. 要想精通Mybatis?从手写Mybatis框架开始吧!

    1.Mybatis组成 动态SQL Config配置 Mapper配置 2.核心源码分析 Configuration源码解析 SqlSessionFactory源码解析 SqlSession源码解析 ...

  7. 手把手撸套框架-Victory框架1.1 详解

    目录 上一篇博客 Victory框架1.0 详解  有说道,1.0的使用过程中出现不少缺点,比如菜单不能折叠,权限没有权限组等等. 所以,我还是抽出时间在下班后,回到我的小黑屋里 完成了1.1的升级. ...

  8. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  9. 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制

    推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...

随机推荐

  1. Gson---简单入门

    1-1.Diaosi.java(bean) package Bean; import com.google.gson.annotations.SerializedName; public class ...

  2. hive中拉链表

    在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间. 拉链表适用于以下几种情况吧 数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业 ...

  3. 如何写一个简单的http服务器

    最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...

  4. [转] --- Error: “A field or property with the name was not found on the selected data source” get only on server

    Error: “A field or property with the name was not found on the selected data source” get only on ser ...

  5. MSIL Emit AOP

    参考链接: https://pieterderycke.wordpress.com/tag/reflection-emit/ http://www.moon-soft.com/doc/23252.ht ...

  6. 在 .NET 4.0 中使用 .NET 4.5 中新增的特性(CallerMemberNameAttribute/CallerFilePathAttribute/CallerLineNumberAttribute)

    介绍 标题中所说的三个特性 CallerMemberNameAttribute / CallerFilePathAttribute / CallerLineNumberAttribute 我们统称为调 ...

  7. java.lang.IllegalStateException: Couldn't read row 1, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data fr

    Android中操作Sqlite遇到的错误:java.lang.IllegalStateException: Couldn't read row 1, col 0 from CursorWindow. ...

  8. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  9. mysql 存储过程 游标的使用

    BEGINDECLARE id long;DECLARE Done INT DEFAULT 0;DECLARE userids CURSOR FOR SELECT userid from info_u ...

  10. UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用

    UIButton内有两个控件titleLabel和imageView,可以用来显示一个文本和图片,这里的图片区别于背景图片.给UIButton设 置了title和image后,它们会图片在左边,文本在 ...