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

 1、fetch()方法

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

mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )

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

PDO::FETCH_ASSOC          从结果集中获取以列名为索引的关联数组。
       PDO::FETCH_NUM             从结果集中获取一个以列在行中的数值偏移量为索引的值数组。
       PDO::FETCH_BOTH            这是默认值,包含上面两种数组。
       PDO::FETCH_OBJ               从结果集当前行的记录中获取其属性对应各个列名的一个对象。
       PDO::FETCH_BOUND        使用fetch()返回TRUE,并将获取的列值赋给在bindParm()方法中指 定的相应变量。
       PDO::FETCH_LAZY            创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这三种接口中任选一种。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
    try {
        $dbh = new PDO('mysql:dbname=testdb;host=localhost', $username, $passwd);
    }catch (PDOException $e){
        echo '数据库连接失败:'.$e->getMessage();
        exit;
    }
 
    echo '<table border="1" align="center" width=90%>';
    echo '<caption><h1>联系人信息表</h1></caption>';
    echo '<tr bgcolor="#cccccc">';
    echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th></tr>';
 
    //使用query方式执行SELECT语句,建议使用prepare()和execute()形式执行语句
    $stmt = $dbh->query("select uid,name,address,phone,email FROM contactinfo");
 
    //以PDO::FETCH_NUM形式获取索引并遍历
    while (list($uid,$name,$address,$phone,$email)=$stmt->fetch(PDO::FETCH_NUM)){
        echo '<tr>';
        echo '<td>'.$uid.'</td>';
        echo '<td>'.$name.'</td>';
        echo '<td>'.$address.'</td>';
        echo '<td>'.$phone.'</td>';
        echo '<td>'.$email.'</td>';
        echo '</tr>';
    }
 
    echo '</table>';
?>

2、fetchAll()方法

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

  array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )

fetchAll()方法的应用示例如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
    try {
        $dbh = new PDO('mysql:dbname=testdb;host=localhost', $username, $passwd);
    }catch (PDOException $e){
        echo '数据库连接失败:'.$e->getMessage();
        exit;
    }
 
    echo '<table border="1" align="center" width=90%>';
    echo '<caption><h1>联系人信息表</h1></caption>';
    echo '<tr bgcolor="#cccccc">';
    echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th></tr>';
 
    //使用query方式执行SELECT语句,建议使用prepare()和execute()形式执行语句
    $stmt = $dbh->prepare("select uid,name,address,phone,email FROM contactinfo");
    $stmt->execute();
    $allrows = $stmt->fetchAll(PDO::FETCH_ASSOC);       //以关联下标从结果集中获取所有数据
 
    //以PDO::FETCH_NUM形式获取索引并遍历
   foreach($allrows as $row){
        echo '<tr>';
        echo '<td>'.$row['uid'].'</td>';
        echo '<td>'.$row['name'].'</td>';
        echo '<td>'.$row['$address'].'</td>';
        echo '<td>'.$row['phone'].'</td>';
        echo '<td>'.$row['email'].'</td>';
        echo '</tr>';
    }
 
    echo '</table>';
    //以下是在fetchAll()方法中使用两个特别参数的演示示例
    $stmt->execute();
    $row = $stmt->fetchAll(PDO::FETCH_COLUMN,1);   //从结果集中获取第二列的所有值
    echo '所有联系人的姓名:';
    print_r($row);
?>

 3、setFetchMode()方法

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

4、bindColumn()方法

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

 bool PDOStatement::bindColumn ( mixed $column , mixed &$param [, int $type [, int $maxlen [, mixed $driverdata ]]] )

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
    try {
        $dbh = new PDO('mysql:dbname=testdb;host=localhost', $username, $passwd);
        $dbh = setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }catch (PDOException $e){
        echo '数据库连接失败:'.$e->getMessage();
        exit;
    }
 
     $query="select uid,name,,phone,email FROM contactinfo WHERE departmentId=d01'";
 
   try {
    $stmt = $dbh->prepare($query);
    $stmt->execute();
    $stmt->bindColumn(1,$uid);
    $stmt->bindColumn(2,$name);
    $stmt->bindColumn('phone',$phone);
    $stmt->bindColumn('email',$email);
 
    while ($stmt->fetch(PDO::FETCH_BOUND)){
        echo $uid."\t".$name."\t".$phone."\t".$email."\n";
    }
   }catch (PDOException $e){
    echo $e->getMessage();
   }
