当前位置: 首页 > php>阅读正文

PDO连接数据库

2022.5.18 朱丰华 1303 次 留下评论 5852字

PDO是php数据库连接工具,需要先开启扩展。

如果已经开启PDO,则能检测到PDO类,反之说明未开启。

<?php

    if(!class_exists("PDO")){
        echo "<p>PDO扩展未开启</p>";
    }

    //1、实例化PDO
    $host = "localhost";
    $port = 3306;
    $dbname = "test";
    $username = "test";
    $password = "PyMpefrFXSyENaHs";
    $dsn="mysql:host=$host;port=$port;dbname=$dbname;charset=utf8";
    $pdo = new PDO($dsn,$username,$password);

    // 进行查询
    $sql = "select rand();";
    $sth = $pdo -> prepare($sql);
    $sth -> execute();
    $res1 = $sth -> fetchAll();
    echo '<pre>';
    print_r($res1);
    echo '</pre>';

对PDO进行简单的封装,以便能自动分页:

<?php

/**
 * Class DB 数据库封装类
 * @author zfh
 */
class DB
{

    /**
     * 私有化构造方法
     */
    private function __construct()
    {
    }

    /**
     * 私有克隆方法
     */
    private function __clone()
    {
    }


    private static array $dbConfig = array(
        'db' => 'mysql',
        'host' => 'localhost',
        'port' => 3306,
        'dbname' => "fwefku",
        'user' => "fewfku",
        'pwd' => "XxtEfewfxX3C2WPx",
        'charset' => "utf8"
    );

    private static $conn;  // 唯一连接对象(单例模式)

    private static $sql;  // 最后一次执行的sql信息

    /** 获取连接对象
     * @return PDO|void
     */
    public static function getConn()
    {
        if (self::$conn) {
            return self::$conn;
        } else {
            $db = self::$dbConfig['db'];
            $host = self::$dbConfig['host'];
            $port = self::$dbConfig['port'];
            $dbname = self::$dbConfig['dbname'];
            $user = self::$dbConfig['user'];
            $pwd = self::$dbConfig['pwd'];
            $charset = self::$dbConfig['charset'];

            $dsn = "$db:host=$host;port=$port;dbname=$dbname;charset=$charset;";
            if (!class_exists("PDO")) {
                die("<p style='color: red'>错误:PDO扩展未开启</p>");
            } else {
                self::$conn = new PDO($dsn, $user, $pwd, array(
                    PDO::MYSQL_ATTR_FOUND_ROWS => true,  // 获取匹配的数据条数,而不是影响条数
                    PDO::ATTR_PERSISTENT => true,         // 保持长连接
                    PDO::ATTR_EMULATE_PREPARES => false,  // 禁止模拟预处理
                    PDO::ATTR_STRINGIFY_FETCHES => false   // 不要自动转String
                ));
                return self::$conn;
            }
        }
    }

    /** 获取上次的sql
     * @return mixed
     */
    public static function getSql()
    {
        return self::$sql;
    }

    /** 存储上次执行的sql
     * @param $pre
     */
    public static function setSql($pre)
    {
        ob_start();
        $pre->debugDumpParams();
        self::$sql = ob_get_clean();
    }

    /**
     * 获取一个值(单行单列)
     * @param string $sql
     * @param array $args
     * @return mixed
     */
    public static function getOne(string $sql,array $args=array())
    {
        $DB = self::getConn();
        $pre = $DB->prepare($sql);
        $pre->execute($args);
        self::setSql($pre);
        $res = $pre->fetch(PDO::FETCH_NUM);
        if(empty($res)){
           return $res;   // 空数组,直接返回
        }else{
            return $res[0];
        }
    }

    /**
     * 查询多行单列、或单行多列,封装为一个数组
     * @param string $sql
     * @param array $args
     * @return mixed
     */
    public static function getArr(string $sql,array $args=array())
    {
        $DB = self::getConn();
        $pre = $DB->prepare($sql);
        $pre->execute($args);
        self::setSql($pre);
        // 先假设为多行多列
        $res = $pre->fetchAll(PDO::FETCH_ASSOC);
        $res2 = array();
        if (count($res) > 1) {
            foreach ($res as $k => $v) { // 多行单列,取第一列
                $res2[] = current($v);
            }
        } else {
            if (empty($res)) {  // 空数组,直接返回
                return $res;
            } else {
                $res2 = $res[0]; // 单行多列,取第一行
            }
        }
        return $res2;
    }

