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中文字母数字验证码实现代码
Apr 25 PHP
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
据说是雅虎的一份PHP面试题附答案
Jan 07 PHP
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
php读取大文件示例分享(文件操作类)
Apr 13 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
form自动提交实例讲解
Jul 10 PHP
PHP中echo与print区别点整理
Mar 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
mayfish 数据入库验证代码
2010/04/30 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
PHP中的表达式简述
2016/05/29 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
深入理解python中的select模块
2017/04/23 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
python爬取个性签名的方法
2018/06/17 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
生产部经理岗位职责
2013/12/16 职场文书
高中军训感言200字
2014/02/23 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
面试感谢信范文
2015/01/22 职场文书
高考1977观后感
2015/06/04 职场文书
初中生物教学随笔
2015/08/15 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers