<?php

/**
 * Class model
 * @package Core\lib
 */
class model
{
    protected $pdo = null;      // 连接数据库
    protected $table = null;    // 表名
    protected $where = null;    // where 条件
    protected $order = null;    // order 条件
    protected $limit = null;    // limit
    protected $like = '';       // 包含 条件
    protected $field = '*';    // 要查询的 条件

/**
     * model constructor.
     * @param $table
     * pdo连接数据库
     */
    public function __construct($table)
    {
        $database = conf::all('database');
        $this->table = $table;
        try{
            $this->pdo = new PDO($database['DSN'], $database['USERNAME'], $database['PASSWD']);
            $this->pdo->query('set names utf8');
        }catch(\PDOException $e){
            p($e->getMessage());
        }
    }

/**
     * @return array
     *  查询所有
     */
    public function select()
    {
        $stmt = $this->pdo->prepare("select ".trim($this->field)." from ".$this->table." ".$this->where." ".$this->order." ".$this->limit."");

$stmt->execute();

$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

return $data;
    }

/**
     * @return mixed
     *  单条查询
     */
    public function first()
    {
        $sql = "select ".$this->field." from ".$this->table." ".$this->where." limit 1";
        $res = $this->pdo->query($sql);
        $res->setFetchMode(PDO::FETCH_ASSOC); //数字索引方式
        $row = $res->fetch();
        return $row;
    }

/**
     * @param $data
     * @return $this
     *  添加
     */
    public function insert($data)
    {
        if(is_array($data)){
            $val = array_values($data);
            $str = '';
            $key = array_keys($data);
            $keys = implode(',',$key);
            foreach($key as $k=>$v){
                $str.=":$v".',';
            }
            $str = rtrim($str,',');
            $stmt=$this->pdo->prepare("insert into ".$this->table."($keys) values($str)");
            $arr = [];
            foreach($key as $k=>$v){
                $arr[':'.$v] = $val[$k];
            }
            $stmt->execute($arr);
//            $this->pdo->lastInsertId();
            return $this;
        }
    }

/**
     * @param $data
     * @return $this
     *  更新 修改
     */
    public function update($data)
    {
        $str = '';
        foreach($data as $k=>$v){
            $str.=$k.'='.':'.$k.',';
        }
        $str = rtrim($str,',');
        $stmt = $this->pdo->prepare("update ".$this->table." set ".$str." ".$this->where);
        $arr = [];
        foreach($data as $k=>$v){
            $arr[':'.$k] = $v;
        }
        if($stmt->execute($arr))
        {
            return $this;
//            echo "最后插入的ID:".$this->pdo->lastInsertId();
        }else{
            echo "执行失败";
        }
    }

/**
     * @return $this
     * 删除
     */
    public function delete()
    {
        $sql="delete from ".$this->table." ".$this->where;
        $res = $this->pdo->exec($sql);
        return $res;
    }

/**
     * @param $data
     * @return $this
     *  查询字段
     */
    public function field($field)
    {
        $this->field = is_array( $field ) ? '`' . implode( '`,`', $field ) . '`' : $field;
        return $this;
    }

/**
     * @param $option
     * @return $this
     * where 条件
     */
    public function where($option)
    {
        $this->where = 'where ';
        $and = 'and';
        if(is_string($option)){
            $this->where.= $option;
        }elseif(is_array($option)){
            foreach($option as $k=>$v){
                $for = $k.'='.$v;
                $res = $this->where.= isset($mark) ? ' '.$and.' '.$for : $for;
                $mark = 1;
            }
        }
        return $this;
    }

/**
     * @param $option
     * @return $this
     * 排序
     */
    public function order($option)
    {
        $this->order = 'order by ';
        if(is_string($option)){
            $this->order.= $option;
        }
        return $this;
    }

/**
     * @param $page
     * @param null $pageSize
     * @return $this
     * 限制条数
     */
    public function limit($page,$pageSize = null)
    {
        if($pageSize == null){
            $this->limit = 'limit '.$page;
        }else{
            $pageval = intval($page-1) * $pageSize;
            $this->limit = "limit ".$page.",".$pageval ;
        }
        return $this;
    }

/**
     * 字段和表名添加 `符号
     * 保证指令中使用关键字不出错 针对mysql
     * @param string $value
     * @return string
     */
    protected function _addChar($value)
    {
        if ('*'==$value || false!==strpos($value,'(') || false!==strpos($value,'.') || false!==strpos($value,'`')) {
            //如果包含* 或者 使用了sql方法 则不作处理
        } elseif (false === strpos($value,'`') ) {
            $value = '`'.trim($value).'`';
        }
        return $value;
    }

/**
     * 过滤并格式化数据表字段
     * @param string $tbName 数据表名
     * @param array $data POST提交数据
     * @return array $newdata
     */
    protected function _dataFormat($tbName,$data)
    {
        if (!is_array($data)) return array();
        $table_column = $this->_tbFields($tbName);
        $ret=array();
        foreach ($data as $key=>$val) {
            if (!is_scalar($val)) continue; //值不是标量则跳过
            if (array_key_exists($key,$table_column)) {
                $key = $this->_addChar($key);
                if (is_int($val)) {
                    $val = intval($val);
                } elseif (is_float($val)) {
                    $val = floatval($val);
                } elseif (preg_match('/^\(\w*(\+|\-|\*|\/)?\w*\)$/i', $val)) {
                    // 支持在字段的值里面直接使用其它字段 ,例如 (score+1) (name) 必须包含括号
                    $val = $val;
                } elseif (is_string($val)) {
                    $val = '"'.addslashes($val).'"';
                }
                $ret[$key] = $val;
            }
        }
        return $ret;
    }

/**
     * 取得数据表的字段信息
     * @param string $tbName 表名
     * @return array
     */
    protected function _tbFields($tbName)
    {
        $sql = 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="'.$tbName.'" AND TABLE_SCHEMA="'.$this->_dbName.'"';
        $stmt = self::$_dbh->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $ret = array();
        foreach ($result as $key=>$value) {
            $ret[$value['COLUMN_NAME']] = 1;
        }
        return $ret;
    }

}

