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. 如何通过QT designer设置不让窗口最大化

    最近使用QT写一个小窗口的程序,窗口通过QT designer制作之后,运行时可以最大化操作,且最大化之后界面上控件也不会随窗口变化而变化,但由于人都比较懒,直接在QT designer设置窗口属性时 ...

  2. 截取字符串substr和substring两者的区别

    两者有相同点: 如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 不同点:第二个参数: substr(startIndex,lenth): 第二个参数是 ...

  3. Educational Codeforces Round 77 (Rated for Div. 2)

    A: 尽可能平均然后剩下的平摊 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int ...

  4. Pro Micro

    选择这块Arduino板主要是因为它便宜(淘宝上20元左右搞定),引脚相对较多,体积小,而且其使用的处理器核心ATmega32U4(兼容Arduino Leonardo)可用于模拟HID设备,可以配合 ...

  5. vue安装遇到的5个报错小结

    前言 这篇博文不会教你怎么安装vue,但会告知安装过程中可能遇到的5个问题 2017年我写过一篇安装vue的博客,详情:https://www.cnblogs.com/tu-0718/p/752109 ...

  6. (四十)c#Winform自定义控件-开关-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  7. JavaScript-三种弹窗方式

    0918自我总结 JavaScript-三种弹窗方式 一.alert 带内容的弹框 用法: <script> alert('弹窗显示的内容') //会弹出框没有点确定不会执行下面的代码会发 ...

  8. Vue结合后台导入导出Excel问题详解

    话不多说,直接上前端代码 axios({ method: 'post', url: 'http://localhost:19090/exportUser',//这个是请求的地址 params: {// ...

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

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

  10. PHP时间戳相互转换

    1.获取当前时间方法date()很简单,这就是获取时间的方法,格式为:date(format,format,timestamp),format为格式.timestamp为时间戳–可填参数. 2.获取时 ...