自定义MVC框架之工具类-模型类

截止目前已经改造了5个类:

ubuntu:通过封装验证码类库一步步安装php的gd扩展

自定义MVC框架之工具类-分页类的封装

自定义MVC框架之工具类-文件上传类

自定义MVC框架之工具类-图像处理类

这个模型类支持以下功能:

>连贯操作,js叫链式操作,连贯操作的函数可以打乱顺序,最后一个函数必须是执行语句的那个函数,如select, delete, update, add等

如 $db->table( ‘user‘ )->where( ‘id=1‘ )->select()

等等

->支持扩展各种子类模型,命名如: UserModel, 也可以用其他方式的,跟表名称不同的Model命名,如MyUserModel等

  1 <?php
  2
  3 class Model {
  4     protected $dbHost; //主机
  5     protected $dbUser; //用户名
  6     protected $dbPwd; //密码
  7     protected $dbName; //数据库名
  8
  9     protected $prefix; //表前缀
 10     protected $tbName; //表名称
 11     protected $charset; //字符集
 12     protected $link; //数据库连接资源
 13     protected $sql; //拼接的sql语句
 14     protected $options; //sql查询条件
 15
 16
 17     public function __construct( $config ){
 18         $this->dbHost = $config[‘db_host‘];
 19         $this->dbUser = $config[‘db_user‘];
 20         $this->dbPwd = $config[‘db_pwd‘];
 21         $this->dbName = $config[‘db_name‘];
 22         $this->prefix = $config[‘prefix‘];
 23         $this->charset = $config[‘charset‘];
 24
 25         $this->link = $this->connect();
 26
 27         $this->tbName = $this->getTableName();
 28
 29         $this->initOptions();
 30     }
 31
 32     protected function initOptions(){
 33         $sqlKey = [ ‘where‘, ‘group‘, ‘having‘, ‘limit‘, ‘order‘, ‘field‘, ‘table‘ ];
 34         foreach ( $sqlKey as $key => $value ) {
 35             $this->options[$value] = ‘‘;
 36             if( $value == ‘table‘ ) {
 37                 $this->options[$value] = $this->tbName;
 38             }
 39         }
 40     }
 41
 42     public function table( $tbName ) {
 43         if( !empty( $tbName ) ) {
 44             $this->options[‘table‘] = $tbName;
 45         }
 46         return $this;
 47     }
 48
 49     public function limit( $limit ){
 50         if( !empty( $limit ) ) {
 51             if( is_string( $limit ) ) {
 52                 $this->options[‘limit‘] = ‘limit ‘ . $limit;
 53             }else if ( is_array( $limit ) ) {
 54                 $this->options[‘limit‘] = ‘limit ‘ . join( ‘,‘, $limit );
 55             }
 56         }
 57         return $this;
 58     }
 59
 60     public function order( $order ){
 61         if( !empty( $order ) ) {
 62             $this->options[‘order‘] = ‘order by ‘ . $order;
 63         }
 64         return $this;
 65     }
 66
 67     public function having( $having ){
 68         if( !empty( $group ) ) {
 69             $this->options[‘having‘] = ‘having ‘ . $having;
 70         }
 71         return $this;
 72     }
 73
 74     public function group( $group ){
 75         if( !empty( $group ) ) {
 76             $this->options[‘group‘] = ‘group by ‘ . $group;
 77         }
 78         return $this;
 79     }
 80
 81     public function where( $where ){
 82         if( !empty( $where ) ) {
 83             $this->options[‘where‘] = ‘where ‘ . $where;
 84         }
 85         return $this;
 86     }
 87
 88     public function field( $fields ){
 89         if( !empty( $fields ) ) {
 90             if( is_string( $fields ) ) {
 91                 $this->options[‘field‘] = $fields;
 92             }else if( is_array( $fields ) ){
 93                 $this->options[‘field‘] = join( ‘,‘, $fields );
 94             }
 95         }
 96         return $this;
 97     }
 98
 99     public function getTableName(){
100         if( !empty( $this->tbName ) ) {
101             return $this->prefix . $this->tbName;
102         }
103         $className = get_class( $this );
104         //UserModel GoodsModel, 获取Model前面的字符串(就是表名称)
105         $tbName = strtolower( substr( $className, 0, -5 ) );
106         return $this->prefix . $this->tbName;
107     }
108
109     protected function connect(){
110         $link = mysql_connect( $this->dbHost, $this->dbUser, $this->dbPwd );
111         if( !$link ){
112             die( "mysql数据库连接失败:" .  mysql_error() );
113         }
114         mysql_select_db( $this->dbName, $link );
115         mysql_query( $this->charset );
116         return $link;
117     }
118
119     public function select(){
120         $sql = ‘SELECT %FIELD% FROM %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%‘;
121         $sql = str_replace(
122             [‘%FIELD%‘, ‘%TABLE%‘, ‘%WHERE%‘, ‘%GROUP%‘, ‘%HAVING%‘, ‘%ORDER%‘, ‘%LIMIT%‘],
123             [ $this->options[‘field‘], $this->options[‘table‘], $this->options[‘where‘], $this->options[‘group‘], $this->options[‘having‘], $this->options[‘order‘], $this->options[‘limit‘] ],
124             $sql
125         );
126         $this->sql = $sql;
127         return $this->query( $sql );
128     }
129
130     public function __get( $key ){
131         if( $key == ‘sql‘ ) {
132             return $this->sql;
133         }else if( $key == ‘prefix‘ ) {
134             return $this->prefix;
135         }
136         return false;
137     }
138
139     public function query( $sql ){
140         //执行语句之前,清空原来的options保存的sql语句临时拼接数据
141         $this->initOptions();
142         $res = mysql_query( $sql );
143         $data = array();
144         if( $res && mysql_num_rows( $res ) ) {
145             while( $row = mysql_fetch_assoc( $res ) ){
146                 $data[] = $row;
147             }
148         }
149         return $data;
150     }
151
152     public function add( $data ){
153         $data = $this->parse( $data );
154         $keys = array_keys( $data );
155         $values = array_values( $data );
156         $sql = ‘INSERT INTO %TABLE%(%FIELD%) values(%VALUES%)‘;
157         $sql = str_replace(
158             [ ‘%TABLE%‘, ‘%FIELD%‘, ‘%VALUES%‘ ],
159             [ $this->options[‘table‘], join( ‘,‘, $keys ), join( ‘,‘, $values ) ],
160             $sql
161         );
162         $this->sql = $sql;
163         return $this->exec( $sql, true );
164     }
165
166     public function delete(){
167         $sql = ‘DELETE FROM %TABLE% %WHERE%‘;
168         $sql = str_replace(
169             [ ‘%TABLE%‘, ‘%WHERE%‘ ],
170             [ $this->options[‘table‘], $this->options[‘where‘] ],
171             $sql
172         );
173         $this->sql = $sql;
174         return $this->exec( $sql );
175     }
176
177     public function exec( $sql, $isInsert = false ){
178         $this->initOptions();
179         $res = mysql_query( $sql );
180         if( $res !== false ) {
181             if( $isInsert ) {
182                 return mysql_insert_id();
183             }else {
184                 return mysql_affected_rows();
185             }
186         }
187         return false;
188     }
189
190     public function parse( $data ) {
191         $res = [];
192         foreach( $data as $k => $v ){
193             if( is_string( $v ) ) {
194                 $res[$k] = ‘"‘ . $v . ‘"‘;
195             }
196         }
197         return $res;
198     }
199
200     public function update( $data ) {
201         $data = $this->parse( $data );
202         $fieldValue = $this->format( $data );
203         $sql = ‘UPDATE %TABLE% SET %FIELD% %WHERE%‘;
204         $sql = str_replace(
205             [ ‘%TABLE%‘, ‘%FIELD%‘, ‘%WHERE%‘ ],
206             [ $this->options[‘table‘], $fieldValue, $this->options[‘where‘] ],
207             $sql
208         );
209         $this->sql = $sql;
210         return $this->exec( $sql );
211     }
212
213     //update ghostwu_user set field = value, where ....
214     protected function format( $data ){
215         $res = [];
216         foreach( $data as $k => $v ) {
217             $res[] = $k . ‘=‘ . $v;
218         }
219         return join( ‘,‘, $res );
220     }
221
222     public function __destruct(){
223         mysql_close( $this->link );
224     }
225
226     public function __call( $funcName, $args ) {
227         $str = substr( $funcName, 0, 5 );
228         $field = substr( $funcName, 5 );
229         if( $str == ‘getBy‘ ) {
230                 echo $args[0];
231             return $this->where( $field . ‘="‘ . $args[0] . ‘"‘ )->select();
232         }
233         return false;
234     }
235 }
236 $config = [
237     ‘db_host‘ => ‘localhost‘,
238     ‘db_user‘ => ‘root‘,
239     ‘db_pwd‘ => ‘‘,
240     ‘prefix‘ => ‘ghostwu_‘,
241     ‘db_name‘ => ‘blog‘,
242     ‘charset‘ => ‘utf8‘,
243 ];
244 $db = new Model( $config );
245 print_r( $db->field( ‘*‘ )->table( $db->prefix . ‘users‘ )->getByName( ‘zhangsan‘ ) );
246 echo $db->sql . PHP_EOL;
247 //$db->table( $db->prefix . ‘users‘ )->where( ‘id=1‘ )->update( [ ‘name‘ => ‘david‘, ‘email‘ => ‘[email protected]‘ ] );
248 //echo $db->sql . PHP_EOL;
249 //$db->table( $db->prefix . ‘users‘ )->where( ‘id in( 4, 5, 6, 7 )‘ )->delete();
250 //echo $db->sql . PHP_EOL;
251 //$db->table( $db->prefix . ‘users‘ )->add( [‘name‘ => ‘zhangsan‘, ‘email‘ => ‘[email protected]‘] );
252 /*
253 $list = $db->table( $db->prefix . ‘users‘ )->field( [ ‘name‘, ‘email‘ ] )->where( ‘id >= 1‘ )->order( ‘id desc‘ )->limit( [0, 5] )->select();
254 echo $db->sql . PHP_EOL;
255 print_r( $list );
256  */
257 ?>

