一个简单的对于Mysql的PDO操作类(PHP)
类结构本身稍微混乱,方法没有规章,这是缺点。
PDOMysql.class.php
<?php define("DB_HOST", "localhost"); define("DB_USER", 'root'); define("DB_PWD", 'root'); define("DB_NAME", 'minyy'); define("DB_PORT", '3306'); define("DB_TYPE", 'mysql'); define("DB_CHARSET", 'utf8'); 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 = 0; // 保存上一步插入操作产生AUTO_INSREMENT public static $numRows = 0; // 上一步操作产生受影响的记录条数 /** * 构造函数实现连接数据库 * @param array $dbConfig 配置项参数 */ public function __construct($dbConfig = ''){ if(!class_exists("PDO")){ self::throw_exception('不支持PDO,请先开启'); } if(!$dbConfig || !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 SQL语句 * @return array 得到所有数据 */ public static function getAll($sql = null){ if($sql){ self::query($sql); } $result = self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC")); return $result; } /** * 得到结果集中的一条记录 * @param string $sql sql语句 * @return array 返回一条数据 */ 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 string $priId 主键id * @param string $field 查询项 * @return array 一条记录 */ public static function findById($tabName, $priId, $field='*'){ $sql = "SELECT %s FROM %s WHERE id=%d"; return self::getRow(sprintf($sql, self::parseField($field), $tabName, $priId)); } /** * 执行普通查询 * @param string $tables 查询表名 * @param string $where where * @param string $fields 要查询字段 * @param string $group group by * @param string $having having * @param string $order order * @param string $limit limit * @return array [description] */ public static function find($tables, $where = null, $fields = '*', $group = null, $having = null, $order = null, $limit = null){ $sql = 'SELECT '.self::parseField($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; } /** * 添加记录的操作 * @param array $data 要添加的内容 * @param int $table 受影响的条数 */ public static function add($data, $table){ $keys = array_keys($data); array_walk($keys,array('PDOMySQL','addSpecilChar')); $fieldsStr=join(',',$keys); $values="'".join("','",array_values($data))."'"; $sql = "INSERT {$table}({$fieldsStr}) VALUES({$values})"; return self::execute($sql); } /** * 更新记录 * @param array $data 要更新内容 * @param string $table 表名 * @param string $where 条件 * @param string $order 排序 * @param string $limit 限制 * @return int 受影响条数 */ public static function update($data, $table, $where = null, $order = null, $limit = null){ $sets = ''; foreach ($data as $key => $val) { $sets .= $key."='".$val."',"; } $sets = rtrim($sets,','); $sql = "UPDATE {$table} SET {$sets} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit); return self::execute($sql); } /** * 解析字段 * @param string $fields 字段 * @return string 解析后的字段 */ public static function parseField($fields){ if(is_array($fields)){ array_walk($fields, array('PDOMySQL', 'addSpecilChar')); $fieldsStr = implode(',',$fields); }elseif(is_string($fields) && !empty($fields)){ if(strpos($fields, '`') === false){ $fields = explode(',', $fields); array_walk($fields, array('PDOMySQL', 'addSpecilChar')); $fieldsStr = implode(',',$fields); }else{ $fieldsStr = $fields; } }else{ $fieldsStr = '*'; } return $fieldsStr; } /** * 删除操作 * @param string $table 表名 * @param string $where 条件 * @param string $order 排序 * @param integer $limit 限制 * @return integer 受影响条数 */ 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 string sql语句 */ public static function getLastSql(){ $link=self::$link; if(!$link) return false; return self::$queryStr; } /** * 得到插入操作产生的AUTO_INCREMENT * @return int 被操作id */ public static function getLastInsertId(){ $link=self::$link; if(!$link) return false; return self::$lastInsertId; } /** * 得到数据库的版本 * @return float 数据库版本 */ public static function getDbVersion(){ $link=self::$link; if(!$link) return false; return self::$dbVersion; } /** * 得到数据库中的数据表 * @return array 所有数据表 */ public static function showTbales(){ $tables = []; if(self::query("SHOW TABLES")){ $result = self::getAll(); foreach ($result as $key => $value) { $tables[$key]=current($value); } } return $tables; } /** * 解析where字段 * @param string $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 string $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; } /** * 对分组进行二次筛选 * @param string $having 字段 * @return string 解析后的字段 */ public static function parseHaving($having){ $havingStr = ''; if(is_string($having) && !empty($having)){ $havingStr = ' HAVING '.$having; } return $havingStr; } /** * 解析order by * @param string $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 * @param strign $limit 字段 * @return strign 解析后的字段 */ 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(!empty($limit)){ $limitStr .= ' LIMIT '.$limit; } return $limitStr; } /** * 通过反引号引用字段 * @param string &$value 不同类型字段 */ public static function addSpecilChar(&$value){ if($value === '*' || strpos($value, '.') != false || strpos($value, '`') != false){ // 不做处理 }elseif(strpos($value, '`') === false){ $value = '`'.trim($value).'`'; } return $value; } /** * 执行增删改操作,返回受影响的记录条数 * @param string $sql sql语句 * @return int 受影响条数 */ 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; } } /** * 释放结果集 * @return null null */ 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(); if($arrError[0] != '00000'){ self::$error = 'SQLStatus: '.$arrError[0].'<br />SQLError: '.$arrError[2].'<br />Error SQL: '.self::$queryStr; self::throw_exception(self::$error); return false; } if(self::$queryStr == ''){ self::throw_exception('没有执行的SQL语句'); return false; } } /** * 自定义错误处理 * @param string $errMsg 错误信息 * @return null null */ public static function throw_exception($errMsg){ echo $errMsg; } /** * 销毁连接对象,关闭数据库 * @return null null */ public static function close(){ self::$link = null; } }
在场景中这样来使用,注释后的内容分别用来测试不同方法:
index.php
<?php $PDOMySQL = new PDOMySQL(); // 查询全部记录 $sql = 'SELECT * FROM cheat_exam'; $res = $PDOMySQL->getAll($sql); // 查询一条记录 $sql = 'SELECT * FROM cheat_exam WHERE id=1'; $res = $PDOMySQL->getRow($sql); // 插入一条记录 $sql = 'INSERT cheat_exam(name) VALUES (1)'; $res = $PDOMySQL->execute($sql); echo $PDOMySQL::$lastInsertId; // 删除一条记录 $sql = 'DELETE FROM cheat_exam WHERE id=115'; $res = $PDOMySQL->execute($sql); // 更新一条记录 $sql = 'UPDATE arr SET name="1" WHERE id=1'; $res = $PDOMySQL->execute($sql); // 根据主键查询一条记录 $tabName = 'cheat_exam'; $priId = 1; $fields='subject,name'; $fields = array('subject','name'); $res = $PDOMySQL->findById($tabName, $priId, $fields); // 执行普通查询 $tables = 'cheat_exam'; $res = $PDOMySQL->find($tables); $res = $PDOMySQL->find($tables, 'id>=30'); $res = $PDOMySQL->find($tables, 'id>=30', 'subject,name'); $res = $PDOMySQL->find($tables, 'id>=30', '*', 'subject'); $res = $PDOMySQL->find($tables, 'id>=30', '*', 'subject', 'count(*)>=8'); $res = $PDOMySQL->find($tables, 'id>=30', '*', '', '', 'id desc'); $res = $PDOMySQL->find($tables, 'id>=30', '*', '', '', 'id desc', 5); // 更新一条记录 $data = [ 'subject' => 'imooc', 'name' => 'name' ]; $table = "cheat_exam"; $res = $PDOMySQL->add($data, $table); // 也是更新操作 $data = [ 'subject' => 'imooc', 'name' => 'name' ]; $table = "cheat_exam"; $res = $PDOMySQL->update($data, $table, 'id<=3', 'id desc', 5); // 删除操作 $table = "cheat_exam"; $res = $PDOMySQL->delete($table, 'id<3'); // 得到数据表 $res = $PDOMySQL->showTbales(); print_r($res);
会打印出不同结果。
The End.