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; //最后插入数据的id
public static $numRows=NULL; //上一步操作受影响记录的条数
/**
* 构造函数,连接PDO
* @param string $dbConfig //配置信息
* @return boolean //返回连接状态,连接成功为true,否则为false
*/
public function __construct($dbConfig=''){
if ( !class_exists("PDO")){
self::throw_exception('不支持PDO, 请先开启');
}//if_class
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_is_array
if (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_pconnect
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;
}//if_link
self::$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;
}
}
PDO基础操作的封装
最新推荐文章于 2024-08-29 08:39:22 发布