IE盒子

搜索
查看: 140|回复: 1

PHP从入门到精通—PDO数据库抽象层—PDO概述、使用 ...

[复制链接]

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-2-21 02:23:14 | 显示全部楼层 |阅读模式
学习完上一章对PHP操作MySQL数据库(PHP从入门到精通—PHP操作MySQL数据库—PHP访问MySQL数据库的一般步骤、PHP操作MySQL数据库的方法、PHP操作MySQL实战演练)有一个基本的了解,在项目开发过程中,PHP程序可能需要操作多种数据库,例如,MySQL、Oracle等,为了让PHP程序能够简单、高效的操作不同种类的数据库,PHP语言提供了数据库抽象层。数据库抽象层包含了一套统一访问各种数据库的API,它简洁高效,可以让PHP程序实现更好的抽象和兼容。在所有数据库抽象层中,最为常用的是PDO数据库抽象层,接下来,本章将对PDO数据库抽象层进行详细讲解。


PDO概述
Ø PDO简介
随着业务需求的日益多样化,PHP程序使用多种数据库的情况也越来越常见。如果只是通过单一的接口针对单一的数据库编写程序,例如,用MySQL函数处理MySQL数据库,或者使用其他函数处理其他类型的数据库,这会提高编程的复杂度和工作量,同时也会增加程序移植和维护的难度。
为了解决这个问题,数据库抽象层被引入到PHP开发中。通过数据库抽象层,PHP程序把数据处理和数据库连接分开,程序连接的数据库的类型不影响PHP业务逻辑程序。
PDO是PHP数据对象(PHP Data Object)的缩写,它是实现数据库抽象层的数据库抽象类,其作用是统一各种数据库的访问接口。
PDO类是PHP 5中最为突出的功能之一。PHP 5版本以前,PHP都只能通过针对MySQL的类库、PgSQL类库以及MSSQL的类库等实现针对性的数据库连接。PHP 5版本以后,基于PDO抽象层,PHP程序可以采用若干不同的数据库支持方案。
PDO扩展是模块化的,使能够在程序运行时为自己的数据库后端加载驱动程序,而不必重新编译或安装整个PHP程序。例如,PDO_MySQL扩展会替代PDO扩展实现MySQL数据库API。
Ø PDO的安装
PDO类库是PHP自带的类库,因此要使用PDO类库,只需要在php.ini中把关于PDO类的语句前面的注释符号去掉即可。
首先启用extension=php_pdo.dll类库,这个类库是PDO类库本身。然后是不同的数据库驱动类库选项。extension=php_pdo_mysql.dll适用于MySQL数据库的连接。如果使用MSSQL,可以启用extension=php_pdo_mssql.dll类库。如果使用Oracle数据库,可以启用extension=php_pdo_oci.dll类库。除了这些,还有支持PgSQL和SQLite等的类库。
本机环境下启用的类库为extension=php_pdo.dll和extension=php_pdo_mysql.dll。
使用PDO连接数据库
Ø 数据准备
首先使用命令提示符窗口创建一个名称为qianfeng_edu的数据库,SQL语句如下所示。
CREATE DATABASE section16;
接着将当前使用的数据库切换为section16,SQL语句如下所示。
USE section16;
然后创建一张名称为student的数据表,SQL语句如下所示。
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
   `id` INT(4) NOT NULL  AUTO_INCREMENT,
   `name` VARCHAR(24) DEFAULT NULL,
   `age` VARCHAR(24) DEFAULT NULL,
  `course` VARCHAR(24) DEFAULT NULL,
    PRIMARY KEY (`id`)
)  DEFAULT CHARSET=utf8;
向student表中插入数据,SQL语句如下所示。
INSERT INTO student(`name`,`age`,`course`)
VALUES('Zhangsan','21','PHP');
INSERT INTO student(`name`,`age`,`course`) VALUES('LiSi','20','Java');
INSERT INTO student(`name`,`age`,`course`) VALUES('WangWu','19','PHP');
INSERT INTO student(`name`,`age`,`course`) VALUES('ZhaoLiu','21','PHP');
INSERT INTO student(`name`,`age`,`course`) VALUES('SunQi','20','Python');
Ø PDO构造函数
使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象。在通过构造方法创建对象的同时,需要建立一个与数据库服务器的连接,并选择一个数据库。PDO的构造函数的语法如下:
__construct(string $dsn [,string $username[,string $password[,array
$driver_options]]] )
其中,参数$dsn表示数据源名称,包括主机名端口号和数据库名称;$username表示连接数据库的用户名;$password表示连接数据库的密码;$driver_options连接数据库的其他选项。

Ø DSN详解
DSN是Data Source Name(数据源名称)的缩写,DSN提供连接数据库需要的信息。PDO的DSN包括3部分:PDO驱动名称(如:MySQL、SQLite或PgSQL)、冒号和驱动特定的语法。每种数据库都有其特定的驱动语法。
实际中有一些数据库服务器可能与Web服务器不在同一台计算机上,则需要修改DSN中的主机名称。由于数据库服务器只在特定的端口上监听连接请求,故每种数据库服务器具有一个默认的端口号(MySQL的默认端口号是3306),但是数据库管理员可以对端口号进行修改,因此有可能PHP程序找不到数据库的端口号,此时就可以在DSN中包含端口号。
由于一个数据库服务器中可能同时拥有多个数据库,所以在通过DSN连接数据库时,通常包括数据库名称,这样可以确保连接的是用户想要的数据库,而不是其他的数据库。
PDO中执行SQL语句

Ø 使用PDO::exec()方法
PDO对象的exec()方法主要用于执行insert、update和delete语句,该方法成功执行后,将返回受影响的行数,其语法格式如下:
     int PDO::exec ( string $statement )
其中,变量$statement代表要被执行的 SQL 语句。
接下来通过一个实例演示PDO::exec()方法的使用,具体案例详情参考16.3.1。
Ø 使用PDO::query()方法
PDO对象的query()方法主要用于执行select语句,如果该方法成功执行,则返回一个结果集(PDOStatement)对象,其语法格式如下:
PDOStatement PDO::query ( string $statement )
其中,变量$statement代表要被执行的SQL 语句,PDOStatement代表结果集。如果想要获取结果集中数据记录的个数,可以调用PDOStatement对象中的rowCount()方法,

Ø 使用PDO::prepare()和PDOStatement::execute()方法
当同一个查询需要多次执行时(有时需要迭代传入不同的列值),使用预处理语句的方式来实现效率会更高。预处理语句包括prepare()和execute()两种方法。首先,通过prepare()方法做查询的准备工作,然后通过execute()方法执行查询。其语法结构形式如下:
PDOStatement PDO::prepare( string statement [,array driver_options])
     bool PDOStatement::execute( [array input_parameters] )
其中,参数statement表示合法的SQL语句;参数driver_options是一个数组,此数组包含一个或多个键值对来设置PDOStatement对象的属性。该函数如果执行成功,则返回一个PDOStatement对象,如果失败返回FALSE或抛出异常PDOException。
PDO中获取结果集
PDO的数据获取方法与其他数据库扩展都非常类似,只要成功执行SELECT查询,都会有结果集对象生成。不管是使用PDO对象中的query()方法,还是使用prepare()和excute()等方法结合的预处理语句,执行SELECT查询都会得到相同的结果集PDOStatement,而且都需要通过PDOStatement类对象中的方法将数据遍历出来。接下来介绍PDOStatement类中常见的几个获取结果集数据的方法。
Ø 使用fetch()方法
fetch()方法获取结果集中的下一行数据,其语法格式如下:
mixed $PDOStatement::fetch( [int $fetch_style [,int $cursor_orientation
[,int $cursor_offset]]] )
其中,参数fetch_style表示控制结果集的返回方式,其可选值如表所示;参数cursor_orientation表示PDOStatement对象的一个滚动游标,可用于获取指定的一行;参数cursor_offset表示游标的偏移量。
说 明
PDO::FETCH_ASSOC关联数组形式
PDO::FETCH_NUM数字索引数组形式
PDO::FETCH_BOTH两者数组形式都有
PDO::FETCH_OBJ按照对象的形式类似mysql_fetch-object()
PDO::FETCH_BOUND以布尔值的形式返回结果,同时将获取的列值赋给bindParam()
PDO::FETCH_LAZY已关联数组、数字索引数组和对象3种形式返回结果
Ø 使用fetchAll()方法
fetchAll()方法获取结果集中的所有行,其语法格式如下:
array $PDOStatement::fetchAll( [int $fetch_style[,int $column_index]] )
其中,参数fetch_style表示控制结果集的返回方式,参数column_index表示字段的索引;该函数返回值是一个包含结果集中所有数据的二维数组。
Ø 使用fetchColumn()方法
fetchColumn()方法获取结果集中下一行指定列的值,其语法格式如下:
string $PDOStatement::fetchColumn( [int $column_number] )
其中,可选参数$column_number设置行中列的索引值,该值从0开始。如果省略该参数则将从第1列开始取值。
PDO中的错误处理
在PDO中有两个获取程序中错误信息的方法:errorCode()方法和errorInfo()方法。
Ø errorCode()方法
errorCode()方法用于获取在操作数据库句柄时所发生的错误代码,这些错误代码被称为SQLSTATE代码,其语法格式如下:
int $PDOStatement::errorCode( void )
该函数返回一个 SQLSTATE,它是由一个5个字母或数字组成的在 ANSI SQL 标准中定义的标识符。 简要地说,一个 SQLSTATE 由前面2个字符的类值和后面3个字符的子类值组成。如果数据库句柄没有进行操作,则返回 NULL。
Ø errorlnfo()
errorInfo()方法用于获取操作数据库句柄时所发生的错误信息,其语法格式如下:
array PDOStatement::errorInfo( void )
errorInfo()方法返回值为一个数组,它包含了相关的错误信息。
Ø PDO中的事务处理
事务是指一个单元的一组有序的数据库操作,它由一条或多条SQL命令所组成,这些SQL命令不可分割,只有当事务中的所有SQL命令被成功执行后,整个事务引发的操作才会被更新到数据库,如果有至少一条执行失败,所有操作将会被取消。
事务功能是企业级数据库的一个重要组成部分,因为很多业务过程都包括多个步骤。如果任何一个步骤失败,则所有步骤都不应发生。事务处理有4个重要特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),即ACID。  
对于在一个事务中执行的任何工作,即使它是分阶段执行的,也一定可以保证该工作会安全地应用于数据库,并且在工作被提交时,不会受到其他连接的影响。
在默认情况下,MySQL是以自动提交(autocommit)模式运行的,这就意味着执行的每一条语句都将立即写入数据库中。如果使用事务功能,首先要关闭自动提交功能。关闭自动提交功能,SQL语句如下:
mysql>set autocommit=0; //在当前的会话中关闭自动提交
关闭自动提交模式后,可以开启一个事务,SQL语句如下:
mysql>start transaction; //开始事务
开启事务后,可以输入要执行的SQL语句,在完成一个事务中所有SQL语句输入后,需要提交事务,SQL语句如下:
mysql>commit; //提交事务
只有事务被成功提交,该事务中包含的所有SQL命令才会被全部执行。
如果需要取消事务开启后的SQL操作,可以使用事务回滚将数据库恢复到以前的状态,事务回滚的SQL语句如下:
mysql>rollback; // 事务回滚,所有操作都将被取消
以上介绍了使用SQL语句处理事务,接下来讲解使用PDO处理事务。
PDO只为能够执行事务的数据库提供事务支持。当第一次打开连接时,PDO需要在自动提交模式下运行。如果需要一个事务,那么必须使用PDO对象中的beginTransaction()方法来启动一个事务。如果底层驱动程序不支持事务,那么将会抛出一个PDOException异常。在一个事务中,可以使用PDO对象中的commit()或rollback()方法来结束该事务,这取决于事务中运行的代码是否成功。
小结:PHP从入门到精通—PDO数据库抽象层—PDO概述、使用PDO链接数据库、PDO中执行SQL语句、PDO获取结果集、PDO中的错误处理、事务处理
主要介绍了PDO数据库抽象层,从PDO的简介和安装,到PDO的实际应用,其中包括如何连接数据库、如何执行SQL语句、如何获取结果集以及执行错误处理再到PDO的事务处理。通过本章的学习,大家要理解PDO数据库抽象层的基础知识,能够使用PDO数据库抽象层完成对数据库的操作。
回复

使用道具 举报

3

主题

12

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 3 天前 | 显示全部楼层
我擦!我要沙发!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表