18.4  创建PDO对象

使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象。在通过构造方法创建对象的同时,需要建立一个与数据库服务器的连接,并选择一个数据库。PDO的构造方法原型如下:

__construct ( string dsn [, string username [, string password [,   array driver_options]]] )        //PDO的构造方法

在构造方法中,第一个必选的参数是数据源名(DSN),用来定义一个确定的数据库和必须用到的驱动程序。DSN的PDO命名惯例为PDO驱动程序的名称,后面跟一个冒号,再后面是可选的驱动程序的数据库连接变量信息,如主机名、端口和数据库名。例如,连接Oracle服务器和连接MySQL服务器的DSN格式分别如下:

oci:dbname=//localhost:1521/mydb      //连接Oracle服务器的DSN,oci:作为驱动前缀,主机localhost,端口1521,数据库mydb

MySQL:host=localhost;dbname=testdb       //连接MySQL服务器的DSN,MySQL:作为驱动前缀,主机localhost,数据库testdb

构造方法中的第二个参数username和第三个参数password分别指定用于连接数据库的用户名和密码,是可选参数。最后一个参数driver_options需要一个数组,用来指定连接所需的所有额外选项,传递附加的调优参数到PDO或底层驱动程序。

18.4.1  以多种方式调用构造方法

可以多种方式调用构造方法创建PDO对象。下面以连接MySQL和Oracle服务器为例,分别介绍构造方法的多种调用方式。

1.将参数嵌入构造函数

在下面的连接Oracle服务器的示例中,在DSN字符串中加载OCI驱动程序并指定了两个可选参数:第一个是数据库名称;第二个是字符集。使用特定的字符集连接一个特定的数据库;如果不指定任何信息,会使用默认的数据库。代码如下所示:

OCI:dbname=accounts告诉PDO它应该使用OCI驱动程序,并且应该使用accounts数据库。对于MySQL驱动程序,第一个冒号后面的所有内容都将被用作MySQL的DSN。连接MySQL服务器代码如下所示:

其他驱动程序会同样以不同的方式解释它的DSN。如果无法加载驱动程序,或者连接失败,则会抛出一个PDOException,以便开发人员决定如何最好地处理该故障。省略try…catch控制结构并无裨益,如果在应用程序的较高级别没有定义异常处理的方式,则在无法建立数据库连接的情况下,终止该脚本。

2.将参数存放在文件中

在创建PDO对象时,可以把DSN字符串放在另一个本地或远程文件中,并在构造函数中引用这个文件。代码如下所示:

只要将文件/usr/local/dbconnect中的DSN驱动改变,就可以在多个数据库系统之间切换,但要确保该文件由负责执行PHP脚本的用户所拥有,而且此用户拥有必要的权限。

3.引用php.ini文件

只要在php.ini文件中把DSN信息赋给一个名为pdo.dsn.aliasname的配置参数,就可以在PHP服务器的配置文件中维护DSN信息,这里aliasname是后面将提供给构造函数的DSN别名。如下所示,连接Oracle服务器,在php.ini中为DSN指定的别名为oraclepdo:

[PDO]

pdo.dsn.oraclepdo="OCI:dbname=//localhost:1521/mydb;charset=UTF-8";

重新启动Oracle服务器,就可以在PHP程序中调用PDO构造方法时,在第一个参数中使用这个别名,代码如下所示:

4.PDO与连接有关的选项

在创建PDO对象时,有一些与数据库连接有关的选项,可以将必要的几个选项组成数组传递给构造方法的第四个参数driver_opts,用来传递附加的调优参数到PDO或底层驱动程序。PDO的一些与数据库连接有关的选项如表18-2所示。

表18-2  PDO的一些与数据库连接有关的选项

设置选项名为下标组成的关联数组,作为驱动程序特定的连接选项,传递给PDO构造方法的第四个参数。在下面的示例中使用连接选项创建持久连接,持久连接的好处是能够避免在每个页面执行时都打开和关闭数据库服务器连接,速度更快。如MySQL数据库的一个进程创建了两个连接,PHP则会把原有连接与新的连接合并为一个连接。代码如下所示:

18.4.2  PDO对象中的成员方法

当PDO对象创建成功后,与数据库的连接已经建立,就可以使用该对象了。PHP与数据库服务器之间的交互都是通过PDO对象中的成员方法实现的,PDO对象中的成员方法如表18-3所示。

表18-3  PDO对象中的成员方法(共13个)

从表18-3中PDO对象中的成员方法可以看出,使用PDO对象可以完成与数据库服务器之间的连接管理、存取属性、错误处理、查询执行、预处理语句,以及事务等操作。