原文地址:https://www.cnblogs.com/ghostwu/p/8502878.html

时间: 2024-10-12 13:36:31

自定义MVC框架之工具类-模型类的相关文章

自定义MVC框架之工具类-图像处理类

截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( 支持任意位置与九宫格位置 ) 2,图片缩放处理( 等比缩放,不变形裁剪 ) 1 <?php 2 3 class Image{ 4 //文件路径 5 protected $path; 6 //是否允许随机文件名称 7 protected $enableRandName; 8 //文件类型 9 pro

自定义MVC框架之工具类-分页类的封装

以前写过一个MVC框架,封装的有点low,经过一段时间的沉淀,打算重新改造下,之前这篇文章封装过一个验证码类. 这次重新改造MVC有几个很大的收获 >全部代码都是用Ubuntu+Vim编写,以前都是windows上开发,这次彻底迷上Ubuntu Linux >裸装php,用php自带的服务器解释执行php,缺哪个扩展就装哪个,最后通过整个MVC框架的开发,把Lamp所有的常用配置与细节搞懂 >通过扩展安装,学习扩展开发与php底层源码分析 总之,终于感觉层次又提升了不少. 分页类代码:

Java Web自定义MVC框架详解 (转)

转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架.但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有 代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码,也有原理和探讨.内容会比 较长,因为我打算用递增的方式讲解如何写一个自定义MVC框架,重点是前

Struts2 自定义MVC框架

一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发 二.MVC设计模式: 由3个部分组成,各部分作用如下: Model:模型,主要用于数据和业务的处理 View:视图,用于数据的显示 Controller:控制器,用于进行流程控制 MVC设计模式的特点: ①一个模型可以对应多个视图 ②显示与逻辑控

使用Intellij Idea自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

简单封装自定义MVC框架

自定义Mvc框架结构及其使用方法 一,什么是MVC框架 MVC框架全名是model(模型)controller(控制器)view(视图文件)所构成的一种开发框架,是一种典型的软件设计典范,用一种业务逻辑,数据,显示相分离的方法组织代码,其好处是将业务逻辑聚集到一个部件里面,在改进和指定个性化页面的同时不需要重新编写业务逻辑,MVC被独特的发展起来用于映射传统的输入,处理,显示在一个业务逻辑的图形化业务界面中. 二,组成 ①,model(模型):主要负责具体功能的实现,一个模型对应一种功能 ②,v

ideat使用struts2之自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

自定义MVC框架

一.实现自定义MVC的体系结构图 1.Model I模式开发Web应用时,分两种情况: *纯JSP技术方式开发 *JSP+JavaBean方式开发 2.Model I模式开发的不足: *JSP页面中嵌入大量的Java代码,可读性差. *大量代码在JSP中难以复用. *后期维护及扩展的难度大. 3.为了克服Model I模式的缺陷,引入了Model II的模式开发 *Model II模式体现了基于MVC(Model-View-Controller,模型-视图-控制器)的设计模式,简单的说,Mode

struts2自定义MVC框架

自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发. 总结MVC特点如下: (1)数据的获取和显示分离     (2)控制器将不同的模型和视图组合在一起     (3)应用分为三部分,三部分之间松耦合并协同工作,从而提高应用的可扩展性和可维护