OSWikiHK: 請協力 GPLv3 的中文翻譯工作。

PEAR::DB fetchRow

OSWikiHK,自由中文開源知識庫

目录

$result->fetchRow 及 $dbh->setFetchMode

第一個例子已告訴了大家可以用 $result->fetchRow 去讀取查詢的結果。用 PHP 寫過資料庫程式的朋友都知道 PHP 提供了三種方式來傳回查詢: *_fetch_row*_fetch_array*_fetch_objectPEAR::DB 當然也不會漏了這功能。 fetchRow 的第一個參數就是所謂讀取模式 (fetch mode, 結果以那種方式傳回) ,可以有下列值:

  • DB_FETCHMODE_ORDERED (預設值)
  • DB_FETCHMODE_ASSOC
  • DB_FETCHMODE_OBJECT

如沒有設定讀取模式,預設就是 DB_FETCHMODE_ORDERED 。 這模式 在例一已示範過了, 只是把傳回的結果存放在一以數字作索引的陣列(Array)的中。 前後次序是根據 SELECT 命令中欄名的次序。 模式 DB_FETCHMODE_ASSOC 則存放在以欄名作索引的陣列,例如:

$result = $dbh->query('SELECT id, name, mail FROM test_table');
while ( $row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
    echo "ID: $row['id']<br>";
    echo "Name: $row['name']<br>";
    echo "E-mail: $row['mail']<br>";
}

模式 DB_FETCHMODE_OBJECT 比較複雜,您最好先定義一個類別。 這個類別必需要有一個只用一個陣列作參數的 constructor , 而 constructor 要從陣列中的值設回屬性,如下:

 class TestUser {
     var $id, $name, $mail;

     function TestUser($attr = null) {
         if ( is_array($attr) ) {
             $this->id = $attr['id'];
             $this->name = $attr['name'];
             $this->mail = $attr['mail'];

         }
     }

     function toString() {
         $res = "!TestUser{\n  ID: $this->id\n";
         $res .= "  Name: $this->name\n";
         $res .= "  Mail: $this->mail\n}\n";
         return $res;
    }
 }

有了這個類別,我們就可以用 DB_FETCHMODE_OBJECT 去讀取 資料:

$dbh->setFetchMode(DB_FETCHMODE_OBJECT, 'TestUser');
$result = $dbh->query('SELECT id, name, mail FROM test_table');
while ( $row = $result->fetchRow()) {
   echo nl2br($row->toString());
}

上面的例子也首次使用了 setFetchMode 這個方法。 很多人應已猜到這方法是用來設定預設的讀取模式, 而如果設定的模式是 DB_FETCHMODE_OBJECT ,您就可以用第二個參數設定 fetchRow 時傳回物件的類別, 如上例中的 TestUser 。沒有設定類別的話,fetchRow 會傳回類別為 DB_row 的物件。

$dbh->getOne($query, $params = array())

getOne 會傳回查詢結果中第一筆記錄的第一個欄的值。

$numOfRecord = $dbh->getOne('SELECT count(*) FROM test_table');

$dbh->getRow($query, $fetchmode, $params)

getRow 會傳回查詢結果的第一筆記錄。

 $result = $dbh->getRow('SELECT * FROM test_table WHERE id = 4',
     DB_FETCHMODE_ASSOC);
 if ( DB::isError($result) ) {
    echo "Error: " . $result->getMessage();
    exit(1);
 }

 echo "ID: $result['id']<br>";
 echo "Name: $result['name']<br>";


$dbh->getCol($query, $col = 0, $params)

getRow 自然有 getCol ,作用為何也不必多說。 參數 col 就是用來指定要那一欄,可以是數目字 (零代表 SELECT 命令中的第一個欄) ,也可以是欄名。 不過說實,我暫時也想不到有什麼理由需要這個參數。

 $result = $dbh->getCol('SELECT name FROM test_table');
 if ( DB::isError($result) ) {
    echo "Error: " . $result->getMessage();
    exit(1);
 }

 echo "Name: " . join(', ', $result) . "<br>";

$dbh->getAssoc($query, $force_array)

getAssoc 會將查詢的所有結果放入以第一欄為索引的陣列。 例如 getAssoc('SELECT id, text FROM mydate') 的結果會是:


array (
  '1' => 'one',
  '2' => 'two',
  '3' => 'three'
)

getAssoc('SELECT id, text, date FROM mydate') 的結果則是:

array (
  '1' => array('one', '944'),
  '2' => array('two', '944'),
  '3' => array('three', '944')
)

$dbh->getAll($query, $params, $fetchmode)

從名字都可以看出這個數可以一次過把所有查詢的結果存回來 ,如 getAll('SELECT id, text FROM mydate', null, DB_FETCHMODE_ORDERED) 的結果會以下:

array(
  array('1', 'one'),
  array('2', 'two'),
  array('3', 'three')
)

getAll('SELECT id, text FROM mydate', null, DB_FETCHMODE_ASSOC) 的結果則會以下:

array(
  array( 'id' => '1', 'text' => 'one'),
  array( 'id' => '2', 'text' => 'two'),
  array( 'id' => '3', 'text' => 'three')
)
Personal tools
廣告橫額