PDO

PDO
一、什么是PDO
1.PDO是PHP数据对象(PHP Data Object)的简称,它被描述为“在PHP中访问数据库的轻量级,兼容性的接口”,并且是和PHP5.1版本一起发布的,目前支持的数据库包括Firebird, FreeTDS,Interbase ,MySQL,MS SQL Server, ODBC, Oracle,Postgre SQL,SQLite 以及 Sybase等。在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5核心的新OO特性,因此不能在较早版本的 PHP 上运行
2.PDO是一个类,它代表PHP和数据库服务之间的一个连接。
3.PDO与mysqli曾经被建议用来取代原本PHP在用的mysql相关函数,基于数据库使用的安全性,因为后者欠缺对于SQL注入的防护
4.注意,利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个具体数据库的 PDO 驱动来访问数据库服务
二、PDO的特点
1.编码的一致性(通用各种数据库)
由于PHP可用的各种数据库扩展是由不同发行者编写的,所以尽管所有的扩展都提供了基本相同的特性,却不 满 足编码的一致性。PDO消除了这种不一致,提供了可用于各种数据库的单一接口;PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
2.灵活性
因为PDO在运行时加载必须的数据库驱动程序,所以不需要在每次使用不同数据库时重新配置和重新编译PHP。例如,如果数据库需要从SQL切换到MySQL,只需要加载PDO_MYSQL驱动程序就可以了。
(通俗的来说有了PDO,用户就不必再使用 mysql_*函数,aco_*函数或者 mssql_*函数,也不必再将他们封装到数据库操作类,只需要使用PDO接口中的方法就可以对不同的数据库进行操作,在选择不同数据库时,只需要修改PDO的 DNS(数据库名)就可以了)
(即,要操作某种数据,就得去“打开”对应的pdo引擎。)
pdo引擎,在哪里打开?
——在php.ini的配置文件中,无非就是一个“模块”而已,如下:
在这里插入图片描述
在这里插入图片描述

3.面向对象特性
PDO利用PHP5的面向对象特性,可以获得更强大、更高效的数据库通信。
4.高性能
PDO是用C编写的,编译为PHP,与用PHP编写的其他解决方案相比,虽然其他都相同,但提供了更高的性能。
5.免于SQL注入攻击

三、PDO的错误处理
1.静默模式
默认情况下,pdo采用“静默模式”处理错误:
就是发生了错误后,并不提示,而只是返回false。我们需要在程序中去判断返回是否为false,然后,如果是false,再去“主动”获取错误信息。——跟mysql一样!(判断执行语句是否是false,然后打印错误信息并处理)
在这里插入图片描述

2.异常模式
可以简单理解为:适应面向对象语法的处理错误的一种语法结构。pdo要使用异常模式,就得专门设置(因为其默认是静默模式)
在这里插入图片描述

3.pdo的结果集对象(PDOStatement)
来自pdo对象执行“返回数据集的sql语句”并成功的时候,得到的就是pdo的结果集对象

四、PDO的使用
1.pdo的连接
连接是通过创建 PDO 基类的实例而建立的。不管使用哪种驱动程序,都是用 PDO 类名。构造函数接收用于指定数据库源(所谓的 DSN)以及可能还包括用户名和密码(如果有的话)的参数。

如果有任何连接错误,将抛出一个 PDOException 异常对象。如果想处理错误状态,可以捕获异常,或者选择留给通过 set_exception_handler() 设置的应用程序全局异常处理程序。
连接数据成功后,返回一个 PDO 类的实例给脚本,此连接在 PDO 对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。如果不明确地这么做,PHP 在脚本结束时会自动关闭连接。
详细见php文档
https://www.php.net/manual/zh/pdo.connections.php

