class Model{//数据库连接protected $link;//主机地址protected $host;//用户名protected $user;//密码protected $pwd;//数据库名protected $dbName;//数据表名protected $tableName;//字符集protected $charset;//表前缀protected $prefix;//缓存字段protected $fields;//缓存目录protected $cache;//保存所有的参数protected $options;//支持的聚合函数列表protected $funcList = ['count','max','min','avg','sum'];//保存最后执行的SQL语句protected $sql;public function __construct($config=null){if (empty($config)) {if (empty($GLOBALS['database'])) {$config = include('config/database.php');} else {$config = $GLOBALS['database'];}}$this->host = $config['DB_HOST'];$this->user = $config['DB_USER'];$this->pwd = $config['DB_PWD'];$this->dbName = $config['DB_NAME'];$this->prefix = $config['DB_PREFIX'];$this->charset = $config['DB_CHARSET'];$this->cache = $this->checkCache($config['DB_CACHE']);if (!($this->link = $this->connect())) {exit('数据库连接失败');}$this->tableName = $this->getTableName();$this->fields = $this->getFields();$this->options = $this->initOptions();}protected function connect(){$link = mysqli_connect($this->host,$this->user,$this->pwd);if (!$link) {return false;}if (!mysqli_select_db($link,$this->dbName)) {mysqli_close($link);return false;}if (!mysqli_set_charset($link,$this->charset)) {mysqli_close($link);return false;}return $link;}public function where($where){if (is_string($where)) {$this->options['where'] = 'where ' . $where;} else if (is_array($where)) {$this->options['where'] = 'where ' . join(' and ',$where);}return $this;}public function group($group){if (is_string($group)) {$this->options['group'] = 'group by ' . $group;} else if (is_array($group)) {$this->options['group'] = 'group by ' . join(',',$group);}return $this;}public function order($order){if (is_string($order)) {$this->options['order'] = 'order by ' . $order;} else if (is_array($order)) {$this->options['order'] = 'order by ' . join(',',$order);}return $this;}public function having($having){if (is_string($having)) {$this->options['having'] = 'having ' . $having;} else if (is_array($having)) {$this->options['having'] = 'having ' . join(' and ',$having);}return $this;}public function limit($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 table($table){if (is_string($table)) {$table = explode(',', $table);}if (is_array($table)) {foreach ($table as $key => $value) {$value = ltrim($value,$this->prefix);$table[$key] = $this->prefix . $value;}$this->options['table'] = join(',',$table);}return $this;}public function fields($fields){if (is_string($fields)) {$this->options['fields'] = $fields;} else if (is_array($fields)) {$this->options['fields'] = join(',',$fields);}return $this;}public function insert($data,$insertId=false){//必须是数组if (!is_array($data)) {return '插入时传递的参数必须是数组';}$data = $this->fieldsFilter($data);$this->options['fields'] = join(',',array_keys($data));$this->options['values'] = join(',',$data);$sql = 'INSERT INTO %TABLE%(%FIELDS%) VALUES(%VALUES%)';$sql = str_replace(['%FIELDS%','%TABLE%','%VALUES%',],[$this->options['fields'],$this->options['table'],$this->options['values'],],$sql);return $this->exec($sql,$insertId);}public function delete(){if (empty($this->options['where'])) {return '删除数据时请务必写上条件';}$sql = 'DELETE FROM %TABLE% %WHERE% %ORDER% %LIMIT%';$sql = str_replace(['%TABLE%','%WHERE%','%ORDER%','%LIMIT%',],[$this->options['table'],$this->options['where'],$this->options['order'],$this->options['limit'],],$sql);return $this->exec($sql);}public function update($data){if (empty($this->options['where'])) {return '更新数据时请务必写上条件';}if (!is_array($data)) {return '必须传递数组';}$data = $this->checkUpdate($data);$this->options['set'] = $data;$sql = 'UPDATE %TABLE% SET %SET% %WHERE% %ORDER% %LIMIT%';$sql = str_replace(['%TABLE%','%SET%','%WHERE%','%ORDER%','%LIMIT%',],[$this->options['table'],$this->options['set'],$this->options['where'],$this->options['order'],$this->options['limit'],],$sql);return $this->exec($sql);}public function select($resultType = MYSQLI_BOTH){$sql = 'SELECT %FIELDS% FROM %TABLE% %WHERE% %ORDER% %GROUP% %HAVING% %LIMIT%';$sql = str_replace(['%FIELDS%','%TABLE%','%WHERE%','%ORDER%','%GROUP%','%HAVING%','%LIMIT%',],[$this->options['fields'],$this->options['table'],$this->options['where'],$this->options['order'],$this->options['group'],$this->options['having'],$this->options['limit'],],$sql);return $this->query($sql,$resultType);}public function getLastSql(){return $this->sql;}protected function exec($sql,$insertId=false){//保存SQL语句$this->sql = $sql;//每次执行完SQL语句都要初始化条件$this->options = $this->initOptions();$result = mysqli_query($this->link,$sql);if ($result && $insertId) {return mysqli_insert_id($this->link);}return $result;}protected function query($sql,$resultType = MYSQLI_BOTH){//保存SQL语句$this->sql = $sql;//每次执行完SQL语句都要初始化条件$this->options = $this->initOptions();$result = mysqli_query($this->link,$sql);if ($result) {return mysqli_fetch_all($result,$resultType);}return $result;}protected function initOptions(){$fields = join(',',array_unique($this->fields));return ['where' => '','order' => '','group' => '','having' => '','limit' => '','fields' => $fields,'table' => $this->tableName,];}protected function getFields(){//拼接缓存文件路径名$cacheFile = $this->cache . $this->tableName . '.php';if (file_exists($cacheFile)) {return include($cacheFile);}//不存在需要进行缓存处理$sql = 'desc ' . $this->tableName;$result = mysqli_query($this->link,$sql);$result = mysqli_fetch_all($result,MYSQLI_ASSOC);$fields = [];foreach ($result as $key => $value) {if ($value['Key'] == 'PRI') {$fields['_pk'] = $value['Field'];}$fields[] = $value['Field'];}$data = "<?php \n return " . var_export($fields,true) . ';';file_put_contents($cacheFile,$data);return $fields;}protected function getTableName(){if ($this->tableName) {return $this->prefix . $this->tableName;}//\index\model\User$className = get_class($this);if ($pos = strrpos($className,'\\')) {$className = strtolower(substr($className, $pos+1));}return $this->prefix . $className;}protected function checkCache($dir){$dir = rtrim($dir,'/') . '/';if (!is_dir($dir)) {mkdir($dir,0777,true);}if (!is_readable($dir) || !is_writable($dir)) {chmod($dir, 0777);}return $dir;}protected function fieldsFilter($data){$fields = array_flip($this->fields);$data = array_intersect_key($data,$fields);foreach ($data as $key => $value) {if (is_string($value)) {$data[$key] = '\'' . $value . '\'';}}return $data;}protected function checkUpdate($data){$data = $this->fieldsFilter($data);$realData = '';foreach ($data as $key => $value) {$realData .= $key . '=' . $value . ',';}return substr($realData,0,-1);}public function getBy($field,$value){//将驼峰转换为下划线 RegTime => reg_time$realField = strtolower($field[0]);$len = strlen($field);for ($i=1; $i < $len; $i++) {$lower = strtolower($field[$i]);if ($lower != $field[$i]) {$realField .= '_';}$realField .= $lower;}if (is_string($value)) {$value = '\'' . $value . '\'';}$where = $realField . '=' .$value;return $this->where($where)->select();}public function calc($option,$field=null){if (!in_array($option,$this->funcList)) {return false;}if (is_null($field)) {$field = $this->fields['_pk'];}$sql = "select $option($field) as $option from $this->tableName";$result = $this->query($sql);return $result[0][$option];}public function find($pk){return $this->getBy($this->fields['_pk'],$pk);}public function __call($name,$args){if (strncmp($name, 'getBy', 5) == 0) {$field = substr($name,5);return $this->getBy($field,$args[0]);}if (in_array($name,$this->funcList)) {$arg = empty($args) ? null : $args[0];return $this->calc($name,$arg);}return false;}}

php model类,PHP培训之PHP Model类相关推荐

