截止目前已经改造了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. MariaDB 用户与权限管理(12)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  2. C#6.0语言规范(十八) 不安全代码

    前面章节中定义的核心C#语言与C和C ++的区别在于它省略了作为数据类型的指针.相反,C#提供了引用和创建由垃圾收集器管理的对象的能力.这种设计与其他功能相结合,使C#成为比C或C ++更安全的语言. ...

  3. centos7 升级GCC版本到7.3.0

    废话不多说,直接上shell,还是比较简单的.就是编译时间有点长... 都是以小时计的......,我刀片机上面一台虚拟机反正是等了3个小时 #必备组件安装 yum install -y gcc gc ...

  4. odoo开发笔记-自定义发送邮件模板

    1. 首先激活开发者模式 2. 点击设置 - Email - 模板 - “选择你需要修改的模板” 我们以销售模块-报价单 邮件模板为例 来说明. quote order 原先默认模板,发出的邮件显示效 ...

  5. Centos 7 快速搭建IOS可用IPsec

    安装 strongswan yum install -y http://ftp.nluug.nl/pub/os/Linux/distr/fedora-epel/7/x86_64/Packages/e/ ...

  6. MySQL笔记(4)---表

    1.前言 上一章记录了MySQL中的一些文件组成,以及相关作用和参数配置,本章开始记录深层次的存储结构,以便更好理解MySQL的设计. 2.索引组织表 InnoDB中,表都是根据主键顺序组织存放的,这 ...

  7. IDEA中Git的使用基础

    场景概述 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 ...

  8. Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题

    Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题 相关文章: Dubbo源码学习文章目录 前言 主要是前一阵子换了工作,第一个任务就是解决目前团队在 Dubbo 停机时产生的问题 ...

  9. JAVA多线程Thread VS Runnable详解

    要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件   进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也 ...

  10. sql的存储过程实例--循环动态创建表

    创建一个存储过程,动态添加100张track表表名track_0 ~~ track_99注:sql的拼接只能用 CONCAT()函数 -- 创建一个存储过程 CREATE PROCEDURE crea ...