<?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;
    }

}

pdo 封装增删改查类的更多相关文章

  1. PDO封装增删改查

    <?phpclass db{ public $table=null; public $pdo; public $where=null; //where 条件 public $field=null ...

  2. python连接集群mongodb,封装增删改查

    1.下载pymongo pip install pymongo 2.直接上代码 [ini配置文件] 封装读ini省略~~ [db.py] class Database(): def __init__( ...

  3. Java连接GBase并封装增删改查

    1.介绍 GBase 是南大通用数据技术有限公司推出的自主品牌的数据库产品,目前在国内数据库市场具有较高的品牌知名度;GBase品牌的系列数据库都具有自己鲜明的特点和优势:GBase 8a 是国内第一 ...

  4. oop简易封装增删改查

    //注意要先引入含有封装类的文件文件:如下: <?phpclass Db{ public $host='127.0.0.1'; public $user='root'; public $pass ...

  5. PDO 增删改查封装的类

    Selecting Data 你在mysql_*中是这样做的 <?php $result = mysql_query('SELECT * from table') or die(mysql_er ...

  6. Day 18 :面向对象[基础,继承,组合]类的增删改查

    有的人说,编程有3种范式: 1.面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 2.面向函数:面向函数是面向过程的升级版,也就是把每个 ...

  7. JDBC学习笔记——增删改查

    1.数据库准备  要用JDBC操作数据库,第一步当然是建立数据表: ? 1 2 3 4 5 6 CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_I ...

  8. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  9. BootstrapTable+KnockoutJS实现增删改查解决方案

    BootstrapTable+KnockoutJS实现增删改查解决方案 前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一 ...

随机推荐

  1. Call From master/192.168.128.135 to master:8485 failed on connection exception: java.net.ConnectException: Connection refused

    hadoop集群搭建了ha,初次启动正常,最近几天启动时偶尔发现,namenode1节点启动后一段时间(大约10几秒-半分钟左右),namenode1上namenode进程停掉,查看日志: -- :: ...

  2. 基于.NET CORE微服务框架 -浅析如何使用surging

    1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...

  3. js实现查找字符串中最多的字符的个数

    用hash table实现.key是字符,value是字符个数. var hashTable={}; var str="fjsdeiuwidshjfhjsksghfjhsjjskalsk&q ...

  4. 私有成员 ECMAScript6 weakmap

    把变量放到构造函数里进行私有化,每一个实例都会有一个getName方法,这是低效率的.function Person(name) { this.getName = function() { retur ...

  5. 用UiPath导入RPA实践1:VirtualBox的安装

      之前说了关于RPA的一些概念,但对于RPA到底是个什么东西,能干什么,咋么干都没有具体的概念,所以后面分几回,用[UiPath]这个工具为基础说说RPA的实际应用,希望能抛砖引玉. 在试用新的东西 ...

  6. gulp一般使用

    gulp的基本使用总结了一下几点: 1.gulp-ejs的使用 [ file include,html文件合并 ]: let ejs = require("gulp-ejs"); ...

  7. 64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)

    由于安装过程中实在是出现了N多问题,所以不得不专门写个帖子来记录一下这破东西在Win7下的安装过程,避免以后还要再用的时候踩坑. 1.Boost简介 Boost库是一个可移植.提供源代码的C++库,作 ...

  8. C#只能运行一个实例程序的方法

    互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允许打开一个窗体",还有Bitcomet等. 我也是 ...

  9. mysql数据库第二弹

    mysql数据库针对表的操作 表记录的增删改查 1.增加一张表 插入记录之前必须得先有表结构! CREATE TABLE score( id int PRIMARY KEY auto_incremen ...

  10. ssh远程登录,禁止root登录

    1,useradd xiaobingpasswd xiaobing (设置密码) 2,禁止root登陆,修改 /etc/ssh/sshd_configPermitRootLogin yes 改为 Pe ...