<?php
//header('content-type:text/html;charset=utf-8');
class PdoMySQL{public static $config=array();//设置连接参数,配置信息public static $link=null;//保存连接标识符public static $pconnect=false;//是否开启长连接public static $dbVersion=null;//保存数据库版本public static $connected=false;//是否连接成功public static $PDOStatement=null;//保存PDOStatement对象public static $queryStr=null;//保存最后执行的操作public static $error=null;//报错错误信息public static $lastInsertId=null;//保存上一步插入操作产生AUTO_INCREMENTpublic static $numRows=0;//上一步操作产生受影响的记录的条数/*** 连接PDO* @param string $dbConfig* @return boolean*/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连接错误');return false;}self::$link->exec('SET NAMES '.DB_CHARSET);self::$dbVersion=self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));self::$connected=true;unset($configs);}}/*** 得到所有记录* @param string $sql* @return unknown*/public static function getAll($sql=null){if($sql!=null){self::query($sql);}$result=self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC"));return $result;}/*** 得到结果集中的一条记录* @param string $sql* @return mixed*/public static function getRow($sql=null){if($sql!=null){self::query($sql);}$result=self::$PDOStatement->fetch(constant("PDO::FETCH_ASSOC"));return $result;}/*** 根据主键查找记录* @param string $tabName* @param int $priId* @param string $fields* @return mixed*/public static function findById($tabName,$priId,$fields='*'){$sql='SELECT %s FROM %s WHERE id=%d';return self::getRow(sprintf($sql,self::parseFields($fields),$tabName,$priId));}/*** 执行普通查询* @param unknown $tables* @param string $where* @param string $fields* @param string $group* @param string $having* @param string $order* @param string $limit* @return Ambigous <unknown, unknown, multitype:>*/public static function find($tables,$where=null,$fields='*',$group=null,$having=null,$order=null,$limit=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);return count($dataAll)==1?$dataAll[0]:$dataAll;}/*array('username'=>'imooc','password'=>'imooc','email'=>'imooc@imooc.com','token'=>'123abc','token_exptime'=>'123123','regtime'=>'123456')INSERT user(username,password,email,token,token_exptime,regtime)VALUES('aa','aa','aa@qq.com','bb','123123','123456')*//*** 添加记录的操作* @param array $data* @param string $table* @return Ambigous <boolean, unknown, number>*/public static function add($data,$table){$keys=array_keys($data);array_walk($keys,array('PdoMySQL','addSpecialChar'));$fieldsStr=join(',',$keys);$values="'".join("','",array_values($data))."'";$sql="INSERT {$table}({$fieldsStr}) VALUES({$values})";//echo $sql;return self::execute($sql);}/*array('username'=>'imooc111','password'=>'imooc222','email'=>'imooc333@imooc.com','token'=>'4444','token_exptime'=>'1234444','regtime'=>'12345678')UPDATE user SET username='imooc111',password='imooc222'.... WHERE id<=38 ORDER BY username limit 0,1*//*** 更新记录* @param array $data* @param string $table* @param string $where* @param string $order* @param string $limit* @return Ambigous <boolean, unknown, number>*/public static function update($data,$table,$where=null,$order=null,$limit=0){//$sets = '';foreach($data as $key=>$val){$sets .= $key."='".$val."',";}//echo $sets;$sets=rtrim($sets,',');$sql="UPDATE {$table} SET {$sets} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);return self::execute($sql);}/*** 删除记录的操作* @param string $table* @param string $where* @param string $order* @param number $limit* @return Ambigous <boolean, unknown, number>*/public static function delete($table,$where=null,$order=null,$limit=0){$sql="DELETE FROM {$table} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);return self::execute($sql);}/*** 得到最后执行的SQL语句* @return boolean|Ambigous <string, string>*/public static function getLastSql(){$link=self::$link;if(!$link)return false;return self::$queryStr;}/*** 得到上一步插入操作产生AUTO_INCREMENT* @return boolean|string*/public static function getLastInsertId(){$link=self::$link;if(!$link)return false;return self::$lastInsertId;}/*** 得到数据库的版本* @return boolean|mixed*/public static function getDbVerion(){$link=self::$link;if(!$link)return false;return self::$dbVersion;}/*** 得到数据库中数据表* @return multitype:mixed*/public static function showTables(){$tables=array();if(self::query("SHOW TABLES")){$result=self::getAll();foreach($result as $key=>$val){$tables[$key]=current($val);}}return $tables;}/*** 解析Where条件* @param unknown $where* @return string*/public static function parseWhere($where){$whereStr='';if(is_string($where)&&!empty($where)){$whereStr=$where;}return empty($whereStr)?'':' WHERE '.$whereStr;}/*** 解析group by* @param unknown $group* @return string*/public static function parseGroup($group){$groupStr='';if(is_array($group)){$groupStr.=' GROUP BY '.implode(',',$group);}elseif(is_string($group)&&!empty($group)){$groupStr.=' GROUP BY '.$group;}return empty($groupStr)?'':$groupStr;}/*** 对分组结果通过Having子句进行二次删选* @param unknown $having* @return string*/public static function parseHaving($having){$havingStr='';if(is_string($having)&&!empty($having)){$havingStr.=' HAVING '.$having;}return $havingStr;}/*** 解析Order by* @param unknown $order* @return string*/public static function parseOrder($order){$orderStr='';if(is_array($order)){$orderStr.=' ORDER BY '.join(',',$order);}elseif(is_string($order)&&!empty($order)){$orderStr.=' ORDER BY '.$order;}return $orderStr;}/*** 解析限制显示条数limit* limit 3* limit 0,3* @param unknown $limit* @return unknown*/public static function parseLimit($limit){$limitStr='';if(is_array($limit)){if(count($limit)>1){$limitStr.=' LIMIT '.$limit[0].','.$limit[1];}else{$limitStr.=' LIMIT '.$limit[0];}}elseif(is_string($limit)&&!empty($limit)){$limitStr.=' LIMIT '.$limit;}return $limitStr;}/*** 解析字段* @param unknown $fields* @return string*/public static function parseFields($fields){if(is_array($fields)){array_walk($fields,array('PdoMySQL','addSpecialChar'));$fieldsStr=implode(',',$fields);}elseif(is_string($fields)&&!empty($fields)){if(strpos($fields,'`')===false){$fields=explode(',',$fields);array_walk($fields,array('PdoMySQL','addSpecialChar'));$fieldsStr=implode(',',$fields);}else{$fieldsStr=$fields;}}else{$fieldsStr='*';}return $fieldsStr;}/*** 通过反引号引用字段,* @param unknown $value* @return string*/public static function addSpecialChar(&$value){if($value==='*'||strpos($value,'.')!==false||strpos($value,'`')!==false){//不用做处理}elseif(strpos($value,'`')===false){$value='`'.trim($value).'`';}return $value;}/*** 执行增删改操作,返回受影响的记录的条数* @param string $sql* @return boolean|unknown*/public static function execute($sql=null){$link=self::$link;if(!$link) return false;self::$queryStr=$sql;if(!empty(self::$PDOStatement))self::free();$result=$link->exec(self::$queryStr);self::haveErrorThrowException();if($result){self::$lastInsertId=$link->lastInsertId();self::$numRows=$result;return self::$numRows;}else{return false;}}/**释放结果集*/public static function free(){self::$PDOStatement=null;}public static function query($sql=''){$link=self::$link;if(!$link) return false;//判断之前是否有结果集,如果有的话,释放结果集if(!empty(self::$PDOStatement))self::free();self::$queryStr=$sql;self::$PDOStatement=$link->prepare(self::$queryStr);$res=self::$PDOStatement->execute();self::haveErrorThrowException();return $res;}public static function haveErrorThrowException(){$obj=empty(self::$PDOStatement)?self::$link: self::$PDOStatement;$arrError=$obj->errorInfo();//print_r($arrError);if($arrError[0]!='00000'){self::$error='SQLSTATE: '.$arrError[0].' <br/>SQL Error: '.$arrError[2].'<br/>Error SQL:'.self::$queryStr;self::throw_exception(self::$error);return false;}if(self::$queryStr==''){self::throw_exception('没有执行SQL语句');return false;}}/*** 自定义错误处理* @param unknown $errMsg*/public static function throw_exception($errMsg){echo '<div style="width:80%;background-color:#ABCDEF;color:black;font-size:20px;padding:20px 0px;">'.$errMsg.'</div>';}/*** 销毁连接对象,关闭数据库*/public static function close(){self::$link=null;}}
// require_once 'config.php';
// $PdoMySQL=new PdoMySQL;
//var_dump($PdoMySQL);
// $sql='SELECT * FROM user1';
// print_r($PdoMySQL->getAll($sql));
// $sql='SELECT * FROM user WHERE id=36';
// print_r($PdoMySQL->getRow($sql));
// $sql='INSERT user(username,password,email,token,token_exptime,regtime)';
// $sql.=" VALUES('imooc1113','imooc1113','imooc1113@imooc.com','abcdefgh','1392348346','12313346')";
// //echo $sql;
// var_dump($PdoMySQL->execute($sql));
// echo '<hr/>';
// echo $PdoMySQL::$lastInsertId;
// $sql='DELETE FROM user WHERE id>=37';
// var_dump($PdoMySQL->execute($sql));
// $sql='UPDATE user SET username="king1234" WHERE id=36';
// var_dump($PdoMySQL->execute($sql));
// $tabName='user';
// $priId='36';
// //$fields='username,email';
// $fields=array('username','email','regtime');
// $fields='*';
// print_r($PdoMySQL->findById($tabName,$priId,$fields));
//print_r($PdoMySQL->findById($tabName, $priId));
//$tables='user';
//print_r($PdoMySQL->find($tables));
//print_r($PdoMySQL->find($tables,'id>=30'));
// print_r($PdoMySQL->find($tables,'id>=30','username,email'));
//print_r($PdoMySQL->find($tables,'id<=10','*','status'));
//print_r($PdoMySQL->find($tables,'id<=10','*','status','count(*)>=6'));
//print_r($PdoMySQL->find($tables,'id>5','*',null,null,'username desc,id desc'));
//print_r($PdoMySQL->find($tables,null,'*',null,null,null,array(3,5)));
// $data= array(
//   'username'=>'imooc',
//   'password'=>'imooc',
//   'email'=>'imooc@imooc.com',
//   'token'=>'123abc',
//   'token_exptime'=>'123123',
//   'regtime'=>'123456'
//   );
// var_dump($PdoMySQL->add($data,$tables));
// $data=array(
//   'username'=>'imooc111',
//   'password'=>'imooc222',
//   'email'=>'imooc333@imooc.com',
//   'token'=>'4444',
//   'token_exptime'=>'1234444',
//   'regtime'=>'12345678'
// );
//var_dump($PdoMySQL->update($data,$tables,'id<=38',' id DESC','2'));//var_dump($PdoMySQL->delete($tables,'id>35'));
//var_dump($PdoMySQL->delete($tables,'id>3','id DESC','5'));
//print_r($PdoMySQL->showTables());

5. PDO 数据库封装相关推荐

