PDO獲取數據的方法fetch()、fetchAll()、setFetchMode()、bindColumn()


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()方法獲取具體列的屬性信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM