zoukankan      html  css  js  c++  java
  • PHP PDO获取结果集

    php使用PDO抽象层获取查询结果,主要有三种方式:
    (1)PDO::query()查询。
    看下面这段php代码:
    <?php //PDO::query()查询
    $res = $db->query('select * from user');
    $res->setFetchMode(PDO::FETCH_NUM); //数字索引方式
    while ($row = $res->fetch()){
    print_r($row);
    }
    ?>
    (2)PDO->exec()处理sql
    <?php //PDO->exec()处理sql
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $res = $db->exec("insert into user(id,name) values('','php点点通')");
    echo $res;
    ?>
    (3)PDO::prepare()预处理执行查询
    <?php //PDO::prepare()预处理执行查询
    $res = $db->prepare("select * from user");
    $res->execute();
    while ($row = $res->fetchAll()) {
    print_r($row);
    }
    ?>
    setAttribute() 方法是设置属性,常用参数如下:
    PDO::CASE_LOWER -- 强制列名是小写
    PDO::CASE_NATURAL -- 列名按照原始的方式
    PDO::CASE_UPPER -- 强制列名为大写
    setFetchMode方法来设置获取结果集的返回值的类型,常用参数如下:
    PDO::FETCH_ASSOC -- 关联数组形式
    PDO::FETCH_NUM -- 数字索引数组形式
    PDO::FETCH_BOTH -- 两者数组形式都有,这是默认的
    PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object()
    对上面总结如下:
    查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
    PDO->query() — 处理一条SQL语句,并返回一个“PDOStatement”
    PDO->exec() — 处理一条SQL语句,并返回所影响的条目数
    PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句
    最后介绍两个常用的函数:
    (1)fetchColumn()获取指定记录里一个字段结果,默认是第一个字段!
    <?php
    $res = $db->query('select * from user');
    //获取指定记录里第二个字段结果
    $col = $res->fetchColumn(1);
    echo $col;
    ?>
    (2)fetchAll(),从一个结果集中获取数据,然后存放在关联数组
    <?php
    $res = $db->query('select * from user');
    $res_arr =$res->fetchAll();
    print_r($res_arr);
    ?>

    一、介绍PDO获取结果集,不得不介绍一下PDO是如果执行SQL语句,一般情况下分三种,

    1.query()方法

       query()方法通常用于返回执行查询后的结果集。语法是这样的:PDOStatement PDO::query(string sql);

       参数sql就很容易理解了,就是要执行的sql语句。

    2.prepare()方法和execute()方法

       prepare()是预处理语句的其中一个方法,通常来做查询的准备工作,然后,execute()来执行查询。

    以上就简单介绍这三种情况。

    二、PDO如何获取结果集

       pdo获取结果集有三种方法,分别是fetch()、fetchAll()和fetchColumn()方法。

     首先,你先在数据库里面建一个表,命名为t_user。

       CREATE TABLE `t_user` (
       `userid` int(11) NOT NULL,
       `username` varchar(25) DEFAULT NULL,
       `usersex` varchar(6) DEFAULT NULL,
      `userage` int(6) DEFAULT NULL,
       PRIMARY KEY (`userid`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      然后,插入数据,很简单,如下:  

     INSERT INTO `t_user` VALUES ('1', 'li', 'boy', '23');
     INSERT INTO `t_user` VALUES ('2', 'nadia', 'gril', '20');
     INSERT INTO `t_user` VALUES ('3', 'wang', 'boy', '55');

     下面就简单介绍一下每个方法是如何使用的。

       1.fetch()方法

          fecth()方法是获取结果集的下一行数据。

          表一:fetch_style控制结果集返回方式的可选值

          

    PDO::FETCH_ASSOC 关联数组形式。
    PDO::FETCH_NUM 数字索引数组形式。
    PDO::FETCH_BOTH 两者数组形式都有,这是默认的。
    PDO::FETCH_OBJ 按照对象的形式,类似于以前的mysql_fetch_object()函数。
    PDO::FETCH_BOUND 以布尔值的形式返回结果,同时将获取的列值赋给bindParam()方法中指定的变量。
    PDO::FETCH_LAZY 以关联数组、数字索引数组和对象3种形式返回结果。

        ftech()方法的具体代码如下所示:

        

       <table border='1'>
        <?php 
          $dbms = 'mysql';//选择mysql数据库
          $host = '127.0.0.1';//数据库主机名
          $dbName = 'dbtext';//使用的数据库
          $user = "";//数据库连接用户名
          $pwd = "";//数据库连接密码
          $dsn = "$dbms:host=$host;dbname=$dbName";
          try {
            $pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,创建数据库连接对象$pdo
            $query = "select * from t_user";
            $result = $pdo->prepare($query);
            $result->execute();
            while ($res=$result->fetch(PDO::FETCH_ASSOC)){?>
          <tr>
          <td><?php echo $res['userid'];?></td>
          <td><?php echo $res['username'];?></td>
          <td><?php echo $res['userage'];?></td>
          <td><?php echo $res['usersex'];?></td>
          </tr>
        <?php }
        }catch (Exception $e){
        die("error!!!".$e->getMessage()."<br>");
        }
        ?>
      </table>

       结果如下图1:

       

                                      图1

      2.fetchAll()方法

         从单词上可以看的很清楚,fetchAll()方法是为了获取结果集的所有行。

    fetch()方法

    fetch()方法用于获取结果集的下一行,语法如下:

    mixed PDOStatement::fetch([int fetch_style][,int cursor_orientation[,int cursor_offset]]])

    参数fetch_style控制结果集的返回方式

    PDO::FETCH_ASSOC -- 关联数组形式
    PDO::FETCH_NUM -- 数字索引数组形式
    PDO::FETCH_BOTH -- 两者数组形式都有,这是缺省的
    PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object()
    PDO::FETCH_BOUND--以布尔值的形式返回结果,同时获取的列值赋给bindParam()方法中的指定变量。
    PDO::FETCH_LAZY--以关联数组、数字索引数组和对象3种形式返回结果

    cursor_orientation:PDOStatement对象的一个滚动游标,可用于获取指定的一行。
    cursor_offset: 游标的偏移量

    例如:

    在PDO中通过预处理语句prepare()和execute()执行SQL查询语句,并且应用while()语句和fetch()方法完成数据的循环输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $dbms='mysql';//数据库类型
    $dbName='admin';//使用的数据库
    $user='root';//数据库连接用户名
    $pwd='password';//数据库连接密码
    $host='localhost';//数据库主机名
    $dsn="$dbms:host=$host;port=3306;dbname=$dbName";
    try{
    $pdo=new PDO($dsn,$user,$pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $query="select * from user";//需要执行的sql语句
    $res=$pdo->prepare($query);//准备查询语句
    $res->execute();
    while($result=$res->fetch(PDO::FETCH_ASSOC)){
    echo $result['id']." ".$result['username']." ".$result['password'].'<br>';
    }
    }catch(Exception $e){
    die("Error!:".$e->getMessage().'<br>');
    }

    运行结果为:

    1
    2
    3
    1 107lab e10adc3949ba59abbe56e057f20f883e
    4 admin 123456
    5 admin 123456

    fetchAll()方法

    fetchAll()方法用于获取结果集中的所有行,其返回值是一个包含结果集中所有数据的二进制数组。语法如下:

    array PDOStatement::fetchAll([int fetch_style[,int column_index]])

    参数说明:

    fetch_style:控制结果集中数据的显示方式。
    column_index: 字段的索引。

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $dbms='mysql';//数据库类型
    $dbName='admin';//使用的数据库
    $user='root';//数据库连接用户名
    $pwd='password';//数据库连接密码
    $host='localhost';//数据库主机名
    $dsn="$dbms:host=$host;port=3306;dbname=$dbName";
    try{
    $pdo=new PDO($dsn,$user,$pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $query="select * from user";//需要执行的sql语句
    $res=$pdo->prepare($query);//准备查询语句
    $res->execute();
    $result=$res->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);
    }catch(Exception $e){
    die("Error!:".$e->getMessage().'<br>');
    }

    运行结果为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Array
    (
    [0] => Array
    (
    [id] => 1
    [username] => 107lab
    [password] => e10adc3949ba59abbe56e057f20f883e
    )
    [1] => Array
    (
    [id] => 4
    [username] => admin
    [password] => 123456
    )
    [2] => Array
    (
    [id] => 5
    [username] => admin
    [password] => 123456
    )
    )

    此时可以通过foreach来遍历这个二维数组

    1
    2
    3
    foreach($result as $val){
    echo $val['username'].'<br>';
    }

    运行结果为:

    1
    2
    3
    107lab
    admin
    admin

    fetchColumn()方法

    fetchColumn()方法获取结果集中下一行指定列的值,语法如下:

    string PDOStatement::fetchColumn([int column_number])

    可选参数column_number设置行中列的索引值,该值从0开始。如果省略该参数则将从第1列开始取值

    例如:

    通过fetchColumn()方法获取结果集中下一行中指定列的值。(或第一列id的值)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $dbms='mysql';//数据库类型
    $dbName='admin';//使用的数据库
    $user='root';//数据库连接用户名
    $pwd='password';//数据库连接密码
    $host='localhost';//数据库主机名
    $dsn="$dbms:host=$host;port=3306;dbname=$dbName";
    try{
    $pdo=new PDO($dsn,$user,$pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $query="select * from user";//需要执行的sql语句
    $res=$pdo->prepare($query);//准备查询语句
    $res->execute();
    echo $res->fetchColumn(0).'<br>';
    echo $res->fetchColumn(0).'<br>';
    echo $res->fetchColumn(0).'<br>';
    }catch(Exception $e){
    die("Error!:".$e->getMessage().'<br>');
    }

    运行结果为:

    1
    2
    3
    1
    4
    5
  • 相关阅读:
    Android权限大全(链接地址整理)
    Android6.0运行时权限(基于RxPermission开源库)
    Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题
    使用AccessibilityService模拟点击事件失败的分析
    Android混淆打包配置总结
    okhttputils开源库的混淆配置(Eclipse)
    Android布局中的空格以及占一个汉字宽度的空格,实现不同汉字字数对齐
    java开发者大会:总结
    JAVA开发者大会:拍拍贷MQ系统原理与应用
    消息总线真的能保证幂等?
  • 原文地址:https://www.cnblogs.com/yuanscn/p/11237104.html
Copyright © 2011-2022 走看看