PHP复习_封装万能的PDO类

博主回顾PDO知识,详细解读了PDO类的重点方法,包括私有变量定义、数据库连接构造函数,以及数据查询、添加、修改、删除等操作,还分享了代码下载链接和其他PDO相关热读文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前学习过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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值