    /**
     * 查询多条数据,并且封装为二维数组
     * @param string $sql
     * @param array $args
     * @return mixed
     */
    public static function getArrList(string $sql,array $args=array())
    {
        $DB = self::getConn();
        $pre = $DB->prepare($sql);
        $pre->execute($args);
        self::setSql($pre);
        return $pre->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * 自动分页查询,封装为纯数组格式
     * @param int $page
     * @param int $pageSize
     * @param string $sql
     * @param array $args
     * @return array
     */
    public static function getPage(int $page, int $pageSize, string $sql,array $args=array())
    {
        // 封装并返回结果
        $data = array();
        $data['pageInfo'] = self::getPageInfo($page,$pageSize,$sql);
        $data['list'] = self::getPageList($page,$pageSize,$sql,$args);
        return $data;
    }

    /**
     * 获取分页数据统一接口
     * @param int $page
     * @param int $pageSize
     * @param string $sql
     * @param array $args
     * @return array
     */
    public static function getPageList(int $page,int $pageSize,string $sql,array $args=array()){
        $db = self::$dbConfig['db'];
        $db = strtolower($db);  // 规范化命名,转小写
        $method = "getPageList_".$db;
        if(!method_exists(DB::class,$method)){
            die("方法:".$method." 不存在");
        }else{
            // 灵活扩展,使用动态反射,获取 getPageList_数据库名() 方法返回的数据
            return self::$method($page,$pageSize,$sql,$args);
        }
    }

    /** mysql 分页数据获取
     * @param int $page
     * @param int $pageSize
     * @param string $sql
     * @param array $args
     * @return mixed
     */
    private static function getPageList_mysql(int $page,int $pageSize,string $sql,array $args=array()){
        // 查询数据
        $r_start = ($page - 1) * $pageSize;
        $listSql = $sql . " limit $r_start,$pageSize";
        return self::getArrList($listSql,$args);
    }

    /**
     * 获取分页提示
     * @param int $page
     * @param int $pageSize
     * @param string $sql
     * @param array $args
     * @return array
     */
    public static function getPageInfo(int $page,int $pageSize,string $sql,array $args=array()){
        // 取得总数
        $total = self::count($sql,$args);
        // 封装info
        $pageInfo = array();
        $pageInfo['page'] = $page;      // 当前页数
        $pageInfo['pageSize'] = $pageSize;  // 页面大小
        $pageInfo['totalCount'] = $total;  // 总条数
        $pageInfo['totalPage'] = ceil($total / $pageSize);  // 总页数
        return $pageInfo;
    }


    /**
     * 新增、更新、删除语句
     * @param string $sql
     * @param array $args
     * @return mixed
     */
    public static function update(string $sql,array $args=array())
    {
        $DB = self::getConn();
        $pre = $DB->prepare($sql);
        $pre->execute($args);
        self::setSql($pre);
        return $pre->rowCount();
    }

    /** 计算sql总数
     * @param string $sql
     * @param array $args
     * @return mixed
     */
    public static function count(string $sql,array $args=array())
    {
        // 不要使用 rowCount ,其浪费内存且性能低,此外已经设定改为found_rows,所以rowCount可能在select得不到正确数据
        $DB = self::getConn();
        $pre = $DB->prepare("select count(*) total from ( " . $sql . " ) tmp_count");
        $pre->execute($args);
        self::setSql($pre);
        $res = $pre->fetch(PDO::FETCH_ASSOC);
        return (int)$res['total'];
    }

    /** 获取数据库一些基础信息
     * @return mixed
     */
    public static function getDbInfo()
    {
        $DB = self::getConn();
        $info['autoCommit'] = $DB->getAttribute(PDO::ATTR_AUTOCOMMIT);  // 事务的自动提交{1.是,2.否}
        $info['dbType'] = $DB->getAttribute(PDO::ATTR_DRIVER_NAME);
        $info['version'] = $DB->getAttribute(PDO::ATTR_SERVER_VERSION);
        $info['info'] = $DB->getAttribute(PDO::ATTR_SERVER_INFO);
        return $info;
    }

    /** 获取最后一个插入的自增主键
     * @param string $sql
     * @param array $args
     * @return int|string
     */
    public static function lastInsertId(string $sql,array $args=array())
    {
        $DB = self::getConn();
        $res = self::update($sql,$args);
        if ($res) {
            return $DB->lastInsertId();
        } else {
            return 0;
        }
    }

    /**
     * 开启事务
     */
    public static function begin(){
        $DB = self::getConn();
        $DB->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
        $DB->beginTransaction();
    }

    /**
     * 提交事务
     */
    public static function commit(){
        $DB = self::getConn();
        $DB->commit();
        $DB->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
    }

    /**
     * 事务回滚
     */
    public static function rollBack(){
        $DB = self::getConn();
        $DB->rollBack();
        $DB->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
    }
}

$res = DB::getPage(1,10,"select * from user where utype=:utype",[1]);

var_dump($res);

//$res1 = DB::getPage(1,2,"select * from user where utype=?",[1]);











本篇完,还有疑问?留下评论吧

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注