php实现pdo数据库操作类过程详解
作者:TANKING- 发布时间:2023-05-25 11:15:05
标签: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);
?>
数据库表格结构
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 */;
来源:https://blog.csdn.net/weixin_39927850/article/details/127913238


猜你喜欢
- 聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select
- Django提供了翻页器。用Django的Paginator类实现一、views模块导入Paginator类实现数据分页ApiTest/ap
- 前言网易云音乐这款音乐APP本人比较喜欢,用户量也比较大,而网易云音乐之所以用户众多和它的歌曲评论功能密不可分,很多歌曲的评论非常有意思,其
- 本文实例讲述了Python实现计算两个时间之间相差天数的方法。分享给大家供大家参考,具体如下:#-*- encoding:UTF-8 -*-
- 这是一种相对比较复杂的图表,但是仍然遵循上篇中提出的最基本的思路。本例中使用的定义列表标签dl可能平常我们见得不多,一般我们在做列表的时候通
- 在用python画散点图的时候想标记出特定的点,比如在某些点的外围加个空心圆,一样可以通过plt.scatter实现import matpl
- 对于map()它的原型是:map(function,sequence),就是对序列sequence中每个元素都执行函数function操作。
- 1、SQL server中创建表,带有自增列。create table Test_Table(Id int Identity(1,1), N
- 事件模型及其原理Backbone.Events就是事件实现的核心,它可以让对象拥有事件能力var Events = Backbone.Eve
- 文章介绍OpenCV 库中包含很多运算函数,这里着重介绍按位运算的基本原理并举例说明。本篇文章中主要涉及到的函数有:按位与:bitwise_
- 如何比较两个go对象完全相同在go语言中,要比较两个对象是否完全相同,我们可以使用以下三种方法:方法一:使用reflect.DeepEqua
- 在安装SQL Server 2000 ,安装进程自动地为“BUILTIN\Administrators&rdqu
- 属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。为什么叫猴子补丁属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上
- 上传完整django项目文件到服务器sftp ftp lrzsz都可以上传文件到服务器,看自己我django项目叫yunwei,主要app是
- BLOG阅读:http://www.planabc.net/article.asp?id=118在使用CSS实现表现的时候,会经常接触到di
- 前言使用Python发邮件,是个简单的话题,可是如何可以优雅的轻松的群发邮件,并附加PDF附件,是很多小伙伴的日常工作,却也是很多小白需要费
- 1、PHP中对各类变量内容的命名规范 (1)目录命名、文件命名、局部变量命名: 使用英文名词、动词,以下划线作为单词的分隔,所有
- 1. 环境准备1.1 安装pillow 和 pytesseractpython模块库需要 pillow 和 pytesseract 这两个库
- 本文实例为大家分享了JS实现飞机大战小游戏的具体代码,供大家参考,具体内容如下小的时候玩的飞机大战感觉还蛮神奇,今天自己就学着做了一个先制作
- Eric A. Meyer 对基于 Web 标准的 CSS 与 HTML 绝非一知半解,他是这个领域杰出的专家,曾写过不少 CSS 方面的书