《细说PHP》第四版 样章 第18章 数据库抽象层PDO 4的更多相关文章

  1. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 1

    现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用My ...

  2. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12

    18.9  管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...

  3. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 11

    18.8.3  完美分页类的代码实现 分页类的编写除了需要使用在18.8.2节中提供的可以操作的3个成员方法,还需要更多的成员,但其他的成员方法和成员属性只需要内部使用,并不需要用户在对象外部操作,所 ...

  4. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 7

    18.6  PDO对预处理语句的支持 在生成网页时,许多PHP脚本通常都会执行除参数外其他部分完全相同的查询语句.针对这种重复执行一个查询,但每次迭代使用不同参数的情况,PDO提供了一种名为预处理语句 ...

  5. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 10

    18.8  设计完美分页类 数据记录列表几乎出现在Web项目的每个模块中,假设一张表中有十几万条记录,我们不可能一次全都显示出来,当然也不能仅显示几十条.为了解决这样的矛盾,通常在读取时设置以分页的形 ...

  6. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 9

    18.7  PDO的事务处理 事务是确保数据库一致的机制,是一个或一系列的查询,作为一个单元的一组有序的数据库操作.如果组中的所有SQL语句都操作成功,则认为事务成功,那么事务被提交,其修改将作用于所 ...

  7. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8-1

    18.6.5  获取数据 PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成.不管使用PDO对象中的query()方法,还是使用prepare()和exe ...

  8. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8

    18.6.4  执行准备好的查询 当准备好查询并绑定了相应的参数后,就可以通过调用PDOStatement类对象中的execute()方法,反复执行在数据库缓存区准备好的语句了.在下面的示例中,向前面 ...

  9. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 6

    18.5.3  PDO的错误处理模式 PDO共提供了3种不同的错误处理模式,不仅可以满足不同风格的编程,也可以调整扩展处理错误的方式. 1.PDO::ERRMODE_SILENT 这是默认模式,在错误 ...

随机推荐

  1. SpringCloudGateWay修改请求路径,从注册中心获得服务

    SpringCloudGateWay修改请求路径,从注册中心获得服务 @Resource    private DiscoveryClient disClient;    @Resource    p ...

  2. LVS的工作模式介绍和NAT模式&DR模式实验步骤

    一:LVS介绍 二.LVS的NAT和DR模式的实验及配置步骤 一.LVS的简单介绍 linux virtual server 简单来讲lvs是一段内核代码 类似于netfilter本身是一框架但不提供 ...

  3. centos7 链路聚合+KVM桥接连网

    一.两个物理网卡做链路聚合(em3,em4) 1)创建team类型的网卡,连接别名为team0,使用的模式为activebackup-主备/loadbalance-负载均衡nmcli con add ...

  4. 使用脚本进行ansible批量主机的免密配置

    应用场景: 在应用ansible的实际情况中,有一个很现实的问题,ansible是需要对主机做ssh免密登陆的,而挨个对主机做免密是非常的繁琐的,挨个敲IP不仅非常的繁琐而且容易出错,为解决这个问题, ...

  5. Dubbo学习笔记-Zookeeper连接失败

    1. 检查服务器的zookeeper端口是否开放,默认为2181 2. 检查zookeeper是否运行成功 # 进入bin文件夹 cd /usr/local/zookeeper/bin # 重启 zk ...

  6. OAuth2.0授权登录

    最近工作中遇到了多系统间的授权登录,对OAuth2.0进行了学习研究,并总结备忘. [场景] 我们登录一些论坛等网站的时候,如果不想单独注册该网站账号,可以选择用微信或QQ账号进行授权登录. 这样的第 ...

  7. 微信公众号支付提示当前页面的URL未注册

    问题: 记一下前端时间自己做了一个微信公众号支付的功能,因为有一段时间没有接触过了微信支付方面的开发,居然忘记了在微信商户商户号中配置了对应的支付目录,所以提示我当前的域名是没有注册的. 设置支付目录 ...

  8. ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式

    准备 在Models文件夹里面新添加Student实体类,用来模拟从Controller向View传递数据,Student类定义如下: using System; using System.Colle ...

  9. C#时间戳与时间相互转换

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  10. raspberry-gpio-python(树莓派GPIO与Python编程)

    国外的设计接口设计得很棒,包括问题:读脏与防抖,还包括读这个数据提供了两种方式,一种是阻塞等待方式,还有一种是回调函数,前一种是通讯中常用的方式,后一种来自系统架构设计的整体性考虑.这种硬件接口设计的 ...