一个简单的对于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.