OSWikiHK: 請協力 GPLv3 的中文翻譯工作。
PEAR::DB fetchRow
OSWikiHK,自由中文開源知識庫
目录 |
$result->fetchRow 及 $dbh->setFetchMode
第一個例子已告訴了大家可以用 $result->fetchRow
去讀取查詢的結果。用 PHP 寫過資料庫程式的朋友都知道 PHP
提供了三種方式來傳回查詢: *_fetch_row 、 *_fetch_array
及 *_fetch_object 。
PEAR::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') )

