2013-11-03 94 views
4

我不明白1)PDOStatement對象內部和2)爲什麼我需要一個fetch()或fetchAll()方法。我的數據庫:一個簡單的名爲'動物'的表,有3列(id,名稱,種類)。PDOStatement包含什麼以及fetch/fetchAll的用途是什麼?

我的代碼:

try { 
    $pdo = new PDO($dsn, $user, $pass); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e) { 
    exit($e->getMessage()); 
} 

try { 
    $sql = "SELECT * FROM animals"; 
    $results = $pdo->query($sql); 
    print_r($results); 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

首先,print_r的(或的var_dump)打印這樣的:PDOStatement Object ([queryString] => SELECT * FROM animals)

但如果我這樣寫:

foreach($results as $row) { 
     echo $row['id'] . ' ' . $row['name'] . ' ' . $row['species']; 
} 

我的表中的每一內容打印。

所以1)爲什麼print_r不顯示任何信息,如果它存在於我的對象內?

2)爲什麼我需要$results->fetch()$results->fetchAll()來獲取信息,我必須從數據庫中獲取已並在結果集中$結果?

回答

4

因爲這就是API的設計方式,考慮到靈活性。

您的對象不包含所有數據集。而是PDOStatement實現Iterator/Traversable接口,爲每個foreach操作隱含地調用->fetch

然而,有些人傾向於手動使用->fetch,或者->fetchAll一次拉動所有行。

+0

那麼PDOStatement對象究竟包含什麼內容?只有一個屬性'queryString'與SQL語句的值或更多? –

+1

'print_r'只顯示其公共屬性。但它也包含一個結果句柄,它隱藏是因爲你不能使用它從PHP userland中使用它。 – mario

+0

從php.net:print_r()也將顯示PHP 5的對象的保護和私有屬性。但正如我在PDOStatement類的引用中看到的,queryString無論如何是唯一的屬性和其他方法。所以我得出結論,PDOStatement不包含結果(並且不是我在某處讀取的結果集)。當調用fetch()或fetchAll()時,結果集從數據庫中提取。 PDOStatement可能是這個過程的一種中介。 (我仍然想知道它的確切角色,但我無法弄清楚)。你怎麼看? –