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 )
)