PDO介绍+PDO增删改查+PDO事物处理+DPO封装类

PDO:PHP data object,php数据对象,也叫php数据抽象层,是一种能够管理多种不同数据库的数据对象,PHP只需要去调用PDO,而不用去在意PDO底层管理的数据库到底是采用什么样的方式,哪些方法来实现的功能。让PHP操作数据库变得简单。

PDO不止是一个类:而是三个类:PDO类,PDOStatement类,PDOException类

PDO类:主要负责数据库的连接操作以及初始化,能够向服务器发送SQL语句

PDOStatement类:负责处理所有有结果的信息

PDOException类:异常处理类,获取对应可能出错的错误信息,然后采用对象的形式去处理错误

PDO扩展加载

1.开启扩展:PDO本身的扩展(高版本的PHP默认是开启的),PDO对应数据库的扩展

2.指定扩展路径

3.重启Apache生效

PDO操作

1.连接认证

new PDO():得到一个PDO类的对象,这个对象就可以调用PDO类的所有方法

三个参数

$dsn:数据库类型:host=主机地址;port=端口号;dbname=数据库

$user:用户名

$pass:密码

2.准备SQL语句,发送给服务器,得到的服务器执行后的结果

必须区分SQL语句到底是什么操作:写操作使用exec,读操作使用query

PDOStatement query:将结果得到之后,返回一个PDOStatement类的对象,因为PDOStatement类是专门用于数据操作的。

3.解析数据:通过PDOStatement类对象来实现获取对应的数据

在PDOStatement类中,提供了一系列的fetch方法来获取数据

fetch:获取查询结果中的一条记录,同时会将操作指针下移

4.释放资源:PDO没有提供释放资源的接口(方法)

$pdo = null;//没有明显的意义,因为不会影响PDOStatement类的对象对数据查询的操作。

PDO增删改查

新增操作

修改数据

删除数据与修改数据完全一样,只是SQL语句不一样而已。

查询数据

解析数据方法:PDOStatement类提供的方法

fetch:从结果中获取一行记录,默认返回一个混合数组

fetch_style:

效果

遍历所有结果

fetchAll:取得所有的结果,形成一个二维数组

注意:fetchAll也可以通过指定fetch_style来确定采用什么方式返回数据。

fetchObject:将数据获取到一个对象里面

可以通过指定类,来得到不同类的对象。

fetchColumn:获取指定列的数据

bindColumn:将指定列的数据绑定到一个外部变量,然后在数据fetch操作的时候,会将对应列的数据,直接放到对应的变量当中,然后可以通过直接使用变量相当于操作对应的字段的值。bindColumn必须配合fetch_style的PDO::FETCH_BOUND

先将一个变量绑定到对应的"结果集";然后再进行获取数据

注意:绑定如果是采用索引进行绑定,索引从1开始表示第一列

可以通过字段名来绑定变量

修改查询模式:setFetchMode,可以一次性修改所有的fetch模式,以后都可以按照指定的模式进行fetch就可以了。

错误处理

任何的SQL语句都有可能执行错误,SQL的错误处理模式都是静默模式,出了错也不会报错,需要对SQL的执行结果进行错误的处理。

PDO::errorCode:获取错误代码

PDO::errorInfo:获取错误信息

预处理

预处理:提前处理,在一次数据库连接过程中,可以提前将要执行的SQL语句发送给服务器,但是暂时不执行,等到需要执行的时候再去执行。

预处理语法

1.准备预处理:将要执行的SQL语句起个别名然后发送给服务器。

prepare 预处理名字 from '要执行的SQL语句';

2.执行预处理。

execute 预处理名字;

预处理使用参数

1.准备预处理:有些地方可以事先使用占位符"?"来代替真实数据。

2.如果预处理有参数的话,那么必须携带参数。参数必须是通过变量传入。

execute 预处理名字 using 变量;

预处理意义

1.节省带宽(执行一次较长的SQL语句,每次使用的时候都只需要提供变量)

PDO预处理

预处理执行流程

1.发送预处理语句

2.执行预处理

在PDO使用预处理的过程中,一个PDOStatement类的对象只能同时操作一个预处理,所以要使用多个预处理,必须在PDO::prepare()方法的返回值的,使用不同的变量来保存对象。

PDOStatement::execute():执行预处理

2.1预处理绑定参数1:使用参数数组

采用数组的形式来给预处理赋值

2.2使用bindParam来绑定参数

bindParam():就是给一个变量绑定一个值

2.3使用bindValue来绑定参数

bindValue():与bindParam基本一样

bindParam&bindValue

bindParam胜了bindValue:使用的引用传值方式进行传参,参数可以循环利用。

利用参数的修改可以直接修改execute所执行的结果。

问号占位符

绑定参数

数组绑定参数

注意:在使用PDO进行预处理的时候,尽量不要使用问号占位符,使用变量(:名字)

PDO事务处理

