PHP模型Model类封装数据库操作示例


Posted in PHP onMarch 14, 2019

本文实例讲述了PHP模型Model类封装数据库操作。分享给大家供大家参考,具体如下:

<?php
  //引入配置文件
  include "./config.php";
  class Model
  {
    public $link;//存储连接对象
    public $tableName = "";//存储表名
    public $field = "*";//存储字段
    public $allFields = [];//存储当前表所有字段
    public $where = "";//存储where条件
    public $order = "";//存储order条件
    public $limit = "";//存储limit条件
    /**
     * 构造方法 初始化
     * @param string $tableName 要操作的表名
     */
    public function __construct($tableName)
    {
      //1.存储操作的表名
      $this->tableName = PRE.$tableName;
      //2.初始化连接数据库
      $this->getConnect();
      //3.获得当前表的所有字段
      $this->getFields();
    }
    /**
     * 初始化连接数据库操作
     */
    public function getConnect()
    {
      //1.连接数据库
      $this->link = mysqli_connect(HOST,USER,PWD,DB,PORT);
      //2.判断连接
      if (mysqli_connect_errno($this->link)>0){
        echo mysqli_connect_error($this->link);
        exit;
      }
    }
    /**
     * 执行并发送SQL(查询)
     * @param string $sql 要查询的SQL语句
     * @return array 返回查询出来的二维数组
     */
    public function query($sql)
    {
      $result = mysqli_query($this->link,$sql);
      if ($result && mysqli_num_rows($result)>0) {
       $arr = [];
       while($row = mysqli_fetch_assoc($result)){
          $arr[] = $row;
       }
      }
    return $arr;
    }
    /**
     * 获取当前表的所有字段
     */
    public function getFields()
    {
      //查看表结构
      $sql = "desc {$this->tableName}";
      //执行并发送SQL
      $result = $this->query($sql);
      $fields = [];
      foreach ($result as $k => $v){
        $fields[] = $v['Field'];
      }
      $this->allFields = $fields;
    }
    /**
     * 执行并发送SQL语句(增删改)
     * @param string $sql 要执行的SQL语句
     * @return bool|int|string 添加成功则返回上一次操作id,删除修改操作则返回true,失败则返回false
     */
    public function exec($sql)
    {
      $result = mysqli_query($this->link,$sql);
      //处理结果集
      if ($result && mysqli_affected_rows($this->link)>0){
        //判断是否为添加操作,是则返回上一次执行的id
        if (mysqli_insert_id($this->link)){
          return mysqli_insert_id($this->link);
        }
        //删除修改操作成功则返回true
        return true;
      }else{
        //未执行成功则返回false
        return false;
      }
    }
    /**
     * 查询多条数据
     */
    public function select()
    {
      $sql = "select {$this->field} from {$this->tableName} {$this->where} {$this->order} {$this->limit}";
      //执行并发送SQL
      return $this->query($sql);
    }
    /**
     * 查询一条数据
     * @param string $id 要查询的id
     * @return array 返回一条数据
     */
    public function find($id="")
    {
      //判断id是否存在
      if (empty($id)){
        $where = $this->where;
      }else{
        $where = "where id={$id}";
      }
      $sql = "select {$this->field} from {$this->tableName} {$where} limit 1";
      //执行并发送sql
      $result = $this->query($sql);
      //返回一条数据
      return $result[0];
    }
    /**
     * 设置要查询的字段信息
     * @param string $field 要查询的字段
     * @return object 返回自己,保证连贯操作
     */
    public function field($field)
    {
      //判断字段是否存在
      if (empty($field)){
        return $this;
      }
      $this->field = $field;
      return $this;
    }
    /**
     * 统计总条数
     * @return int 返回总数
     */
    public function count()
    {
      //准备SQL语句
      $sql = "select count(*) as total from {$this->tableName} limit 1";
      $result = $this->query($sql);
      //返回总数
      return $result[0]['total'];
    }
    /**
     * 添加操作
     * @param array $data 要添加的数组
     * @return bool|int|string 添加成功则返回上一次操作的id,失败则返回false
     */
    public function add($data){
      //判断是否是数组
      if (!is_array($data)){
        return $this;
      }
      //判断是否全是非法字段
      if (empty($data)){
        die("非法数据");
      }
      //过滤非法字段
      foreach ($data as $k => $v){
        if (!in_array($k,$this->allFields)){
          unset($data[$k]);
        }
      }
      //将数组中的键取出
      $keys = array_keys($data);
      //将数组中取出的键转为字符串拼接
      $key = implode(",",$keys);
      //将数组中的值转化为字符串拼接
      $value = implode("','",$data);
      //准备SQL语句
      $sql = "insert into {$this->tableName} ({$key}) values('{$value}')";
      //执行并发送SQL
      return $this->exec($sql);
    }
    /**
     * 删除操作
     * @param string $id 要删除的id
     * @return bool 删除成功则返回true,失败则返回false
     */
    public function delete($id="")
    {
      //判断id是否存在
      if (empty($id)){
        $where = $this->where;
      }else{
        $where = "where id={$id}";
      }
      $sql = "delete from {$this->tableName} {$where}";
      echo $sql;
      //执行并发送
      return $this->exec($sql);
    }
    /**
     * 修改操作
     * @param array $data 要修改的数组
     * @return bool 修改成功返回true,失败返回false
     */
    public function update($data){
      //判断是否是数组
      if (!is_array($data)){
        return $this;
      }
      //判断是否是全是非法字段
      if(empty($data)){
        die("非法数据");
      }
      $str = "";
      //过滤非法字段
      foreach ($data as $k => $v){
        if ($k == "id"){
          $where = "where id={$v}";
          unset($data[$k]);
        }
        if (in_array($k,$this->allFields)){
          $str .= "{$k}='{$v}',";
        }else{
          unset($data[$k]);
        }
      }
      //判断是否有条件
      if (empty($this->where)){
        die("请输入条件");
      }
      //去掉最右侧的逗号
      $str = rtrim($str,",");
      $sql = "update {$this->tableName} set {$str} {$this->where}";
      return $this->exec($sql);
    }
    /**
     * where条件
     * @param string $where 输入的where条件
     * @return $this 返回自己,保证连贯操作
     */
    public function where($where)
    {
      $this->where = "where ".$where;
      return $this;
    }
    /**
     * order排序条件
     * @param string $order 以此为基准进行排序
     * @return $this 返回自己,保证连贯操作
     */
    public function order($order)
    {
      $this->order = "order by ".$order;
      return $this;
    }
    /**
     * limit条件
     * @param string $limit 输入的limit条件
     * @return $this 返回自己,保证连贯操作
     */
    public function limit($limit)
    {
      $this->limit = "limit ".$limit;
      return $this;
    }
    /**
     * 析构方法
     * 关闭数据库连接
     */
    public function __destruct()
    {
      mysqli_close($this->link);
    }
  }
 //自行调试
 $a = new Model("表名");
 // var_dump($a->find(3));
 // var_dump($a->select());
  // var_dump($a->count());
  // $res = $a->select();
  //var_dump($res);
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
web方式ftp
Oct 09 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
Jun 28 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
php之CodeIgniter学习笔记
Jun 17 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
php和html的区别点详细总结
Sep 24 PHP
laravel请求参数校验方法
Oct 10 PHP
php中pcntl_fork创建子进程的方法实例
Mar 14 #PHP
PHP7内核之Reference详解
Mar 14 #PHP
掌握PHP垃圾回收机制详解
Mar 13 #PHP
浅谈php的TS和NTS的区别
Mar 13 #PHP
浅谈PHP各环境下的伪静态配置
Mar 13 #PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 #PHP
Laravel事件监听器用法实例分析
Mar 12 #PHP
You might like
php中{}大括号是什么意思
2013/12/01 PHP
php字符串操作常见问题小结
2016/10/11 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
js实现交通灯效果
2017/01/13 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python开发的HTTP库requests详解
2017/08/29 Python
Python探索之自定义实现线程池
2017/10/27 Python
Python用SSH连接到网络设备
2021/02/18 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
C#面试问题
2016/07/29 面试题
医学类个人求职信范文
2014/02/05 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers