18.6.5  获取数据

PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成。不管使用PDO对象中的query()方法,还是使用prepare()和execute()等方法结合的预处理语句,执行SELECT查询都会得到相同的结果集对象PDOStatement,而且都需要通过PDOStatement类对象中的方法将数据遍历出来。下面介绍PDOStatement类中几种常见的获取结果集数据的方法。

1.fetch()方法

PDOStatement类中的fetch()方法可以将结果集中当前行的记录以某种方式返回,并将结果集指针移至下一行,当到达结果集末尾时返回FALSE。该方法的原型如下:

fetch ( [int fetch_style [, int cursor_orientation [, int   cursor_offset]]] )   //返回结果集的下一行

第一个参数fetch_style是可选项。在获取的一行数据记录中,各列的引用方式取决于这个参数如何设置。可以使用的设置有以下6种。

Ø PDO::FETCH_ASSOC:从结果集中获取以列名为索引的关联数组。

Ø PDO::FETCH_NUM:从结果集中获取一个以列在行中的数值偏移为索引的值数组。

Ø PDO::FETCH_BOTH:这是默认值,包含上面两种数组。

Ø PDO::FETCH_OBJ:从结果集当前行的记录中获取其属性对应各个列名的一个对象。

Ø PDO::FETCH_BOUND:使用fetch()返回TRUE,并将获取的列值赋给在bindParm()方法中指定的变量。

Ø PDO::FETCH_LAZY:创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这3种接口中任选一种。

第二个参数cursor_orientation是可选项,用来确定当对象是一个可滚动的游标时,应当获取哪一行。

第三个参数cursor_offset也是可选项,需要提供一个整数值,表示要获取的行相对于当前游标位置的偏移。

在下面的示例中,首先使用PDO对象中的query()方法执行SELECT查询,获取联系人信息表contactInfo中的信息,并返回PDOStatement类对象作为结果集;然后通过fetch()方法结合while循环遍历数据,并以HTML表格的形式输出。代码如下所示:

该程序的输出结果演示如图18-7所示。

图18-7  数据输出结果演示

2.fetchAll()方法

fetchAll()方法与fetch()方法类似,但是该方法只需要调用一次就可以获取结果集中的所有行,并赋给返回的数组(二维)。该方法的原型如下:

fetchAll ( [int fetch_style [, int column_index]] )                //一次调用返回结果集中的所有行

第一个参数fetch_style是可选项,以何种方式引用所获取的列取决于该参数。默认值为PDO::FETCH _BOTH,所有可用的值可以参照在fetch()方法中介绍的第一个参数的列表,还可以指定PDO::FETCH_COLUMN值,从结果集中返回一个包含单列的所有值。

第二个参数column_index是可选项,需要提供一个整数索引,当在fetchAll()方法的第一个参数中指定PDO::FETCH_COLUMN值时,从结果集中返回通过该参数提供的索引所指定列的所有值。fetchAll()方法的应用如下所示:

该程序的输出结果和前一个示例相似,只是多输出一个包含所有联系人姓名的数组。使用fetchAll()方法代替fetch()方法在很大程度上是出于方便的考虑,然而使用fetchAll()方法处理特别大的结果集时,会给数据库服务器资源和网络带宽带来很大的负担。

3.setFetchMode()方法

PDOStatement对象中的fetch()和fetchAll()两种方法,获取结果数据的引用方式默认是一样的,既按列名索引又按列在行中的数值偏移(从0开始)索引的值数组引用,因为它们默认都被设置为PDO::FETCH_BOTH值。如果计划使用其他模式来改变这个默认设置,可以在fetch()或fetchAll()方法中提供需要的模式参数。但如果多次使用这两种方法,在每次调用时都需要设置新的模式来改变默认的模式。这时,可以使用PDOStatement类对象中的setFetchMode()方法,在脚本页面的顶部设置一次模式,以后所有fetch()和fetchAll()方法的调用都将生成相应引用的结果集,减少了在调用fetch()方法时的多次参数录入。

4.bindColumn()方法

使用该方法可以将一个列和一个指定的变量名绑定,这样在每次使用fetch()方法获取各行记录时,会自动将相应的列值赋给该变量,但前提是fetch()方法的第一个参数必须设置为PDO::FETCH_BOTH的值。bindColumn()方法的原型如下所示:

bindColumn ( mixed column, mixed &param [, int type] )           //设置绑定列值到变量上

第一个参数column为必选项,可以使用整数的列偏移位置索引(索引值从1开始),或者使用列的名称字符串。第二个参数param也是必选项,需要进行引用传递,所以必须提供一个相应的变量名。第三个参数type是可选项,通过设置变量的类型来限制变量值,该参数支持的值和介绍bindParam()方法时提供的一样。该方法的应用示例如下:

在本例中,既在第15行和第16行,使用整数的列偏移位置索引,将第一列和变量$uid绑定,第二列和变量$name绑定;又在第17行和第18行,使用列的名称字符串分别将phone和email两个列绑定到变量$phone和$email上。根据前文给出的数据样本,有3条符合条件的数据记录,输出结果如下:

1       高某某       15801680168      gmm@lampbrother.net

4       王某某       15801681357      wmm@lampbrother.net

5       陈某某       15801682468      cmm@lampbrother.net

5.获取数据列的属性信息

在项目开发中,除了可以通过上面的几种方式获取数据表中的记录信息,还可以使用PDOStatement类对象的columnCount()方法获取数据表中字段的数量,并且可以通过PDOStatement类对象的getColumnMeta()方法获取具体列的属性信息。

18.6.6  大数据对象的存取

在进行项目开发时,有时需要在数据库中存储“大型”数据。大型对象可以是文本数据,也可以是二进制数据形式的图片、视频等。PDO允许在bindParam()或bindColumn()调用中通过使用PDO::PARAM_LOB类型代码来使用大型数据类型。PDO::PARAM_LOB告诉PDO将数据映射为流,所以可以使用PHP中的文件处理函数来操纵这样的数据。下面是将上传的图像插入一个数据库中的示例:

现在介绍另一个例子:从数据库中获取一幅图像,并使用fpassthru()函数将给定的文件指针,从当前的位置读取EOF并把结果写到输出缓冲区。代码如下所示:

这两个例子都是宏观层次的,被选取的大型对象是一个文件流,可以通过所有常规的流函数来使用它,如fgets()、fread()、stream_get_contents()等文件处理函数。

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

  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 4

    18.4  创建PDO对象 使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象.在通过构造方法创 ...

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

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

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

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

  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. HDFS存入文件的整个流程

    本文结合HDFS的副本和分块从宏观上描述HDFS存入文件的整个流程.HDFS体系中包含Client.NameNode.DataNode.SeconderyNameode四个角色,其中Client是客户 ...

  2. application context not configured for this file于spring框架使用中的原因

    spring配置文件中时常会出现这个提示,翻译过来大概意思就是没有配置该文件到项目中 于是进入到Project Structure中查看 可以很明显的看到下面有个感叹号,大概意思是下面的文件没有匹配 ...

  3. docker Dockerfile里使用的命令说明

    一,dockerfile格式 注释# 指令 参数 指令不区分大小写,但是推荐全部大写指令. 指令从上到下顺序被执行 第一个指令必须是[FROM],指示出要使用的基础镜像. 执行docker file时 ...

  4. JS原型链与instanceof底层原理

    一.问题: instanceof 可以判断一个引用是否属于某构造函数: 另外,还可以在继承关系中用来判断一个实例是否属于它的父类型. 老师说:instanceof的判断逻辑是: 从当前引用的proto ...

  5. HTTP常见响应状态码及解释、常用请求头及解释

    1.HTTP常见响应状态码及解释2XX Success(成功状态码) 200 表示从客户端发来的请求在服务器端被正常处理204 该状态码表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主 ...

  6. UI设计---初来乍到

    2019.12.1   今天学习两节 实现自己既定的目标,必须能耐得住寂寞单干. PS下载 给大家分享一个2019ps教程,提取码:ywnl 或扫描二维码 迅捷思维导图:使用" Enter  ...

  7. IT兄弟连 HTML5教程 多媒体应用 HTML图像地图

    图像地图是带有可点击区域的图像,通常情况下,每个区域是一个相关的超级链接.点击某个区域,就会到达相关的链接,也可以通过图像地图实现图片切换效果. 1  什么是图像地图 把一幅图像分成为多个区域,每个区 ...

  8. PowerMock学习(八)之Mock Argument Matcher的使用

    前言 本计划在上周六日将powermock学完,并同步到博客中,结果自己没经得住诱惑,又开始去打王者荣耀了.虽然两天时间我从钻石一升到了星耀V四星,但是我并没有觉得很开心,相反很失落呢.不得不说腾讯的 ...

  9. SpringBoot2.0 整合 Redis集群 ,实现消息队列场景

    本文源码:GitHub·点这里 || GitEE·点这里 一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的 ...

  10. 【编译系统02】编译器 - 语义分析器(semantic)的简单设计思路(变量类与变量表)

    当我们分析到 "int n;",说明其已经定义了一个变量,之后又遇到一个 "n=3",我们从哪里去找这个n并且赋值呢? 答案是:通过我们定义的 变量表(Tabl ...