PDO的事务处理完全遵照mysql下面的事务处理来实现,只是将不同的动作封装到不同的方法中。

事务流程

1.开启事务

2.事务处理:进行多次有关联的写操作

3.结束事务

a)成功:commit方法

b)失败:rollback方法

注意:要支持事务,必须要争数据库的存储引擎是InnoDB。

PDO属性

PDO属性不是指的PDO类的对象里面所保存的属性,而是指的PDO对象在操作数据的过程中应该按照某些指定的情况去处理数据。

PDO属性不是真正的PDO类对象的属性,是数据库的属性

对于属性操作:PDO提供两个方法,getAttribute获取属性的值,和setAttribute设置属性的值。

这些属性都是以属性名和属性值的键值对的形式存在

PDO::ATTR_AUTOCOMMIT:是否自动提交,默认都是自动提交,值是1

PDO::ATTR_CASE,代表数据库返回数据的时候,字段的大小写,默认是与数据库字段设计的大小写一致PDO::CASE_NATURAL

PDO::CASE_LOWER:全部字段小写(字段名)

PDO::CASE_UPPER:全部大写

PDO::CASE_NATURAL,默认自然的,不改变

修改属性

PDO::ATTR_ERRMODE,mysql对出错的处理模式

PDO::ERRMODE_SILENT:默认的,静默模式,出错不会报错

PDO::ERRMODE_WARNING:警告模式,出错会给出一个警告

PDO::ERRMODE_EXCEPTION:异常模式,出错会抛出一个异常

PDO::ATTR_PERSISTENT,连接的持久性,默认的是false,短连接

TRUE:长连接,脚本执行结束,如果换一个脚本依然需要操作数据库,连接不会中断

条件:mysql服务器开启长连接(默认不允许),Apache支持长连接(需要配置)

FALSE:短连接,脚本执行结束一定会释放(断开)连接资源

PDO异常

异常其实错误,异常处理是一种将错误放到一个对应的对象里面,然后通过对象去对错误进行操作一种模式。

异常处理的实现语法

将所有有可能出现错误的语句,都放到一个可以抓取异常的上下文:try;其次需要一个指定类型的数据类的对象来捕获异常,并进行异常处理:catch

try{

//所有有可能出错的语句,一旦出粗就会立马进入到catch里面,而且讲所有的错误信息放到异常处理类对应的对象里面

}catch(异常处理类 对象名字){

//错误处理的方式

}

要使用异常模式来抓取PDO可能出现的错误,那么必须将错误处理模式设置成异常模式

通常的处理方式

主动抛出异常:throw new PDOException

反射

在程序中,反射是在通过获得一个类,让类内部的结构给反射出来,能将类内部的属性,方法,常量给全部显示处理。(不会包含方法体)。

反射意义:将类内部结构展示给程序员看,程序员看了结构之后能够更好的去操作类。

在php中有一个类:ReflectionClass,用于反射的操作类

该类中有一个静态方法:export()能够将一个对应的类的结构给反射出来(打印)

不单只可以通过反射类ReflectionClass来查看类的内部结构,还可以通过对象的形式去获取获取对应的数据信息。里面有三个方法,能够帮助我们去更好的了解一个类的使用。

getProperties:获取所有的属性

getMethods:获取所有的方法

getConstants:获取所有的常量

new ReflectionClass('类名');

获取所有的方法:getMethods

获取所有属性:getProperties

获取常量:getConstants

封装PDO

把PDO一些不方便的地方,进行再次封装,变的方便

见代码:MyPDO.class.php

作业:完善MyPDO类:增删改查都有(建议:对外接口做成protected)

相关推荐
尘中客2 分钟前
【2026最新】如何用 WordPress 零代码搭建八字排盘/紫微斗数网站(附免费开源插件)
php·api·wordpress·建站源码·网站引流
计算机安禾3 小时前
【计算机网络】第17篇:TCP拥塞控制的迭代——从Reno到CUBIC、BBR的理论转向
tcp/ip·计算机网络·php
MZ_ZXD0017 小时前
springboot音乐播放器系统-计算机毕业设计源码76317
java·c语言·c++·spring boot·python·flask·php
dog2508 小时前
圆锥曲线命题的定义和证明
网络·算法·php
niucloud-admin10 小时前
PHP V6 单商户常见问题——小程序订单发货管理
php
郝学胜-神的一滴12 小时前
高并发秒杀系统设计全解:从需求拆解到Redis库存实战
java·数据库·redis·python·程序人生·缓存·php
谪星·阿凯12 小时前
内网信息收集技术博客
安全·web安全·网络安全·php
techdashen13 小时前
你的社交数据,凭什么归平台所有?用 Cloudflare 搭建去中心化社交应用
服务器·去中心化·php
niucloud-admin1 天前
PHP V6 单商户常见问题——汇付支付提示暂未开通延时入账权限问题
php
启山智软1 天前
【 商城系统源码:Java与PHP的区别】
java·开发语言·php