php学习之Model类
- <?php
- $config = include 'config.php'; //引入数据库配置文件
- $model = new Model($config);
- //测试案例
- // $saveData=['username'=>'张三','mobile'=>12334123];
- // echo $model->table('user')->insert($saveData);
- // var_dump($model->table('user')->where('id=5')->delete());
- // var_dump($model->table('user')->limit('0,6')->field('username,mobile')->where('id>1')->order('id desc')->select());
- // $updateData=['username'=>'张三'];
- // var_dump($model->table('user')->where('id=3')->update($updateData));
- // var_dump($model->table('user')->max('mobile'));
- // var_dump($model->table('user')->getByUserName('张三'));
- // var_dump($model->sql);
- class Model
- {
- //主机名
- protected $host;
- //用户名
- protected $user;
- //密码
- protected $pwd;
- //数据库名
- protected $dbname;
- //字符集
- protected $charset;
- //数据库前缀
- protected $prefix;
- //数据库连接资源
- protected $link;
- //数据表名 这里可以自己指定表名
- protected $tableName;
- //sql语句
- protected $sql;
- //操作数组 存放的就是所有的查询条件
- protected $options;
- /**
- * 构造方法,对成员变量进行初始化
- *
- * @param [type] $config
- */
- function __construct($config)
- {
- //对成员变量一一进行初始化
- $this->host = $config['DB_HOST'];
- $this->user = $config['DB_USER'];
- $this->pwd = $config['DB_PWD'];
- $this->dbname = $config['DB_NAME'];
- $this->charset = $config['DB_CHARSET'];
- $this->prefix = $config['DB_PREFIX'];
- //连接数据库
- $this->link = $this->connect();
- //得到数据表名 user===>UserModel
- $this->tableName = $this->getTableName();
- //初始化option数组
- $this->initOptions();
- }
- /**
- * 连接数据库
- *
- * @return void
- */
- protected function connect()
- {
- $link = mysqli_connect($this->host, $this->user, $this->pwd);
- if (!$link) {
- die('数据库连接失败');
- }
- //选择数据库
- mysqli_select_db($link, $this->dbname);
- //设置字符集
- mysqli_set_charset($link, $this->charset);
- //返回连接成功的资源
- return $link;
- }
- /**
- * 得到数据表名
- *
- * @return void
- */
- protected function getTableName()
- {
- //第一种,如果设置了成员变量,那么通过成员变量来得到表名
- if (!empty($this->tableName)) {
- return $this->prefix . $this->tableName;
- }
- //第二种,如果没有设置成员变量,那么通过类名来得到表名
- //得到当前类名字符串
- $className = get_class($this);
- //user UserModel goods GoodsModel
- $table = strtolower(substr($className, 0, -5));
- return $this->prefix . $table;
- }
- /**
- * 初始化option数组
- *
- * @return void
- */
- protected function initOptions()
- {
- $arr = ['where', 'table', 'field', 'order', 'group', 'having', 'limit'];
- foreach ($arr as $value) {
- //将options数组中这些键对应的值全部清空
- $this->options[$value] = '';
- if ($value === 'table') {
- $this->options[$value] = $this->tableName;
- } elseif ($value == 'field') {
- $this->options[$value] = '*';
- }
- }
- }
- /**
- * field方法
- *
- * @param [type] $field
- * @return void
- */
- function field($field)
- {
- //如果不为空,再进行处理
- if (!empty($field)) {
- if (is_string($field)) {
- $this->options['field'] = $field;
- } elseif (is_array($field)) {
- $this->options['field'] = join(',', $field);
- }
- }
- return $this;
- }
- /**
- * //table方法
- *
- * @param [type] $table
- * @return void
- */
- function table($table)
- {
- if (!empty($table)) {
- $this->options['table'] = $this->prefix . $table;
- }
- return $this;
- }
- /**
- * where方法
- *
- * @param [type] $where
- * @return void
- */
- function where($where)
- {
- if (!empty($where)) {
- $this->options['where'] = 'where ' . $where;
- }
- return $this;
- }
- /**
- * group方法
- *
- * @param [type] $group
- * @return void
- */
- function group($group)
- {
- if (!empty($group)) {
- $this->options['group'] = 'group by ' . $group;
- }
- return $this;
- }
- /**
- * having方法
- *
- * @param [type] $having
- * @return void
- */
- function having($having)
- {
- if (!empty($having)) {
- $this->options['having'] = 'having ' . $having;
- }
- return $this;
- }
- /**
- * order方法
- *
- * @param [type] $order
- * @return void
- */
- function order($order)
- {
- if (!empty($order)) {
- $this->options['order'] = 'order by ' . $order;
- }
- return $this;
- }
- /**
- * limit方法
- *
- * @param [type] $limit
- * @return void
- */
- function limit($limit)
- {
- if (!empty($limit)) {
- if (is_string($limit)) {
- $this->options['limit'] = 'limit ' . $limit;
- } elseif (is_array($limit)) {
- $this->options['limit'] = 'limit ' . join(',', $limit);
- }
- }
- return $this;
- }
- /**
- * select方法
- *
- * @return void
- */
- function select()
- {
- //先预写一个带占位符的sql语句
- $sql = 'select %FIELD% from %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%';
- //将options中对应的值依次的替换上面的占位符
- $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
- );
- //保存一份sql语句
- $this->sql = $sql;
- //执行sql语句
- return $this->query($sql);
- }
- /**
- * query
- *
- * @param [type] $sql
- * @return void
- */
- function query($sql)
- {
- //清空option数组中的值
- $this->initOptions();
- //执行sql语句
- $result = mysqli_query($this->link, $sql);
- //提取结果集存放到数组中
- if ($result && mysqli_affected_rows($this->link)) {
- while ($data = mysqli_fetch_assoc($result)) {
- $newData[] = $data;
- }
- }
- //返回结果集
- return $newData;
- }
- /**
- * exec
- *
- * @param [type] $sql
- * @param boolean $isInsert
- * @return void
- */
- function exec($sql, $isInsert = false)
- {
- //清空option数组中的值
- $this->initOptions();
- //执行sql语句
- $result = mysqli_query($this->link, $sql);
- if ($result && mysqli_affected_rows($this->link)) {
- //判断是否是插入语句,根据不同的语句返回不同的结果
- if ($isInsert) {
- return mysqli_insert_id($this->link);
- } else {
- return mysqli_affected_rows($this->link);
- }
- }
- return false;
- }
- function __get($name)
- {
- if ($name == 'sql') {
- return $this->sql;
- }
- return false;
- }
- /**
- * insert函数
- * insert into 表名(字段) value(值)
- *
- * @param [type] $data 关联数组,键就是字段名,值是字段值
- * @return void
- */
- function insert($data)
- {
- //处理值是字符串问题,两边需要添加单或双引号
- $data = $this->parseValue($data);
- //提取所有的键,即就是所有的字段
- $keys = array_keys($data);
- //提取所有的值
- $values = array_values($data);
- //增加数据的sql语句
- $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);
- }
- /**
- * 传递进来一个数组,将数组中值为字符串的两边加上引号
- *
- * @param [type] $data
- * @return void
- */
- protected function parseValue($data)
- {
- //遍历数组,判断是否为字符串,若是字符串,将其两边添加引号
- foreach ($data as $key => $value) {
- if (is_string($value)) {
- $value = '"' . $value . '"';
- }
- $newData[$key] = $value;
- }
- //返回处理后的数组
- return $newData;
- }
- /**
- * 删除函数
- *
- * @return void
- */
- function delete()
- {
- //拼接sql语句
- $sql = 'delete from %TABLE% %WHERE%';
- $sql = str_replace(['%TABLE%', '%WHERE%'], [$this->options['table'], $this->options['where']], $sql);
- //保存sql语句
- $this->sql = $sql;
- //执行sql语句
- return $this->exec($sql);
- }
- /**
- * 更新函数
- * update 表名 set 字段名=字段值,字段名=字段值 where
- *
- * @param [type] $data
- * @return void
- */
- function update($data)
- {
- //处理$data数组中值为字符串加引号的问题
- $data = $this->parseValue($data);
- //将关联数组拼接为固定的格式 键=值,键=值
- $value = $this->parseUpdate($data);
- //准备sql语句
- $sql = 'update %TABLE% set %VALUE% %WHERE%';
- $sql = str_replace(['%TABLE%', '%VALUE%', '%WHERE%'], [$this->options['table'], $value, $this->options['where']], $sql);
- //保存sql语句
- $this->sql = $sql;
- //执行sql语句
- return $this->exec($sql);
- }
- /**
- * 将关联数组拼接为固定的格式
- *
- * @param [type] $data
- * @return void
- */
- protected function parseUpdate($data)
- {
- foreach ($data as $key => $value) {
- $newData[] = $key . '=' . $value;
- }
- return join(',', $newData);
- }
- /**
- * max函数
- *
- * @param [type] $field
- * @return void
- */
- function max($field)
- {
- //通过调用自己封装的方法进行查询
- $result = $this->field('max(' . $field . ') as max')->select();
- //select方法返回的是一个二维数组
- return $result[0]['max'];
- }
- /**
- * 析构方法
- */
- function __destruct()
- {
- mysqli_close($this->link);
- }
- /**
- * getByName getByAge
- *
- * @param [type] $name
- * @param [type] $args
- * @return void
- */
- function __call($name, $args)
- {
- //获取前5个字符
- $str = substr($name, 0, 5);
- //获取后面的字段名
- $field = strtolower(substr($name, 5));
- //判断前五个字符是否是getby
- if ($str === 'getBy') {
- return $this->where($field . '="' . $args[0] . '"')->select();
- }
- return false;
- }
- }
confing数据库配置文件,confing.php
- <?php
- return [
- 'DB_HOST'=>'localhost',
- 'DB_USER'=>'root',
- 'DB_PWD'=>'123456',
- 'DB_NAME'=>'test',
- 'DB_CHARSET'=>'utf8',
- 'DB_PREFIX'=>'t_',
- ];
php学习之Model类的更多相关文章
- (转)Qt Model/View 学习笔记 (三)——Model类
Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...
- Yaf零基础学习总结5-Yaf类的自动加载
Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...
- django学习之Model(二)
继续(一)的内容: 1-跨文件的Models 在文件头部import进来,然后用ForeignKey关联上: from django.db import models from geography.m ...
- mvc中动态给一个Model类的属性设置验证
原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这 ...
- python入门学习:8.类
python入门学习:8.类 关键点:类 8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类 8.1 创建和使用类 面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写 ...
- python学习(十)元类
python 可以通过`type`函数创建类,也可通过type判断数据类型 import socket from io import StringIO import sys class TypeCla ...
- 新建一个Model类的注意事项
昨天在工作中新建了一个Model类在测试环境测试一点问题也没有,到了生产环境就报错了,由于调用的是分页类,报错说:在520行 _count() 函数不存在. 我的思路是:先到生产环境查看了具体的报错文 ...
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- 第15.23节 PyQt(Python+Qt)入门学习:Model/View架构中QListView视图配套Model的开发使用
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 QListView理论上可以和所有QAbstractItemModel派生的类如QStri ...
随机推荐
- printPreviewControl1怎么刷新文档
printPreviewControl1.InvalidatePreview(); 调用printPreviewControl1控件的 InvalidatePreview() 这个方法即可.
- 高射炮打蚊子,杀鸡用绝世好剑:在SAP Kyma上运行UI5应用
国人在表述"大材小用"这个场景时,总喜欢用一些实物来类比,比如:高射炮打蚊子. 英国QF 3.7英寸(94mm)高射炮,战斗全重超过9.3吨,全长近5米,最大射程约18公里,最大射 ...
- vue组件间的传值方式及方法调用汇总
1.传值 a.父组件传子组件 方法一: 父页面: <myReportContent v-if="contentState==1" :paramsProps='paramsPr ...
- CentOS7安装CDH 第二章:CentOS7各个软件安装和启动
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- python读取图像后变换通道顺序
直接通过python矩阵操作变换,简单高效 org_img = cv2.imread('cat.jpg') img = org_img[:, :, ::-1] 其中,[::-1] 表示顺序相反操作 , ...
- mac使用sourcetree跳过注册
转自https://blog.csdn.net/qq_32890891/article/details/89216954 打开sourcetree 关闭sourcetree 命令终端输入default ...
- Linux下zookeeper集群搭建
Linux下zookeeper集群搭建 部署前准备 下载zookeeper的安装包 http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper ...
- Educational Codeforces Round 76 (Rated for Div. 2) D
D题 原题链接 题意:就是给你n个怪兽有一个属性(攻击力),m个英雄,每个英雄有两种属性(分别为攻击力,和可攻击次数),当安排最好的情况下,最少的天数(每选择一个英雄出战就是一天) 思路:因为怪兽是不 ...
- uhd镜像重新安装
USRP LW-X300连接网口,设置IP地址:192.168.10.1,子网验码:255.255.255.0 连接后uhd_usrp_probe提示更新镜像. 终端输入: uhd_image_loa ...
- The "web.xml" is called web application deployment descriptor
3.3 Configure the Application Deployment Descriptor - "web.xml" A web user invokes a serv ...