  1. 三部门部署开展非学科类校外培训收费专项整治工作

    1月30日消息,据教育部网站消息,近日,针对当前社会反映强烈的非学科类校外培训机构恶意涨价.违规倾销课时等突出问题,教育部.国家发改委.市场监管总局联合印发通知,部署开展非学科类校外培训收费专项整治工 ...

  2. 线上每课时20元 北京上海义务教育阶段学科类校外培训指导价公布

    1月2日消息,近日,北京.上海相继公布了义务教育阶段学科类校外培训政府指导价. 北京市市发改委会同市教委.市市场监管局发布<北京市义务教育阶段学科类校外培训收费管理办法(试行)>,并同步出 ...

  3. WideDeep Model、Wide Model(LR)、Deep Model、DeepFm Model、NFM Model复现笔记

    声明:本模型复现笔记记录自己学习过程,如果有错误请各位老师批评指正. 本周复现了Wide&Deep Model.Wide Model.Deep Model.DeepFm Model.NFM M ...

  4. [附源码]java毕业设计学科类校外培训机构课程监管系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  5. 信息类产品检测培训讲义-EN55024

    一,信息类产品CE认证测试标准 EN55022 , EN55024 , EN60950 二,定义 ITE (INFORMATION TECHNOLOGY EQUIPMENT)信息技术设备 A,能对数据 ...