转载于:https://www.cnblogs.com/ghjbk/p/6581152.html

pdo 封装增删改查类相关推荐

  1. python操作postgre库,批量进行增删改查和计时比较效率,封装好的普通增删改查和批量增删改查类拿来即用

    python操作postgre库,批量进行增删改查,封装类,拿来即用 1. 新建postgre.py文件,使用psycopg2封装普通增删改查和批量增删改查类 postgre.py import ps ...

  2. mysql封装增删改查_jdbc封装一行代码实现增删改查

    一行代码实现增删改查.支持自定义结果集. 2个测试类(先看效果) public class UserDao extends Dao { public User login(User user) thr ...

  3. php pdo基础增删改查 postgresql的主键自增设置 time()

    主键自增 参考https://www.javadrive.jp/postgresql/table/index10.html和https://stackoverflow.com/questions/48 ...

  4. VUE+Spring Boot前后端分离开发实战(五):基于shiro鉴权的角色增删改查(CURD)-封装分页组件和所有增删改查模块化

    文章目录 前言 后端实现 前端实现 分页组件封装 增删改查模块化 角色管理页面 实现效果 前言 本文在上文基础上把查询.增加.修改以及删除的请求封装在table.js中,实现了所有用到增删改查页面代码 ...

  5. java上安装zookeeper并且实现增删改查

    目录 一..创建Maven工具 二.将Maven的默认配置文件设置为自己下载的配置文件(非必要) 三.在maven文件中导入zookeeper依赖 四.创建增删改查类MyzkTest 五.实现zook ...

  6. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. spring入门(11)-spring与hibernate整合完成增删改查的操作(封装HibernateTemplate模版类对象)

    今天是spring的最后一节课,这节课老师讲了spring与hibernate整合完成增删改查的操作,这是很重要的一节课,这也是第一次真正的实现spring结合Hibernate和数据库连接上,下面是 ...

  8. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)...

    最近看老罗的视频,跟着完成了利用Java操作MySQL数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...

  9. mysql封装 javabean,利用Java针对MySql封装的jdbc框架类JdbcUtils完整实现(包含增删改查、JavaBean反射原理,附源码)...

    最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...

最新文章

  1. Zabbix 监控Mysql 主从状态(Python脚本)
  2. hive export import
  3. 【Eclipse提高开发速度-插件篇】安装VJET插件,JS等提示开发插件
  4. WPF:ListView数据绑定及Style
  5. 烂泥:CentOS6.5挂载windows共享文件夹
  6. 【★】假如人类使用16进制
  7. htmlcss基础知识点表单
  8. MySQL 5.1 安装过程中报apply security setting错误的解决办法 收藏
  9. 单片机之魂——定时器、中断
  10. [bzoj1497][NOI2006]最大获利_网络流_最小割
  11. C与C++关于*与的传参解析
  12. linux下mysql连接_Linux下MySQL C++连接操作
  13. MySQL数据库面试题(2020最新版)
  14. FTP搜索引擎开发文档前言部分
  15. 在计算机图形学中多边形的表示方法通常有,计算机图形学复习大纲
  16. day02-08 python基础语法
  17. 电脑桌面便签小工具下载,专业桌面待办便签软件
  18. 全方面手把手从0到1带你开发谷歌浏览器插件
  19. Linux 7 提示 -bash: ifconfig: command not found
  20. TryHackMe-Gatekeeper

热门文章

  1. Mysql 5.7.10以上版本安装大坑
  2. 【原创】kafka client源代码分析
  3. ASP.Net MVC框架配置分析详解
  4. 【Python】多线程
  5. Eclipse(STS) 初次搭建Spring Cloud项目之声明式REST调用+负载均衡实现Feign(四)
  6. linux lnmp1.5 部署laravel项目
  7. selenium测试(Java)--学习总结
  8. 智慧城市建设面临“三座大山” 安全与服务需两手抓
  9. SQLServer------聚集索引和非聚集索引的区别
  10. (转)常用正则表达式