pdoModel封装
<?php /*** Created by PhpStorm.* User: Administrator* Date: 2017/7/24* Time: 14:03*/ /*** 数据库PDO操作*/ class MysqlPdo {public static $PDOStatement = null;/*** 数据库的连接参数配置* @var array* @access public*/public static $config = array();/*** 是否使用永久连接* @var bool* @access public*/public static $pconnect = false;/*** 错误信息* @var string* @access public*/public static $error = '';/*** 单件模式,保存Pdo类唯一实例,数据库的连接资源* @var object* @access public*/protected static $link;/*** 是否已经连接数据库* @var bool* @access public*/public static $connected = false;/*** 数据库版本* @var string* @access public*/public static $dbVersion = null;/*** 当前SQL语句* @var string* @access public*/public static $queryStr = '';/*** 最后插入记录的ID* @var integer* @access public*/public static $lastInsertId = null;/*** 返回影响记录数* @var integer* @access public*/public static $numRows = 0;// 事务指令数public static $transTimes = 0;/*** 构造函数,* @param $dbconfig 数据库连接相关信息,array('ServerName', 'UserName', 'Password', 'DefaultDb', 'DB_Port', 'DB_TYPE')*/public function __construct($dbConfig=''){if (!class_exists('PDO')) self::throw_exception("不支持:PDO");//若没有传输任何参数,则使用默认的数据定义if (!is_array($dbConfig)) {$dbConfig = array('hostname' => DB_HOST,'username' => DB_USER,'password' => DB_PWD,'database' => DB_NAME,'hostport' => DB_PORT,'dbms' => DB_TYPE,'dsn' => DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME);}if(empty($dbConfig['hostname'])) self::throw_exception("没有定义数据库配置");self::$config = $dbConfig;if(empty(self::$config['params'])) self::$config['params'] = array();/*************************************华丽分隔线*******************************************/if (!isset(self::$link) ) {$configs = self::$config;if(self::$pconnect) {$configs['params'][constant('PDO::ATTR_PERSISTENT')] = true;}try {self::$link = new PDO( $configs['dsn'], $configs['username'], $configs['password'],$configs['params']);} catch (PDOException $e) {self::throw_exception($e->getMessage());}if(!self::$link) {self::throw_exception('PDO CONNECT ERROR');return false;}self::$link->exec('SET NAMES '.DB_CHARSET);self::$dbVersion = self::$link->getAttribute(constant("PDO::ATTR_SERVER_INFO"));// 标记连接成功self::$connected = true;// 注销数据库连接配置信息unset($configs);}return self::$link;}/*** 释放查询结果* @access function*/static function free() {self::$PDOStatement = null;}/*********************************************************************************************************//* 数据库操作 *//*********************************************************************************************************//*** 获得所有的查询数据* @access function* @return array*/static function getAll($sql=null) {if($sql != null){self::query($sql);}//返回数据集$result = self::$PDOStatement->fetchAll(constant('PDO::FETCH_ASSOC'));return $result;}/*** 获得一条查询结果* @access function* @param string $sql SQL指令* @param integer $seek 指针位置* @return array*/static function getRow($sql=null) {if($sql != null){self::query($sql);}// 返回数组集$result = self::$PDOStatement->fetch(constant('PDO::FETCH_ASSOC'),constant('PDO::FETCH_ORI_NEXT'));return $result;}/*** 执行sql语句,自动判断进行查询或者执行操作* @access function* @param string $sql SQL指令* @return mixed*/static function doSql($sql='') {if(self::isMainIps($sql)) {return self::execute($sql);}else {return self::getAll($sql);}}/*** 根据指定ID查找表中记录(仅用于单表操作)* @access function* @param integer $priId 主键ID* @param string $tables 数据表名* @param string $fields 字段名* @return ArrayObject 表记录*/static function findById($tabName,$priId,$fields='*'){$sql = 'SELECT %s FROM %s WHERE id=%d';return self::getRow(sprintf($sql, self::parseFields($fields), $tabName, $priId));}/*** 查找记录* @access function* @param string $tables 数据表名* @param mixed $where 查询条件* @param string $fields 字段名* @param string $order 排序* @param string $limit 取多少条数据* @param string $group 分组* @param string $having* @param boolean $lock 是否加锁* @return ArrayObject*/static function find($tables,$where="",$fields='*',$order=null,$limit=null,$group=null,$having=null) {$sql = 'SELECT '.self::parseFields($fields).' FROM '.$tables.self::parseWhere($where).self::parseGroup($group).self::parseHaving($having).self::parseOrder($order).self::parseLimit($limit);$dataAll = self::getAll($sql);if(count($dataAll)==1){$rlt=$dataAll[0];}else{$rlt=$dataAll;}return $rlt;}/*** 插入(单条)记录* @access function* @param mixed $data 数据* @param string $table 数据表名* @return false | integer*/function add($data,$table) {//过滤提交数据$data=self::filterPost($table,$data);foreach ($data as $key=>$val){if(is_array($val) && strtolower($val[0]) == 'exp') {$val = $val[1]; // 使用表达式 ???}elseif (is_scalar($val)){$val = self::fieldFormat($val);}else{// 去掉复合对象continue;}$data[$key] = $val;}$fields = array_keys($data);array_walk($fields, array($this, 'addSpecialChar'));$fieldsStr = implode(',', $fields);$values = array_values($data);$valuesStr = implode(',', $values);$sql = 'INSERT INTO '.$table.' ('.$fieldsStr.') VALUES ('.$valuesStr.')';return self::execute($sql);}/*** 更新记录* @access function* @param mixed $sets 数据* @param string $table 数据表名* @param string $where 更新条件* @param string $limit* @param string $order* @return false | integer*/static function update($sets,$table,$where,$limit=0,$order='') {$sets = self::filterPost($table,$sets);$sql = 'UPDATE '.$table.' SET '.self::parseSets($sets).self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);return self::execute($sql);}/*** 保存某个字段的值* @access function* @param string $field 要保存的字段名* @param string $value 字段值* @param string $table 数据表* @param string $where 保存条件* @param boolean $asString 字段值是否为字符串* @return void*/static function setField($field, $value, $table, $condition="", $asString=false) {// 如果有'(' 视为 SQL指令更新 否则 更新字段内容为纯字符串if(false === strpos($value,'(') || $asString) $value = '"'.$value.'"';$sql = 'UPDATE '.$table.' SET '.$field.'='.$value.self::parseWhere($condition);return self::execute($sql);}/*** 删除记录* @access function* @param mixed $where 为条件Map、Array或者String* @param string $table 数据表名* @param string $limit* @param string $order* @return false | integer*/static function remove($where,$table,$limit='',$order='') {$sql = 'DELETE FROM '.$table.self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);return self::execute($sql);}/**+----------------------------------------------------------* 修改或保存数据(仅用于单表操作)* 有主键ID则为修改,无主键ID则为增加* 修改记录:+----------------------------------------------------------* @access function+----------------------------------------------------------* @param $tabName 表名* @param $aPost 提交表单的 $_POST* @param $priId 主键ID* @param $aNot 要排除的一个字段或数组* @param $aCustom 自定义的一个数组,附加到数据库中保存* @param $isExits 是否已经存在 存在:true, 不存在:false+----------------------------------------------------------* @return Boolean 修改或保存是否成功+----------------------------------------------------------*/function saveOrUpdate($tabName, $aPost, $priId="", $aNot="", $aCustom="", $isExits=false) {if(empty($tabName) || !is_array($aPost) || is_int($aNot)) return false;if(is_string($aNot) && !empty($aNot)) $aNot = array($aNot);if(is_array($aNot) && is_int(key($aNot))) $aPost = array_diff_key($aPost, array_flip($aNot));if(is_array($aCustom) && is_string(key($aCustom))) $aPost = array_merge($aPost,$aCustom);if (empty($priId) && !$isExits) { //新增$aPost = array_filter($aPost, array($this, 'removeEmpty'));return self::add($aPost, $tabName);} else { //修改return self::update($aPost, $tabName, "id=".$priId);}}/*** 获取最近一次查询的sql语句* @access function* @param* @return String 执行的SQL*/static function getLastSql() {$link = self::$link;if ( !$link ) return false;return self::$queryStr;}/*** 获取最后插入的ID* @access function* @param* @return integer 最后插入时的数据ID*/static function getLastInsId(){$link = self::$link;if ( !$link ) return false;return self::$lastInsertId;}/*** 获取DB版本* @access function* @param* @return string*/static function getDbVersion(){$link = self::$link;if ( !$link ) return false;return self::$dbVersion;}/*** 取得数据库的表信息* @access function* @return array*/static function getTables() {$info = array();if(self::query("SHOW TABLES")) {$result = self::getAll();foreach ($result as $key => $val) {$info[$key] = current($val);}}return $info;}/*** 取得数据表的字段信息* @access function* @return array*/static function getFields($tableName) {// 获取数据库联接$link = self::$link;$sql = "SELECT ORDINAL_POSITION ,COLUMN_NAME, COLUMN_TYPE, DATA_TYPE, IF(ISNULL(CHARACTER_MAXIMUM_LENGTH), (NUMERIC_PRECISION + NUMERIC_SCALE), CHARACTER_MAXIMUM_LENGTH) AS MAXCHAR, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY, EXTRA, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = :tabName AND TABLE_SCHEMA='".DB_NAME."'";self::$queryStr = sprintf($sql, $tableName);$sth = $link->prepare($sql);$sth->bindParam(':tabName', $tableName);$sth->execute();$result = $sth->fetchAll(constant('PDO::FETCH_ASSOC'));$info = array();foreach ($result as $key => $val) {$info[$val['COLUMN_NAME']] = array('postion' => $val['ORDINAL_POSITION'],'name' => $val['COLUMN_NAME'],'type' => $val['COLUMN_TYPE'],'d_type' => $val['DATA_TYPE'],'length' => $val['MAXCHAR'],'notnull' => (strtolower($val['IS_NULLABLE']) == "no"),'default' => $val['COLUMN_DEFAULT'],'primary' => (strtolower($val['COLUMN_KEY']) == 'pri'),'autoInc' => (strtolower($val['EXTRA']) == 'auto_increment'),'comment' => $val['COLUMN_COMMENT']);}// 有错误则抛出异常self::haveErrorThrowException();return $info;}/*** 关闭数据库* @access function*/static function close() {self::$link = null;}/*** SQL指令安全过滤* @access function* @param string $str SQL指令* @return string*/static function escape_string($str) {return addslashes($str);}/*********************************************************************************************************//* 内部操作方法 *//*********************************************************************************************************//*** 有出错抛出异常* @access function* @return*/static function haveErrorThrowException() {$obj = empty(self::$PDOStatement) ? self::$link : self::$PDOStatement;$arrError = $obj->errorInfo();if($arrError[0] !== '00000') { // 有错误信息self::$error = $arrError[0]."|".$arrError[2]. "<br/>[ SQL ] : ".self::$queryStr."<br/>";self::throw_exception(self::$error);return false;}//主要针对execute()方法抛出异常if(self::$queryStr=='')self::throw_exception('Query was empty<br/><br/>[ SQL语句 ] :');}/*** where分析* @access function* @param mixed $where 查询条件* @return string*/static function parseWhere($where) {$whereStr = '';if(is_string($where) || is_null($where)) {$whereStr = $where;}return empty($whereStr)?'':' WHERE '.$whereStr;}/*** order分析* @access function* @param mixed $order 排序* @return string*/static function parseOrder($order) {$orderStr = '';if(is_array($order))$orderStr .= ' ORDER BY '.implode(',', $order);else if(is_string($order) && !empty($order))$orderStr .= ' ORDER BY '.$order;return $orderStr;}/*** limit分析* @access function* @param string $limit* @return string*/static function parseLimit($limit) {$limitStr = '';if(is_array($limit)) {if(count($limit)>1)$limitStr .= ' LIMIT '.$limit[0].' , '.$limit[1].' ';else$limitStr .= ' LIMIT '.$limit[0].' ';} else if(is_string($limit) && !empty($limit)) {$limitStr .= ' LIMIT '.$limit.' ';}return $limitStr;}/*** group分析* @access function* @param mixed $group* @return string*/static function parseGroup($group) {$groupStr = '';if(is_array($group))$groupStr .= ' GROUP BY '.implode(',', $group);else if(is_string($group) && !empty($group))$groupStr .= ' GROUP BY '.$group;return empty($groupStr)?'':$groupStr;}/*** having分析* @access function* @param string $having* @return string*/static function parseHaving($having) {$havingStr = '';if(is_string($having) && !empty($having))$havingStr .= ' HAVING '.$having;return $havingStr;}/*** fields分析* @access function* @param mixed $fields* @return string*/function parseFields($fields) {if(is_array($fields)) {array_walk($fields, array($this, 'addSpecialChar'));$fieldsStr = implode(',', $fields);}else if(is_string($fields) && !empty($fields)) {if( false === strpos($fields,'`') ) {$fields = explode(',',$fields);array_walk($fields, array($this, 'addSpecialChar'));$fieldsStr = implode(',', $fields);}else {$fieldsStr = $fields;}}else $fieldsStr = '*';return $fieldsStr;}/*** sets分析,在更新数据时调用* @access function* @param mixed $values* @return string*/private function parseSets($sets) {$setsStr = '';if(is_array($sets)){foreach ($sets as $key=>$val){$key = self::addSpecialChar($key);$val = self::fieldFormat($val);$setsStr .= "$key = ".$val.",";}$setsStr = substr($setsStr,0,-1);}else if(is_string($sets)) {$setsStr = $sets;}return $setsStr;}/*** 字段格式化* @access function* @param mixed $value* @return mixed*/static function fieldFormat(&$value) {if(is_int($value)) {$value = intval($value);} else if(is_float($value)) {$value = floatval($value);} elseif(preg_match('/^\w∗(\+|\-|\*|\/)?\w∗$/i',$value)){// 支持在字段的值里面直接使用其它字段// 例如 (score+1) (name) 必须包含括号$value = $value;}else if(is_string($value)) {$value = '\''.self::escape_string($value).'\'';}return $value;}/*** 字段和表名添加` 符合* 保证指令中使用关键字不出错 针对mysql* @access function* @param mixed $value* @return mixed*/static function addSpecialChar(&$value) {if( '*' == $value || false !== strpos($value,'(') || false !== strpos($value,'.') || false !== strpos($value,'`')) {//如果包含* 或者 使用了sql方法 则不作处理} elseif(false === strpos($value,'`') ) {$value = '`'.trim($value).'`';}return $value;}/**+----------------------------------------------------------* 去掉空元素+----------------------------------------------------------* @access function+----------------------------------------------------------* @param mixed $value+----------------------------------------------------------* @return mixed+----------------------------------------------------------*/static function removeEmpty($value){return !empty($value);}/*** 执行查询 主要针对 SELECT, SHOW 等指令* @access function* @param string $sql sql指令* @return mixed*/static function query($sql='') {// 获取数据库联接$link = self::$link;if ( !$link ) return false;self::$queryStr = $sql;//释放前次的查询结果if ( !empty(self::$PDOStatement) ) self::free();self::$PDOStatement = $link->prepare(self::$queryStr);$bol = self::$PDOStatement->execute();// 有错误则抛出异常self::haveErrorThrowException();return $bol;}/*** 数据库操作方法* @access function* @param string $sql 执行语句* @param boolean $lock 是否锁定(默认不锁定)* @return voidpublic function execute($sql='',$lock=false) {if(empty($sql)) $sql = $this->queryStr;return $this->_execute($sql);}*//*** 执行语句 针对 INSERT, UPDATE 以及DELETE* @access function* @param string $sql sql指令* @return integer*/static function execute($sql='') {// 获取数据库联接$link = self::$link;if ( !$link ) return false;self::$queryStr = $sql;//释放前次的查询结果if ( !empty(self::$PDOStatement) ) self::free();$result = $link->exec(self::$queryStr);// 有错误则抛出异常self::haveErrorThrowException();if ( false === $result) {return false;} else {self::$numRows = $result;self::$lastInsertId = $link->lastInsertId();return self::$numRows;}}/*** 是否为数据库更改操作* @access private* @param string $query SQL指令* @return boolen 如果是查询操作返回false*/static function isMainIps($query) {$queryIps = 'INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|SELECT .* INTO|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK';if (preg_match('/^\s*"?(' . $queryIps . ')\s+/i', $query)) {return true;}return false;}/*** 过滤POST提交数据* @access private* @param mixed $data POST提交数据* @param string $table 数据表名* @return mixed $newdata*/static function filterPost($table,$data) {$table_column = self::getFields($table);$newdata=array();foreach ($table_column as $key=>$val){if(array_key_exists($key,$data) && ($data[$key])!==''){$newdata[$key] = $data[$key];}}return $newdata;}/*** 启动事务* @access function* @return void*/static function startTrans() {//数据rollback 支持$link = self::$link;if ( !$link ) return false;if (self::$transTimes == 0) {$link->beginTransaction();}self::$transTimes++;return ;}/*** 用于非自动提交状态下面的查询提交* @access function* @return boolen*/static function commit() {$link = self::$link;if ( !$link ) return false;if (self::$transTimes > 0) {$result = $link->commit();self::$transTimes = 0;if(!$result){self::throw_exception(self::$error());return false;}}return true;}/*** 事务回滚* @access function* @return boolen*/public function rollback() {$link = self::$link;if ( !$link ) return false;if (self::$transTimes > 0) {$result = $link->rollback();self::$transTimes = 0;if(!$result){self::throw_exception(self::$error());return false;}}return true;}/*** 错误处理* @access function* @return void*/static function throw_exception($err){echo '<div style="width:500px;background-color:#CDCDCD; color:#A00;font-size:14px;border:1px #D40000 solid; margin:2px;padding:6px;">ERROR:'.$err.'</div>';} }
转载于:https://www.cnblogs.com/lglblogadd/p/7228756.html
pdoModel封装相关推荐
- IDEA中将代码块封装为方法,IDEA代码重构快捷键
IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:
- 2022-2028年中国封装用胶膜行业运营现状及投资发展潜力报告
[报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了封装用胶膜行业相关概述.中国封装用胶膜行业运行环境.分析了中国封装用 ...
- 第十六节,使用函数封装库tf.contrib.layers
目录 一 tf.contrib.layers中的具体函数介绍 1.tf.contrib.layers.conv2d()函数的定义如下: 2.tf.contrib.layers.max_pool2d() ...
- 薄膜封装,等离子体技术,原子层沉积,化学气相沉积
薄膜封装,等离子体技术,原子层沉积,化学气相沉积 薄膜封装 薄膜封装概念 薄膜真空沉积的一个很重要的技术应用就是薄膜封装.人们对薄膜封装最简单的认识就是日常生活中最常见的保鲜膜,水氧渗透率大约是1-1 ...
- 为什么要使用Retrofit封装OkHttp,而不单独使用OkHttp?
OkHttp的优点: 开源的轻量级框架.高效.快速的请求客户端,可以单独使用它来实现网络请求. 支持SPDY: 支持连接池,可极大减少延时: 支持Gzip压缩响应体,降低传输内容的大小: 支持Http ...
- Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...
## 多态 ```python OOP中标准解释:多个不同类型对象,可以响应同一个方法,并产生不同结果,即为多态 多态好处:只要知道基类使用方法即可,不需要关心具体哪一个类的对象实现的,以不变应万变, ...
- 09_Java面向对象_第9天(类、封装)_讲义
今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 A: 面向过程与面向对 ...
- Appium的Java封装
文章出处 http://blog.csdn.net/niubitianping/article/details/52612211 一.为什么需要封装? 封装的本意就是为了方便.简洁. 二.Androi ...
- Go 学习笔记(36)— 基于Go方法的面向对象(封装、继承、多态)
Go 面向对象编程的三大特性:封装.继承和多态. 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式 继承:使得子类具有父类的属性和方法或者重新定义.追加属性和方法等 多态:不同对象中同种行为的不 ...
最新文章
- Keras运行速度越来越慢的问题
- 《JavaScript设计模式与开发实践》读书笔记之观察者模式
- 下列不是c语言浮点常量的是,C语言二级题库.doc
- php 队列取并集,PHP实现对数组简单求交集,差集,并集功能示例
- MFC—对话框程序—模式对话框与非模式对话框
- linux opencl(AMD) Example
- 自己都不觉得自己值钱,别人怎么觉得你值钱?
- Java番外篇2——jdk8新特性
- JEECG v2.3 发布,基于代码生成器的智能开发框架
- Literal Web 服务器控件
- (我总结的实用主义)Loadrunner运行常见错误
- 为什么都说阿里P7的晋升是道坎?
- 三次握手,为什么不是两次,也不是四次
- 计算机科学与工程学院金巍,附件1湖北省思想政教育先进高校名单-附件1-.doc
- macbook打开网页慢解决办法
- shape()函数的用法
- Ubuntu18 网速显示 插件 显示在状态栏
- 阿里云服务器配置外网访问
- 安安猜价格聪明机器人_2021年智慧树APP不动产估价第八单元章节测试答案
- 计算机是如何做加法的?(7)——回顾与总结