2.事务与自动提交
事务支持四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)。通俗地讲,在一个事务中执行的任何操作,即使是分阶段执行的,也能保证安全地应用于数据库,并在提交时不会受到来自其他连接的干扰。
事务操作也可以根据请求自动撤销(假设还没有提交),这使得在脚本中处理错误更加容易。事务通常是通过把一批更改“积蓄”起来然后使之同时生效而实现的;这样做的好处是可以大大地提供这些更改的效率。换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。
不幸的是,并非每种数据库都支持事务,因此当第一次打开连接时,PDO 需要在所谓的“自动提交”模式下运行。自动提交模式意味着,如果数据库支持,运行的每个查询都有它自己的隐式事务,如果数据库不支持事务,则没有。如果需要一个事务,则必须用 PDO::beginTransaction() 方法来启动。如果底层驱动不支持事务,则抛出一个 PDOException 异常(不管错误处理设置是怎样的,这都是一个严重的错误状态)。一旦开始了事务,可用 PDO::commit() 或 PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。
当脚本结束或连接即将被关闭时,如果尚有一个未完成的事务,那么 PDO 将自动回滚该事务。这种安全措施有助于在脚本意外终止时避免出现不一致的情况——如果没有显式地提交事务,那么假设是某个地方出错了,所以执行回滚来保证数据安全。但是,只有通过 PDO::beginTransaction() 启动一个事务后,才可能发生自动回滚。如果手动发出一条查询启动事务, 则 PDO 无法知晓,从而在必要时不能进行回滚
3.预处理
很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处:
(1)查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。
(2)提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)
文档:
https://www.php.net/manual/zh/pdo.prepared-statements.php

五、PDO类常用方法
1.PDO::beginTransaction — 启动一个事务
关闭自动提交模式。自动提交模式被关闭的同时,通过 PDO 对象实例对数据库做出的更改直到调用 PDO::commit() 结束事务才被提交。调用 PDO::rollBack() 将回滚对数据库做出的更改并将数据库连接返回到自动提交模式
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
2.PDO::commit — 提交一个事务
提交一个事务,数据库连接返回到自动提交模式直到下次调用 PDO::beginTransaction() 开始一个新的事务为止。
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
3.PDO::rollBack — 回滚一个事务
回滚由 PDO::beginTransaction() 发起的当前事务。如果没有事务激活,将抛出一个 PDOException 异常。如果数据库被设置成自动提交模式,此函数(方法)在回滚事务之后将恢复自动提交模式
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
4.PDO::query — 执行 SQL 语句,以 PDOStatement 对象形式返回结果集
参数:
需要准备、执行的 SQL 语句
返回值:
PDO::query() 返回 PDOStatement 对象,或在失败时返回 FALSE
5.PDO::exec — 执行一条 SQL 语句,并返回受影响的行数
PDO::exec() 在一个单独的函数调用中执行一条 SQL 语句,返回受此语句影响的行数。PDO::exec() 不会从一条 SELECT 语句中返回结果。对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。
参数:
要被预处理和执行的 SQL 语句
返回值:
PDO::exec() 返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则 PDO::exec() 返回 0。
6.PDO::lastInsertId — 返回最后插入行的ID或序列值
返回最后插入行的ID,或者是一个序列对象最后的值,取决于底层的驱动。比如,PDO_PGSQL() 要求为 name 参数指定序列对象的名称。
参数:
应该返回ID的那个序列对象的名称。
返回值:
如果没有为参数 name 指定序列名称,PDO::lastInsertId() 则返回一个表示最后插入数据库那一行的行ID的字符串。如果为参数 name 指定了序列名称,PDO::lastInsertId() 则返回一个表示从指定序列对象取回最后的值的字符串。如果当前 PDO 驱动不支持此功能,则 PDO::lastInsertId() 触发一个 IM001 SQLSTATE 。
7.PDO::prepare — 准备要执行的语句,并返回语句对象
为 PDOStatement::execute() 方法准备待执行的 SQL 语句。 SQL 语句可以包含零个或多个参数占位标记,格式是命名(:name)或问号(?)的形式,当它执行时将用真实数据取代。 在同一个 SQL 语句里,命名形式和问号形式不能同时使用;只能选择其中一种参数形式。 请用参数形式绑定用户输入的数据,不要直接字符串拼接到查询里。
参数:
必须是对目标数据库服务器有效的 SQL 语句模板
返回值:
如果数据库服务器完成准备了语句, PDO::prepare() 返回 PDOStatement 对象。 如果数据库服务器无法准备语句, PDO::prepare() 返回 FALSE 或抛出 PDOException (取决于 错误处理器)。
8.PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
返回值:
返回一个 SQLSTATE,一个由5个字母或数字组成的在 ANSI SQL 标准中定义的标识符。 简要地说,一个 SQLSTATE 由前面两个字符的类值和后面三个字符的子类值组成
9.PDO :: errorInfo — 获取与数据库句柄上的最后一个操作关联的扩展错误信息
返回值:
PDO :: errorInfo()返回有关此数据库句柄执行的最后操作的错误信息数组。
10.PDO::setAttribute — 设置属性
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
六、PDOStatement类常用方法
1.PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
安排一个特定的变量绑定到一个查询结果集中给定的列。每次调用 PDOStatement::fetch() 或 PDOStatement::fetchAll() 都将更新所有绑定到列的变量.
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
2.PDOStatement::bindParam — 绑定一个参数到指定的变量名
绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符。 不同于 PDOStatement::bindValue() ,此变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
3.PDOStatement::bindValue — 把一个值绑定到一个参数
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
两者区别:

