以前学习过PDO,可是在公司使用项目的时候发现有点忘记了,于是花了点时间对PDO再次回顾,我的代码写的很详细了,在注释上有参考案例,有需要的可以在这里下载
链接:https://pan.baidu.com/s/1tDSV_8hJdrReNa851Y5ZNQ
提取码:famt
下面我对这个类的一些重点方法进行解读
本类定义的私有变量
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_INCREMENT
public 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 ;
}
数据添加
/**
* 添加记录的操作
* @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 ) ;
}
数据修改
/**
* 更新记录
* @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 ){
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 ) ;
}
一些其他比较重要的操作
/**
* 得到上一步插入操作产生AUTO_INCREMENT
* @return boolean|string
*/
public static function getLastInsertId (){
$link = self :: $link ;
if (! $link ) return false ;
return self :: $lastInsertId ;
}
/**
* 得到数据库中数据表
* @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 ;
}
/**
* 执行增删改操作,返回受影响的记录的条数
* @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 ;
}
}
/**
* 自定义错误处理
* @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>' ;
}
其他具体PDO封装的函数请查看代码文件,都有详细的注释哦~
其他关于PDO的热读
PHP复习_PDO的连接使用
http://www.mtdg.club/index/article/show/id/54.html
PHP复习_PDO普通方法的使用
http://www.mtdg.club/index/article/show/id/55.html
PHP复习_PDO数据库连接属性和防SQL注入
http://www.mtdg.club/index/article/show/id/56.html
PHP复习_PDO的事务和异常
http://www.mtdg.club/index/article/show/id/57.html
PHP复习_PDO预处理方法的使用
http://www.mtdg.club/index/article/show/id/58.html