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)

相关推荐
BingoGo13 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack14 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982071 天前
PHP 扩展——从入门到理解
php
鹏仔先生2 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下2 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip2 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒2 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2502 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis2 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel
Cheng小攸2 天前
渗透行为分析与检测
开发语言·php