?>

5、获取数据列属性信息

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

PDO获取数据的方法fetch()、fetchAll()、setFetchMode()、bindColumn()的更多相关文章

  1. 三种获取数据的方法fetch和ajax和axios

    一 .fetch用法 ( 本人比较喜欢fetch,代码精简,虽说目前axios比较流行,但是fetch很多大厂已经开始用fetch开始封装了, 我觉得以后fetch会取代axios和ajax ) 1. ...

  2. React 中的 AJAX 请求:获取数据的方法

    React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 st ...

  3. Swift - 后台获取数据(Background Fetch)的实现

    前面讲了如何让程序申请后台短时运行.但这个额外延长的时间毕竟有限.所以从iOS7起又引入两种在后台运行任务的方式:后台获取和后台通知. 1,后台获取介绍 后台获取(Background Fetch)是 ...

  4. MySQL随机获取数据的方法,支持大数据量

    最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到 ...

  5. vue 中使用 AJAX获取数据的方法

    在VUE开发时,数据可以使用jquery和vue-resource来获取数据.在获取数据时,一定需要给一个数据初始值. 看下例: <script type="text/javascri ...

  6. 【MySQL】随机获取数据的方法,支持大数据量

    在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的.下面我来介绍随机取数据一些优化方法 ...

  7. vue 的父组件和子组件互相获取数据和方法

    父组件主动获取子组件的数据和方法 一.ref(但不能实时更新获取) 1.调用子组件的时候 定义一个ref <child ref="headerChild"></c ...

  8. echarts通过ajax动态获取数据的方法

    echarts表格的数据一般都需要动态获取,所以总结了一下通过ajax动态获取数据的操作: 插入的方法应该不止一种,我也是接触不久,所以刚学会了一种插入方法: 灵感和经验来自:https://www. ...

  9. php pdo 获取数据转换为json

    php 查询语句获取数据,数据库有好多表现形式,如何拿出自己需要的数据 $raceSQL ='select id, race_name,race_code,content from je_race ' ...

随机推荐

  1. WA(Write Amplification)写入放大

    WA是闪存及SSD相关的一个极为重要的属性.由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次.这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽 ...

  2. RHEL6.4 postfix+dovecot搭建邮件服务器

    实验需求:为公司搭建一台能够收信和发信的邮件服务器(192.168.100.1),为员工提供服务,公司域名为jinjianjun.com. 一.修改DNS服务器(192.168.100.2)上mx邮件 ...

  3. .NET(C#):使用XPath查询带有命名空间(有xmlns)的XML

    原文http://www.cnblogs.com/mgen/archive/2011/05/24/2056025.html 众所周知,XmlDocument可以进行XPath查询,但实际上这里所说的X ...

  4. Bootstrap禁用响应式布局

    在Bootstrap中极其重要的一个技术内容便是响应式布局了,一次编码针对不同设备终端的强大能力使得响应式技术愈发流行. 不过正所谓"萝卜青菜各有所爱",如果你想要使用Bootst ...

  5. POJ 2758 Checking the Text(Hash+二分答案)

    [题目链接] http://poj.org/problem?id=2758 [题目大意] 给出一个字符串,支持两个操作,在任意位置插入一个字符串,或者查询两个位置往后的最长公共前缀,注意查询的时候是原 ...

  6. 如何注册成为uber司机 快速成为优步司机网上注册流程攻略 2015最新

    [目前开通Uber的城市]:北京.上海.天津.广州.成都.深圳.杭州.重庆.武汉.青岛.南京.苏州.长沙.宁波.西安.佛山等.济南,烟台和厦门正在秘密的招第一批司机. [车辆要求]:要求裸车价8万以上 ...

  7. 2.Freshman阶段学习内容的确定

    我刷知乎.在知乎上答题的程序员,不是很牛逼就是更牛逼,说起各种系统.各种系统的各种版本.各种语言.数据库.算法.IT届的各种圣战都有板有眼.信手拈来.头头是道,不得不服.这导致了一些非常严重的问题:我 ...

  8. 笔记-Nodejs中的核心API之Events

    最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的 ...

  9. js 触摸事件

    js触摸事件 应用在移动端 webkit内核都支持. 触摸事件api https://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html 事件 ...

  10. dans le quartier

    culture /kyltyr/ 文化 une école [ekɔl] un cinéma un musée une église un théâtre  [teɑtr] un opéra  [ɔp ...