学科分类
目录
PHP基础

PDO读操作

PDO类提供的query()方法,用来执行查询类SQL,如SELECT。query()方法只能执行SQL语句,并不能直接解析结果,执行成功后返回PDOStatement类对象。接下来在pdo.php文件中封装执行查询操作的方法。具体代码如下所示。

 1  function pdo_query($pdo,$sql){
 2    $stmt = $pdo->query($sql);
 3    if(false === $stmt){
 4      echo 'SQL错误:<br/>';
 5      echo '错误代码:' . $pdo->errorCode() . '<br/>';
 6      echo '错误原因:' . $pdo->errorInfo()[2];
 7      exit;
 8    }
 9    return $stmt;
 10 }

与pdo_exec()方法不同的是,pdo_query()方法中调用query()方法来执行SQL,返回PDOStatement类对象。调用pdo_query()方法,查看返回结果。

 1  $sql = 'SELECT * FROM student';
 2  $stmt = pdo_query($pdo, $sql);
 3  var_dump($stmt); // object(PDOStatement)#2(1){["queryString"]=> string(21) "SELECT * FROM student"}

从输出结果可以看出,PDO的query()方法返回的是一个PDOStatement类的对象,没有返回任何查询的结果信息。通过PDOStatement类可以对结果集进行处理,其中有2个常用的方法fetch()和 fetchAll()等方法来处理结果集,下面分别介绍这2种方式的用法和区别。

1. fetch()

PDO中的fetch()方法可以从结果集中获取下一行的数据。其基本语法格式如下。

mixed PDOStatement::fetch ( 
int $fetch_style,                // 返回方式(可选)
int $cursor_orientation = PDO::FETCH_ORI_NEXT, // 滚动游标(可选)
int $cursor_offset = 0              // 游标的偏移量(可选)
)

在上述语法中,所有参数都为可选参数。其中,$fetch_style用于控制结果集的返回方式,其值必须是PDO::FETCH_*系列常量中的一个,可选常量如表1所示;$cursor_orientation是PDOStatement对象的一个滚动游标,可用于获取执行的一行;$cursor_offset表示游标的偏移量。

表1 PDO::FETCH_* 常用常量

常量名 说明
PDO::FETCH_ASSOC 返回一个键为结果集字段名的关联数组
PDO::FETCH_BOTH(默认) 返回一个索引为结果集列名和以0开始的列号的数组
PDO::FETCH_LAZY 返回一个包含关联数组、数字索引数组和对象的结果
PDO::FETCH_NUM 返回一个索引以0开始的结果集列号的数组
PDO::FETCH_CLASS 返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名
PDO::FETCH_OBJ 返回一个属性名对应结果集列名的匿名对象

2. fetchAll()

fetchAll()方法用于获取结果集中所有的行,其基本语法格式如下。

array PDOStatement::fetchAll (
int $fetch_style,          // 返回方式(可选)
mixed $fetch_argument,        // 滚动游标(可选)
array $ctor_args = array()      // PDO::FETCH_CLASS的参数(可选)
)

在上述语法中,$fetch_style用于控制结果集中数据的返回方式,默认值为PDO::FETCH_BOTH;参数$fetch_argument根据$fetch_style的值的变化而有不同的意义,具体如表2所示;$ctor_args 表示当$fetch_style的值为PDO::FETCH_CLASS 时,自定义类构造方法的参数。

表2 $fetch_argument参数的意义

$fetch_style取值 $fetch_argument的意义
PDO::FETCH_COLUMN 返回指定以0开始索引的列
PDO::FETCH_CLASS 返回指定类的实例,映射每行的列到类中对应的属性名
PDO::FETCH_FUNC 将每行的列作为参数传递给指定的函数,并返回调用函数后的结果

在了解PDOStatement类的常用方法后,接下来封装查询数据的方法,实现查询一条和多条数据的功能。在pdo.php中创建pdo_get()方法,具体代码如下所示。

 1  function pdo_get($stmt, $only = true, $fetch_style = PDO::FETCH_ASSOC){
 2    if(!$stmt instanceof PDOStatement) return true;
 3    if($only){
 4      return $stmt->fetch($fetch_style);
 5    }else{
 6      return $stmt->fetchAll($fetch_style);
 7    }
 8  }

在上述代码中,pdo_get()方法定义了3个参数,第1个参数$stmt是PDOStatement类对象,第2行代码使用instanceof关键字,用来判断$stmt对象是否是PDOStatement类的实例;第2个参数$only来区分获取单条数据或者是多条数据,默认为获取单条数据;第3个参数$fetch_style控制结果集中数据的返回方式,默认是以关联数组的形式返回。

修改mypdo.php中查询数据的代码,具体如下所示。

 1  $sql = 'SELECT * FROM student';
 2  $stmt = pdo_query($pdo, $sql);
 3  // 获取一条数据
 4  $data = pdo_get($stmt); 
 5  // 获取多条数据
 6  $data = pdo_get($stmt,false);

上述代码使用print_r()输出了pdo_get()方法返回的关联数组$data,结果如下所示。

// 获取一条数据
Array ( [id] => 1 [name] => Tom [mid] => 1 )
// 获取多条数据
Array ( 
[0] => Array ( [id] => 1 [name] => Tom [mid] => 1 )
[1] => Array ( [id] => 2 [name] => Jack [mid] => 1 )
[2] => Array ( [id] => 3 [name] => Alen [mid] => 2 )
[3] => Array ( [id] => 5 [name] => Jery [mid] => 2 )
)
点击此处
隐藏目录