博客 / 詳情

返回

php手寫一個pdo數據庫操作類(附增刪改查實例)

數據庫操作類的優點

優點可以説是非常多了,常見的優點就是便於維護、複用、高效、安全、易擴展。例如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);
?>

數據庫表格結構

image.png

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 */;

作者

TANKING

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.