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 相关文章推荐
3.从实例开始
Oct 09 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
Dec 29 PHP
PHP中file_exists与is_file,is_dir的区别介绍
Sep 12 PHP
php搜索文件程序分享
Oct 30 PHP
php curl模拟post请求和提交多维数组的示例代码
Nov 19 PHP
php数组冒泡排序算法实例
May 06 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
Sep 29 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添加MySQL数据记录代码
2008/06/07 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
php中namespace及use用法分析
2016/12/06 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
Python内置数据类型详解
2014/08/18 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
服装设计专业毕业生推荐信
2013/11/09 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js