4.PDOStatement::columnCount — 返回结果集中的列数
使用 PDOStatement::columnCount() 返回由 PDOStatement 对象代表的结果集中的列数。如果是由 PDO::query() 返回的 PDOStatement 对象,则列数计算立即可用。如果是由 PDO::prepare() 返回的 PDOStatement 对象,则在调用 PDOStatement::execute() 之前都不能准确地计算出列数。

返回值:
返回由 PDOStatement 对象代表的结果集中的列数。如果没有结果集,则 PDOStatement::columnCount() 返回 0。
5.PDOStatement::execute — 执行一条预处理语句
参数:
一个元素个数和将被执行的 SQL 语句中绑定的参数一样多的数组。所有的值作为 PDO::PARAM_STR 对待。不能绑定多个值到一个单独的参数;比如,不能绑定两个值到 IN()子句中一个单独的命名参数。绑定的值不能超过指定的个数。如果在 input_parameters 中存在比 PDO::prepare() 预处理的SQL 指定的多的键名,则此语句将会失败并发出一个错误。
补充:PDO::PARAM_STR表示 SQL 中的 CHAR、VARCHAR 或其他字符串类型
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
6.PDOStatement::fetch — 从结果集中获取下一行
返回值:
此函数(方法)成功时返回的值依赖于提取类型。在所有情况下,失败都返回 FALSE
7.PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
返回值:
PDOStatement::fetchAll() 返回一个包含结果集中所有剩余行的数组。此数组的每一行要么是一个列值的数组,要么是属性对应每个列名的一个对象。使用此方法获取大结果集将导致系统负担加重且可能占用大量网络资源。与其取回所有数据后用PHP来操作,倒不如考虑使用数据库服务来处理结果集。例如,在取回数据并通过PHP处理前,在 SQL 中使用 WHERE 和 ORDER BY 子句来限定结果。
8.PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
PDOStatement::rowCount() 返回上一个由对应的 PDOStatement 对象执行DELETE、 INSERT、或 UPDATE 语句受影响的行数。如果上一条由相关 PDOStatement 执行的 SQL 语句是一条 SELECT 语句,有些数据可能返回由此语句返回的行数。但这种方式不能保证对所有数据有效,且对于可移植的应用不应依赖于此方式。
返回值:
返回行数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值