首页 > 文章列表 > php实现pdo数据库操作类过程详解

php实现pdo数据库操作类过程详解

php
169 2023-03-17

数据库操作类的优点

优点可以说是非常多了,常见的优点就是便于维护、复用、高效、安全、易扩展。例如PDO支持的数据库类型是非常多的,与mysqli不同的就是,PDO还支持其他数据库,一套写法多种数据库的匹配,而mysqli仅仅是支持mysql。

代码

Db.php

<?php

/**

 * 数据库的基本操作

 */

class Db

{

    // 数据库的默认连接参数

    private $dbConfig=[

        'db'=>'mysql', // 数据库类型

        'host'=>'localhost', // 主机名称

        'port'=>'3306', // 默认端口

        'user'=>'root', // 用户名

        'pass'=>'root', // 密码

        'charset'=>'utf8', // 默认字符集

        'dbname'=>'edu', // 默认数据库

    ];

    // 新增主键id

    public $insertId = null;

    // 受影响的记录

    public $num = 0;

    // 单例模式,本类的实例

    private static $instance = null;

    // 数据库的连接

    private $conn = null;

    /**

     * Db构造方法

     * 私有化以防止外部实例化

     */

    private function __construct($params=[])

    {

        // 初始化连接参数

        $this->dbConfig = array_merge($this->dbConfig,$params);

        // 连接数据库

        $this->connect();

    }

    /**

     * 禁止外部克隆该实例

     */

    private function __clone()

    {

        // TODO:Implement __clone() method.

    }

    /**

     * 获取当前类的单一实例

     */

    public static function getInstance($params=[])

    {

        if (!self::$instance instanceof self) {

            self::$instance = new self($params);

        }

        return self::$instance;

    }

    private function connect()

    {

        try{

            // 配置数据源DSN

            $dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};port={$this->dbConfig['port']};dbname={$this->dbConfig['dbname']};charset={$this->dbConfig['charset']}";

            // 创建PDO对象

            $this->conn = new PDO($dsn,$this->dbConfig['user'],$this->dbConfig['pass']);

            // 设置客户端字符集

            $this->conn->query("SET NAMES {$this->dbConfig['charset']}");

        }catch (PDOException $e){

            die('数据库连接失败'.$e->getMessage());

        }

    }

    /** 

     * 完成数据表的操作:CURD

     */

    public function exec($sql)

    {

        $num = $this->conn->exec($sql);

        // 如果有受影响的记录

        if($num > 0){

            // 如果是新增操作,初始化新增主键id属性

            if(null !==$this->conn->lastInsertId()){

                $this->insertId = $this->conn->lastInsertId();

            }

            $this->num = $num; // 返回受影响的记录

        }else{

            $error = $this->conn->errorInfo(); // 获取最后操作错误信息的数组

            var_dump($error);

        }

    }

    // 获取单条查询结果

    public function fetch($sql)

    {

        return $this->conn->query($sql)->fetch(PDO::FETCH_ASSOC);

    }

    // 获取多条查询结果

    public function fetchAll($sql)

    {

        return $this->conn->query($sql)->fetchAll(PDO::FETCH_ASSOC);

    }

}

?>

调用

Demo.php

<?php

/**

 * Db类测试

 */

require 'Db.php';

// 获取Db类实例

$db = Db::getInstance();

// 新增操作

// $sql = "INSERT student SET name='张一鸣',email='ByteDance@qq.com',grade='59',course='golang'";

// $db->exec($sql);

// echo '成功插入了'.$db->num.'条记录,主键id是'.$db->insertId;

// 删除操作

// $sql = "DELETE FROM student WHERE id='4'";

// $db->exec($sql);

// echo '成功删除了'.$db->num.'条记录';

// 更新操作

// $sql = "UPDATE student SET grade='1199' WHERE id='1'";

// $db->exec($sql);

// echo '成功更新了'.$db->num.'条记录';

// 查询单条操作

// $sql = "SELECT id,name,email,grade FROM student WHERE grade < '60'";

// $row = $db->fetch($sql);

// var_dump($row);

// // 查询多条操作

// $sql = "SELECT id,name,email,grade FROM student WHERE grade > '80'";

// $rows = $db->fetchAll($sql);

// var_dump($rows);

?>

数据库表格结构

SQL

全选下面的SQL语句粘贴至数据库管理工具的SQL执行框进行执行即可快速创建测试数据库。

-- phpMyAdmin SQL Dump

-- version 4.8.5

-- https://www.phpmyadmin.net/

--

-- 主机: localhost

-- 生成日期: 2022-08-08 10:46:35

-- 服务器版本: 5.7.26

-- PHP 版本: 7.3.4

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

SET AUTOCOMMIT = 0;

START TRANSACTION;

SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;

/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

/*!40101 SET NAMES utf8mb4 */;

--

-- 数据库: `edu`

--

-- --------------------------------------------------------

--

-- 表的结构 `student`

--

CREATE TABLE `student` (

  `id` int(11) NOT NULL,

  `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,

  `email` text COLLATE utf8_unicode_ci NOT NULL,

  `grade` varchar(32) COLLATE utf8_unicode_ci NOT NULL,

  `course` varchar(32) COLLATE utf8_unicode_ci NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--

-- 转存表中的数据 `student`

--

INSERT INTO `student` (`id`, `name`, `email`, `grade`, `course`) VALUES

(1, '王兴', 'meituan@qq.com', '80', 'ruby'),

(2, '黄峥', 'pdd@qq.com', '68', 'mysql'),

(6, '李彦宏', 'baidu@qq.com', '95', 'python'),

(5, '马云', 'mayun@qq.com', '88', 'php'),

(7, '刘强东', 'jd@qq.com', '76', 'C++'),

(8, '马化腾', '10001@qq.com', '59', 'java'),

(9, '张一鸣', 'ByteDance@qq.com', '77', 'golang');

--

-- 转储表的索引

--

--

-- 表的索引 `student`

--

ALTER TABLE `student`

  ADD PRIMARY KEY (`id`);

--

-- 在导出的表使用AUTO_INCREMENT

--

--

-- 使用表AUTO_INCREMENT `student`

--

ALTER TABLE `student`

  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;

COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;