  6. java 元类_[译]什么是元类metaclass?

    类即对象 在理解元类之前,需要先掌握Python中的类,Python中类的概念与SmallTalk中类的概念相似. 在大多数语言中,类是用来描述如何创建对象的代码段,这在Python中也是成立的: & ...

  7. startuml java 类图_【StarUML】类图

    类图是可视化地表现类的属性和方法,以及类与类之间的关系. 1.类 a.类 普通实体类,它有对应的属性和方法: 双击类名,会弹出一些控制按钮: 右边区域,各个图标的含义依次是: 增加类的属性.增加类的操 ...

  8. 【C++学习】类与对象(一)——类的定义与对象实例

    一.面向对象程序设计的基本特点 1.1 抽象 面向对象方法中的抽象 ,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程. 一个问题的抽象包括:数据抽象和行为抽象(或被称为功能抽象 ...

  9. yii2 html帮助类,Yii2 学习笔记之助手类(HelperClass)

    一.数组助手类 // 常用的就是建立哈希表,map()方法.一般在使用dropDownList的时候, // 会从查询出来的对象列表中获取到这样的$array供其使用. // 参考http://www ...

最新文章

  1. tf.nn.max_pool 理解
  2. 被动路由跟踪工具InTrace
  3. 一图简述大数据技术生态圈
  4. leetcode 310. Minimum Height Trees | 310. 最小高度树(图的邻接矩阵DFS / 拓扑排序)
  5. martin fowler_用Java和Java 8创建内部DSL,采用Martin Fowler的方法
  6. Python的gevent协程及协程概念
  7. 程序员面试金典 - 面试题 02.05. 链表求和
  8. Python练习:整数加减和
  9. ES8新特性_async函数---JavaScript_ECMAScript_ES6-ES11新特性工作笔记048
  10. mysql order优化2019_mysql 增加排序 性能差很多 怎么优化
  11. Navicat的MySQL注册码
  12. 电脑不断弹窗的解决办法
  13. android camera预览翻转,android camera yuv帧水平翻转实例
  14. 轻度折腾nuc8i5beh
  15. 2022年3月15日黑马第三天
  16. PMP(第六版)中的沟通方法
  17. 牛逼的Python库MoviePy!利用Python自动剪辑tiktok视频!
  18. java千克和磅之间的转换,进行打印
  19. win10系统下配置maven环境
  20. php爬虫全国地址信息

热门文章

  1. 某快手程序员吐槽:月薪四万很惶恐!和老婆亲热时都在想工作,薪资越高,做人越怂!...
  2. Leader每天996,绩效被打C!CTO说,团队带不好,原因只有一个
  3. 写代码做副业月入50K+的方法都藏在这几个抖音、拼多多大佬的公众号里
  4. 一份可以同时满足传统与互联网业务的Dev平台攻略
  5. 近些年有哪些口碑炸裂的项目管理工具?各具特色的项目管理工具我们该如何选择?
  6. Leangoo敏捷开发工具怎么添加成员
  7. 关于中台的思考与尝试
  8. 关于卡尔曼滤波和粒子滤波最直白的解释
  9. win10自带Ubuntu
  10. 二叉树-二叉树的最小深度(递归法)