  1. php pdo 新建数据库,php – 使用PDO数据库类而不是每次都创建新...

    我有这个PDO数据库类 class clsDatabase{ // db settings private $host = 'localhost'; private $user = 'test'; p ...

  2. 4月4日我儿子和我过生日,共享快乐。顺便贡献多年写的delphi数据库封装原代码。

    ---------- 说明 ---------- 1. 该代码可以免费使用, 该代码的名字暂时定为"哲别" 2. 如果你需要使用该代码, 请注明该代码的原来作者: Jacky Zh ...

  3. Python+requests+pytest+allure封装接口自动化6-mysql、redis数据库封装

    一.Mysql数据库封装 在common中新建一个mysql_db_util.py的文件 import pymysqlclass MysqlDBUtil:#字典输出def __init__(self, ...

  4. 全新的PDO数据库操作类(仅适用Mysql)

    1年前,也差不多刚开博那会,分享过一个pdo的数据库操作类(可参见:http://www.cnblogs.com/hooray/archive/2011/06/30/2094743.html),与其说 ...

  5. java mysql数据库封装_java-jdbc封装连接数据库工具

    /************************************************************ Copyright (C), 1988-1999, Huawei Tech. ...

  6. 自己如何写mysql数据库_如何写一个属于自己的数据库封装(4)

    测试数据库来源 其实应该第一期就交出的, 但现在提起也无碍 参考了安装mysql示例数据库sakila 情景描述 我有一个用于测试的数据库(sakila), 里头有一个表(actor), 现在我们将它 ...

  7. php获得指定位置中间的数据库,PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结...

    今天发现php5.1.*和php5.2.*在数据库预编译代码执行的时候出现差异 介绍 今天发现php5.1.*和php5.2.*在数据库预编译代码执行的时候出现差异. 预编译优点 1.使用占位符,避免 ...

  8. c# 常用数据库封装

    我不为大家贴代码了,没有意思,有点多,我主要给大家介绍一下,源码会上传CSDN和GIT:我定义了一个ADO.NET操作接口,所有按照接口封装 1.sqlite数据库(需要SQLite.Interop. ...

  9. php pdo mysql类源码_php pdo数据库类(提取自微擎的pdo方式处理数据库类库)

    推荐:php zip文件压缩类库源码文件很实用的php zip压缩类库,内含两个php zip源码文件,可以直接下载使用,可以节省php web开发者大量的时间! mb5u.com 一个很实用的php ...

  10. 安卓获取mysql数据封装方法_android SQLite数据库封装

    终于有时间好好看看数据库了 今天下午自己封装了一个SQLite数据库 留着以后自己用吧 虽然还有许多要修改的地方 贴出代码先 package com.example.testdatabase; imp ...

最新文章

  1. 你会不会用mysql查询近7个月的数据?没有记录默认为空
  2. FPGA之道(总)推荐下这本书以及传递下作者的原话
  3. c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
  4. RabbitMQ管理台使用
  5. 用Xshell连接ubuntu虚拟机
  6. 3月更新来了!Windows 11正式版22000.556发布
  7. linux命令中xargs,在Linux上使用xargs命令的详细教程
  8. 服务器中修改项目端口,c#-在Visual Studio 2013中更改项目端口号
  9. 2nd day in SG
  10. C++ const使用情况总结
  11. 22考研计算机专业课——数据结构【❤️考研复习指导❤️】
  12. 文字处理技术:布局绘制的方向有哪些?
  13. 12306一直提示网络有问题_春运10日拉开大幕 买票遇到问题?别慌!这里有答案...
  14. 谭浩强C语言练习题及详细答案
  15. php和jsp有什么区别,php和jsp之间的区别是什么
  16. qcloud-ocr
  17. 普通卷积、分组卷积和深度分离卷积概念以及参数量计算
  18. 计算机关机时出现蓝屏,关机蓝屏,教您电脑关机蓝屏怎么解决
  19. JPA与Hibernate的区别
  20. Excel编号相同数字

热门文章

  1. 来教你用什么泡脚好,泡脚的好处有那些?
  2. Bootstrap-分页插件Paginator
  3. java.io.tmpdir
  4. MVC如何分离Controller与View在不同的项目
  5. NetBeans Weekly News 刊号 # 152 - Jun 15, 2011
  6. 可怕的ASP.NET邮件组件
  7. The Furthest Distance In The World
  8. 为什么国外程序员加班少?他们这样评价996和技术公众号
  9. 手机都可以直接敲R了,还要电脑干嘛
  10. 精选 | 2018年1月R新包推荐