PHP封装的数据库模型Model类完整示例【基于PDO】


Posted in PHP onMarch 14, 2019

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

<?php
    //引入配置文件
    include "../Config/config.php";
    class Model extends PDO
    {
        protected $tableName = "";//存储表名
        protected $sql = "";//存储最后执行的SQL语句
        protected $limit = "";//存储limit条件
        protected $order = "";//存储order排序条件
        protected $field = "*";//存储要查询的字段
        protected $where = "";//存储where条件
        protected $allFields = [];//存储当前表的所有字段
        /**
         * 构造方法 初始化
         * @param string $tableName 要操作的表名
         */
        public function __construct($tableName)
        {
            //连接数据库
            parent::__construct('mysql:host='.HOST.';dbname='.DB.';charset=utf8;port='.PORT,USER,PWD);
            //存储表名
            $this->tableName = PRE.$tableName;
            //获取当前数据表中有哪些字段
            $this->getFields();
        }
        /**
         * 获取当前表的所有字段
     * @return array 成功则返回一维数组字段
         */
        public function getFields()
        {
            //查看当前表结构
            $sql = "desc {$this->tableName}";
            $res = $this->query($sql);//返回pdo对象
          //var_dump($res);
            if ($res) {
                $arr = $res->fetchAll(2);
                //var_dump($arr);
                //从二维数组中取出指定下标的列
                $this->allFields =    array_column($arr,"Field");
                return $this->allFields;
            } else {
                die("表名错误");
            }
        }
        /**
         * 添加操作
         * @param array $data 要添加的数组
         * @return int 返回受影响行数
         */
        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}')";
            $this->sql = $sql;
            //执行并发送SQL,返回受影响行数
            return (int)$this->exec($sql);
        }
        /**
         * 删除操作
         * @param string $id 要删除的id
         * @return int 返回受影响行数
         */
        public function delete($id="")
        {
            //判断id是否存在
            if (empty($id)) {
                $where = $this->where;
            }else{
                $where = "where id={$id}";
            }
            $sql = "delete from {$this->tableName} {$where}";
      $this->sql = $sql;
            //执行并发送SQL,返回受影响行数
            return (int)$this->exec($sql);
        }
    /**
     * 修改操作
     * @param array $data 要修改的数组
     * @return int 返回受影响行数
     */
    public function update($data)
    {
      //判断是否是数组
      if (!is_array($data)){
        return $this;
      }
      //判断是否全是非法字段
      if (empty($data)) {
        die('全是非法字段');
      }
      $str = "";
      //过滤非法字段
      foreach ($data as $k=>$v) {
        //字段为id时,判断id是否存在的
        if ($k == "id"){
          $this->where = "where id={$v}";
          unset($data[$k]);
          continue;
        }
        //若字段不为id,则过滤后再拼接成set字段
        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}";
      //echo $sql;
      $this->sql = $sql;
      return (int)$this->exec($sql);
    }
    /**
     * 查询多条数据
     * @return array 成功返回二维数组,失败返回空数组
     */
        public function select()
    {
          $sql = "select {$this->field} from {$this->tableName} {$this->where} {$this->order} {$this->limit}";
      $this->sql = $sql;
      //执行SQL,结果集是一个对象
          $res = $this->query($sql);
          //判断是否查询成功,
      if ($res){
        //成功返回二维数组
        return $res->fetchAll(2);
      }
      //失败返回空数组
      return [];
    }
    /**
     * 查询一条数组
     * @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} {$this->order} limit 1";
      $this->sql = $sql;
      //执行sql,结果集为对象
      $res = $this->query($sql);
      //判断是否查询成功
      if ($res){
        //成功则返回一条数据(一维数组)
        $result = $res->fetchAll(2);
        return $result[0];
      }
      //失败返回空数组
      return [];
    }
    /**
     * 统计总数目
     * @return int 返回总数
     */
    public function count()
    {
      $sql = "select count(*) as total from {$this->tableName} {$this->where} limit 1";
      $this->sql = $sql;
      //执行SQL,结果集为对象
      $res = $this->query($sql);
      //处理结果集
      if ($res){
       $result = $res->fetchAll(2);
       //var_dump($result);
        return $result[0]["total"];
      }
      return 0;
    }
    /**
     * 设置要查询的字段信息
     * @param string $field 要查询的字段
     * @return object 返回自己,保证连贯操作
     */
    public function field($field)
    {
      //判断字段是否存在
      if (empty($filed)){
        return $this;
      }
      $this->field = $field;
      return $this;
    }
    /**
     * 获取最后执行的sql语句
     * @return string sql语句
     */
    public function _sql()
    {
      return $this->sql;
    }
    /**
     * where条件
     * @param string $where 要输入的where条件
     * @return object 返回自己,保证连贯操作
     */
    public function where($where)
    {
      $this->where = "where ".$where;
      return $this;
    }
    /**
     * order条件
     * @param string $order 要输入的order条件
     * @return object 返回自己,保证连贯操作
     */
    public function order($order)
    {
      $this->order = "order by ".$order;
      return $this;
    }
    /**
     * limit条件
     * @param string $limit 要输入的limit条件
     * @return object 返回自己,保证连贯操作
     */
    public function limit($limit)
    {
      $this->limit = "limit ".$limit;
      return $this;
    }
}

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

PHP 相关文章推荐
如何使用PHP中的字符串函数
Nov 24 PHP
PHP数字格式化
Dec 06 PHP
php缓存技术详细总结
Aug 07 PHP
php中explode函数用法分析
Nov 15 PHP
php面向对象与面向过程两种方法给图片添加文字水印
Aug 26 PHP
php cookie工作原理与实例详解
Jul 18 PHP
php简单统计中文个数的方法
Sep 30 PHP
PHP数组式访问接口ArrayAccess用法分析
Dec 28 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 PHP
php经典趣味算法实例代码
Jan 21 PHP
PHP大文件分割分片上传实现代码
Dec 09 PHP
PHP模型Model类封装数据库操作示例
Mar 14 #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
You might like
PHP的基本常识小结
2013/07/05 PHP
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
Js 刷新框架页的代码
2010/04/13 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
Python 错误和异常小结
2013/10/09 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
EJB3推出JPA的原因
2013/10/16 面试题
如何定义一个可复用的服务
2014/09/30 面试题
求职者简历中的自我评价
2013/10/20 职场文书
大学生四年生活自我鉴定
2013/11/21 职场文书
会展中心部门工作职责
2013/11/27 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
武当山导游词
2015/02/03 职场文书
清洁工个人工作总结
2015/03/05 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
JavaScript分页组件使用方法详解
2021/07/26 Javascript
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技