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

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

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

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

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

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

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

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

等等

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

 <?php

 class Model {
protected $dbHost; //主机
protected $dbUser; //用户名
protected $dbPwd; //密码
protected $dbName; //数据库名 protected $prefix; //表前缀
protected $tbName; //表名称
protected $charset; //字符集
protected $link; //数据库连接资源
protected $sql; //拼接的sql语句
protected $options; //sql查询条件 public function __construct( $config ){
$this->dbHost = $config['db_host'];
$this->dbUser = $config['db_user'];
$this->dbPwd = $config['db_pwd'];
$this->dbName = $config['db_name'];
$this->prefix = $config['prefix'];
$this->charset = $config['charset']; $this->link = $this->connect(); $this->tbName = $this->getTableName(); $this->initOptions();
} protected function initOptions(){
$sqlKey = [ 'where', 'group', 'having', 'limit', 'order', 'field', 'table' ];
foreach ( $sqlKey as $key => $value ) {
$this->options[$value] = '';
if( $value == 'table' ) {
$this->options[$value] = $this->tbName;
}
}
} public function table( $tbName ) {
if( !empty( $tbName ) ) {
$this->options['table'] = $tbName;
}
return $this;
} public function limit( $limit ){
if( !empty( $limit ) ) {
if( is_string( $limit ) ) {
$this->options['limit'] = 'limit ' . $limit;
}else if ( is_array( $limit ) ) {
$this->options['limit'] = 'limit ' . join( ',', $limit );
}
}
return $this;
} public function order( $order ){
if( !empty( $order ) ) {
$this->options['order'] = 'order by ' . $order;
}
return $this;
} public function having( $having ){
if( !empty( $group ) ) {
$this->options['having'] = 'having ' . $having;
}
return $this;
} public function group( $group ){
if( !empty( $group ) ) {
$this->options['group'] = 'group by ' . $group;
}
return $this;
} public function where( $where ){
if( !empty( $where ) ) {
$this->options['where'] = 'where ' . $where;
}
return $this;
} public function field( $fields ){
if( !empty( $fields ) ) {
if( is_string( $fields ) ) {
$this->options['field'] = $fields;
}else if( is_array( $fields ) ){
$this->options['field'] = join( ',', $fields );
}
}
return $this;
} public function getTableName(){
if( !empty( $this->tbName ) ) {
return $this->prefix . $this->tbName;
}
$className = get_class( $this );
//UserModel GoodsModel, 获取Model前面的字符串(就是表名称)
$tbName = strtolower( substr( $className, , - ) );
return $this->prefix . $this->tbName;
} protected function connect(){
$link = mysql_connect( $this->dbHost, $this->dbUser, $this->dbPwd );
if( !$link ){
die( "mysql数据库连接失败:" . mysql_error() );
}
mysql_select_db( $this->dbName, $link );
mysql_query( $this->charset );
return $link;
} public function select(){
$sql = 'SELECT %FIELD% FROM %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%';
$sql = str_replace(
['%FIELD%', '%TABLE%', '%WHERE%', '%GROUP%', '%HAVING%', '%ORDER%', '%LIMIT%'],
[ $this->options['field'], $this->options['table'], $this->options['where'], $this->options['group'], $this->options['having'], $this->options['order'], $this->options['limit'] ],
$sql
);
$this->sql = $sql;
return $this->query( $sql );
} public function __get( $key ){
if( $key == 'sql' ) {
return $this->sql;
}else if( $key == 'prefix' ) {
return $this->prefix;
}
return false;
} public function query( $sql ){
//执行语句之前,清空原来的options保存的sql语句临时拼接数据
$this->initOptions();
$res = mysql_query( $sql );
$data = array();
if( $res && mysql_num_rows( $res ) ) {
while( $row = mysql_fetch_assoc( $res ) ){
$data[] = $row;
}
}
return $data;
} public function add( $data ){
$data = $this->parse( $data );
$keys = array_keys( $data );
$values = array_values( $data );
$sql = 'INSERT INTO %TABLE%(%FIELD%) values(%VALUES%)';
$sql = str_replace(
[ '%TABLE%', '%FIELD%', '%VALUES%' ],
[ $this->options['table'], join( ',', $keys ), join( ',', $values ) ],
$sql
);
$this->sql = $sql;
return $this->exec( $sql, true );
} public function delete(){
$sql = 'DELETE FROM %TABLE% %WHERE%';
$sql = str_replace(
[ '%TABLE%', '%WHERE%' ],
[ $this->options['table'], $this->options['where'] ],
$sql
);
$this->sql = $sql;
return $this->exec( $sql );
} public function exec( $sql, $isInsert = false ){
$this->initOptions();
$res = mysql_query( $sql );
if( $res !== false ) {
if( $isInsert ) {
return mysql_insert_id();
}else {
return mysql_affected_rows();
}
}
return false;
} public function parse( $data ) {
$res = [];
foreach( $data as $k => $v ){
if( is_string( $v ) ) {
$res[$k] = '"' . $v . '"';
}
}
return $res;
} public function update( $data ) {
$data = $this->parse( $data );
$fieldValue = $this->format( $data );
$sql = 'UPDATE %TABLE% SET %FIELD% %WHERE%';
$sql = str_replace(
[ '%TABLE%', '%FIELD%', '%WHERE%' ],
[ $this->options['table'], $fieldValue, $this->options['where'] ],
$sql
);
$this->sql = $sql;
return $this->exec( $sql );
} //update ghostwu_user set field = value, where ....
protected function format( $data ){
$res = [];
foreach( $data as $k => $v ) {
$res[] = $k . '=' . $v;
}
return join( ',', $res );
} public function __destruct(){
mysql_close( $this->link );
} public function __call( $funcName, $args ) {
$str = substr( $funcName, , );
$field = substr( $funcName, );
if( $str == 'getBy' ) {
echo $args[];
return $this->where( $field . '="' . $args[] . '"' )->select();
}
return false;
}
}
$config = [
'db_host' => 'localhost',
'db_user' => 'root',
'db_pwd' => '',
'prefix' => 'ghostwu_',
'db_name' => 'blog',
'charset' => 'utf8',
];
$db = new Model( $config );
print_r( $db->field( '*' )->table( $db->prefix . 'users' )->getByName( 'zhangsan' ) );
echo $db->sql . PHP_EOL;
//$db->table( $db->prefix . 'users' )->where( 'id=1' )->update( [ 'name' => 'david', 'email' => 'david@gmail.com' ] );
//echo $db->sql . PHP_EOL;
//$db->table( $db->prefix . 'users' )->where( 'id in( 4, 5, 6, 7 )' )->delete();
//echo $db->sql . PHP_EOL;
//$db->table( $db->prefix . 'users' )->add( ['name' => 'zhangsan', 'email' => 'test@test.com'] );
/*
$list = $db->table( $db->prefix . 'users' )->field( [ 'name', 'email' ] )->where( 'id >= 1' )->order( 'id desc' )->limit( [0, 5] )->select();
echo $db->sql . PHP_EOL;
print_r( $list );
*/
?>

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

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

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

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

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

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

    以前写过一个MVC框架,封装的有点low,经过一段时间的沉淀,打算重新改造下,之前这篇文章封装过一个验证码类. 这次重新改造MVC有几个很大的收获 >全部代码都是用Ubuntu+Vim编写,以前 ...

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

    转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...

  5. 自定义MVC框架

    我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...

  6. Struts2 自定义MVC框架

    一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...

  7. 第一章 自定义MVC框架

    第一章  自定义MVC框架1.1 MVC模式设计    组成:Model:模型,用于数据和业务的处理          View :视图,用于数据的显示          Controller:控制器 ...

  8. c#自定义ORM框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)

    该教材主要是运用到泛型.反射和实体类扩展属性 步骤一.建立扩展属性类 实体类扩展属性要继承Attribute基类完成 [AttributeUsage(AttributeTargets.Property ...

  9. 潭州课堂25班:Ph201805201 django框架 第六课 模型类增删改查,常用 的查询矣查询条件 (课堂笔记)

    在视图函数中写入增删改查的方法 增: 在 urls 中配置路径 : 查: 1: 在后台打印数据 在模型类中添加格式化输出 : QuerySet,反回的是个对象,可以按索引聚会,用 for 循环,, 找 ...

随机推荐

  1. day 73 初学vue (1)

    前情提要: vue 框架的初学习, 主要是,指令,属性,函数,计算属性,监听属性,钩子,生命周期,过滤器,阻止事件和综合案例todo list 学习准备,感谢学习资源: vue 官网:https:// ...

  2. golang 并发顺序输出数字

    参考 package main import ( "fmt" "sync/atomic" "time" ) func main() { va ...

  3. python安装mysqlclient模块报fatal error: Python.h:解决方法

    在搭建Flask框架安装mysqlclient模块时候老是报fatal error: Python.h:错误,折腾老半天,百度了老半天看了不少大神帖子,就是没解决, 后来发现这不是个BUG,都是自己的 ...

  4. [Leetcode]下一个更大元素II

    题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地 ...

  5. crontab命令使用文档.txt

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  6. 使用代码查看Nutch爬取的网站后生成的SequenceFile信息

    必须针对data文件中的value类型来使用对应的类来查看(把这个data文件,放到了本地Windows的D盘根目录下). 代码: package cn.summerchill.nutch; impo ...

  7. tomcat 最大并发数

    只针对BIO模式,目标请求会sleep两秒再返回结果,通过jmeter测试工具进行并发测试 操作系统:windows && linux tomcat7测试: <Connector ...

  8. javascript中对条件判断语句的优化 分类: JavaScript 2015-06-07 09:54 832人阅读 评论(2) 收藏

    不管写什么程序,平时都会用到条件语句,如:if...else... switch这样的语句,来达到对条件的判断.下面看来一段代码: function abc(test){ if (test == 1) ...

  9. JDK并发包总结

    本文主要介绍jdk中常用的同步控制工具以及并发容器, 其结构如下: 同步控制工具类 ReentrantLock 简而言之, 就是自由度更高的synchronized, 主要具备以下优点. 可重入: 单 ...

  10. tomcat关闭后线程依然运行解决办法

    tomcat关闭后线程依然运行解决办法,设置线程为守护线程 守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户 ...