PDO基础操作的封装

来源:互联网 发布:菜鸟网络估值2017 编辑:程序博客网 时间:2024/06/05 18:08
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;//最后插入数据的idpublic static  $numRows=NULL;//上一步操作受影响记录的条数/** * 构造函数,连接PDO * @param string $dbConfig//配置信息 * @return boolean//返回连接状态,连接成功为true,否则为false */public function __construct($dbConfig=''){if ( !class_exists("PDO")){ self::throw_exception('不支持PDO, 请先开启');}//if_classif(!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_is_arrayif (empty($dbConfig['hostname'])){self::throw_exception('没有定义数据库配置,请先定义');}self::$config=$dbConfig;if (empty(self::$config['params'])){self::$config['params']=array();//此处重新定义了一个矩阵,包含在$config矩阵内}//if_config//未建立连接if(!isset(self::$link)){$configs=self::$config;if (self::$pconnect) {//开启长连接,添加到配置数组中$configs['params'][constant("PDO::ATTR_PERSISTENT")]='true';}//if_pconnecttry {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;}//if_linkself::$link->exec('SET NAMES'.DB_CHARSET);self::$dbVersion=self::$link->getAttribute(constant('PDO::ATTR_SERVER_VERSION'));self::$connected=true;//连接成功return true;unset($configs);}//if_!isset_link}//__construct/** * 销毁$PDOStatement对象,释放结果集 */public static function free(){self::$PDOStatement=null;}/** * 执行一条sql操作,采用prepare-execute形式 * @param string $sql//即将执行的sql语句 * @return boolean//执行成功,返回PDOStatement状态的结果,否则为false */public static function query($sql=''){$link=self::$link;if (!$link){echo '不存在连接标识符';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;}//query/** * 采用PDO::exec()函数实现对数据的增删改操作,返回受上一步操作影响的记录条数 * @param string $sql//即将执行的sql语句 * @return boolean|int//操作成功,返回受影响的记录条数,否则为false */public static function exec($sql=null){$link= self::$link;if(!$link){echo '不存在连接标识符';return false;}self::$queryStr=$sql;if (!empty(self::$PDOStatement)){self::free();}$res=$link->exec(self::$queryStr);self::haveErrorThrowException();if ($res){self::$lastInsertId=self::$link->lastInsertId();self::$numRows=$res;return self::$numRows;}else{return false;}}//exec/** * 根据主键id查询记录 * @param string $tabName //表名 * @param string $priId//主键id * @param unknown $fields//要查询的表中字段,可能为矩阵或字符串 * @return mixed//执行成功返回一条结果 */public static function findById($tabName,$priId,$fields='*'){$sql=" SELECT %s FROM %s WHERE id=%d";//%s表示该处输入的值是字符串类型,%d则表示整型//将后面三个参数按顺序插入到sql语句有%s和%d的位置中return self::getOne(sprintf($sql,self::parseFields($fields),$tabName,$priId));}//findById/** * 执行普通select查询 * @param string $fields//需要查询的表中字段,字符串或矩阵形式 * @param string $tables//需要查询的表,字符串形式 * @param string $where//可能存在的where条件,字符串形式 * @param string $group//可能存在的group by条件,字符串或矩阵形式 * @param string $having//可能存在的having条件,字符串形式 * @param string $order//可能存在的order by条件,字符串或矩阵形式 * @param string $limit//可能存在的limit条件,字符串或矩阵形式 * @return Ambigous <mix, multitype:> */public static function find($tables, $fields='*', $where=null, $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 $dataAll;}//find/** * 实现mysql的插入insert操作 * @param array $dataArray//要插入的字段和字段值 * @param string $table//要插入的表名 * @return Ambigous <boolean, number> */public static function add($dataArray,$table){$keys=array_keys($dataArray);array_walk($keys, array('PdoMysql','addSpecilChar'));  $fieldsStr=join(',', $keys);$values="'".join("','", array_values($dataArray))."'";$sql=" INSERT INTO {$table} ({$fieldsStr}) VALUES ($values)";return self::exec($sql);}//add//UPDATE wuti_testSalary SET salary=salary-2000,name=name+1 WHERE id>1 ORDER BY name LIMIT 1/** * 实现mysql的修改update操作 * @param array $dataArray//update时set后跟随的内容,矩阵形式 * @param string $table//update的表 * @param string $where//where条件 * @param string $order//order by 条件 * @param string $limit//limit 条件 * @return Ambigous <boolean, number> */public static function update($dataArray, $table, $where=null, $order=null, $limit=null){$sets='';foreach ($dataArray as $key=>$val){if (strpos($val, '+') !==false || strpos($val, '-') !==false|| strpos($val, '*') !==false || strpos($val, '/') !==false){//SET 后面的条件中存在诸如salary=salary-2000条件,则无需加引号$sets .=$key."= {$val},";}else{//SET 后面的条件中类似salary='2000'的条件,则得加引号$sets .=$key."='{$val}',";}}$sets=rtrim($sets,',');//去掉末尾的逗号','$sql="UPDATE {$table} SET {$sets} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);return self::exec($sql);}//update/** * 实现mysql的删除delete操作 * @param string $table//delete对应的表 * @param string $where//where条件 * @param string $order//order条件 * @param number $limit//limit条件 * @return Ambigous <boolean, 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::exec($sql);}//delete/** * 返回最后执行的一条sql语句 * @return boolean|string */public static function getLastSql(){$link= self::$link;if (!$link){echo '连接标识符不存在';return false;}return self::$queryStr;}//getlastSql/** * 得到上一步插入insert操作产生的id值 * @return boolean|string */public static function getLastId(){$link= self::$link;if (!$link){echo '连接标识符不存在';return false;}return self::$lastInsertId;}//getlastId/** * 得到数据库的版本 * @return boolean|mixed */public static function getDbVersion(){$link= self::$link;if (!$link){echo '连接标识符不存在';return false;}return self::$dbVersion;}//getDbVersion/** * 得到数据库中存在的表 * @return multitype:mixed */public static function showTables(){$tables=array();if (self::query("SHOW TABLES")){$res= self::getAll();foreach ($res as $key=>$val){$tables[$key]=current($val);}}return $tables;}/** * 解析Where条件 * @param unknown $where//字符串形式 * @return string若输入的$where为空或不是字符串,则返回空,否则返回 WHERE+ $where */public static function parseWhere($where){$whereStr='';if (is_string($where) && !empty($where)){//确保返回的where条件是字符串形式或为空$whereStr=$where;}return empty($whereStr)? '' : ' WHERE '.$whereStr;}//parseWhere/** * 解析分组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;}//parseGroup/** * 对分组结构通过Having进行二次筛选 * @param unknown $having//字符串形式 * @return string */public static function parseHaving($having){$havingStr='';if (is_string($having)&& !empty($having)){$havingStr= ' HAVING '.$having;}return empty($havingStr)? '' : $havingStr;}//parseHaving/** * 解析Order By * @param unknown $order//字符串或矩阵形式 * @return string */public static function parseOrder($order){$orderStr='';if (is_array($order)){$orderStr= ' ORDER BY '.implode(',', $order);}elseif (is_string($order) && !empty($order)){$orderStr= ' ORDER BY '.$order;}return empty($orderStr)? '' : $orderStr;}//parseOrder/** * 解析限制条件Limit 的2中条件:例一, limit 1;例二,limit 1,3  * @param unknown $limit//限制条件,可为字符串或矩阵形式 * @return string */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;}//parseLimit/** * 解析字段,使之成为符合规范的mysql字段内容 * @param unknown $fields//要查询的表中字段,可能为矩阵或字符串 * @return string//返回解析后的表中字段($fields) */public static function parseFields($fields){if (is_array($fields)){//类中加入回调函数callback,则需以如下形式引用:array(this,callback)或array('类名',callback)array_walk($fields, array('PdoMysql','addSpecilChar'));$fieldsStr=implode(',', $fields);//将矩阵转换成字符串形式}elseif (is_string($fields) && !empty($fields)){if (strpos($fields, '`')===false)//字符串$fields中没有反引号'`'{$fields=explode(',', $fields);//将字符串转换为矩阵形式array_walk($fields, array('PdoMysql','addSpecilChar'));$fieldsStr=implode(',', $fields);//将矩阵转换成字符串形式}else {$fieldsStr=$fields;}}else {$fieldsStr= '*';}return $fieldsStr;}//parseFields/** * 通过添加反引号'`'引用字段,避免与mysql保留的关键字产生冲突 * @param string $value//要搜索的表中字段 * @return string//返回与mysql保留关键字区分的字段 */public static function addSpecilChar(&$value){if ($value==='*' || strpos($value,'.')!==false || strpos($value, '`')!==false ||strpos($value,'(')!==false){//字符串为'*'或字符串中存在'.'或'`'或'(',则不做任何处理}elseif (strpos($value, '`')===false){$value='`'.trim($value).'`';//移除字符串两端的空格并添加反引号'`',一边与mysql中的保留字区分}return $value;}//addSpecilChar/** * 获取结果集中的一条数据 * @param string $sql//即将执行的sql语句 * @return mixed//返回结果集中的一条数据 */public static function getOne($sql=null){if($sql !=null){self::query($sql);}$result= self::$PDOStatement->fetch(constant('PDO::FETCH_ASSOC'));return $result;}//getOne/** * 获取所有结果集 * @param string $sql//即将执行的sql语句 * @return mix//返回结果集中的所有数据 */public static function getAll($sql=null){if($sql !=null){self::query($sql);}$result= self::$PDOStatement->fetchAll(constant('PDO::FETCH_ASSOC'));return $result;}//getAll/** * PDO操作错误处理 */public static function haveErrorThrowException(){$obj= empty(self::$PDOStatement)?self::$link:self::$PDOStatement;$arrError= $obj->errorInfo();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;}//print_r($arrError);}//haveErrorThrowException/** * 自定义错误处理 * @param unknown $errMsg//错误信息 */public static function throw_exception($errMsg){echo '<div style="width:80%; background-color:#ABCDEF; color:balck;font-size:20px; padding:20px 0px;">'.$errMsg.'</div>';}//throw_exception/** * 销毁连接对象,关闭数据库 */public static function close(){self::$link=null;}}

0 0
原创粉丝点击