我不明白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()
來獲取信息,我必須從數據庫中獲取已並在結果集中$結果?
那麼PDOStatement對象究竟包含什麼內容?只有一個屬性'queryString'與SQL語句的值或更多? –
'print_r'只顯示其公共屬性。但它也包含一個結果句柄,它隱藏是因爲你不能使用它從PHP userland中使用它。 – mario
從php.net:print_r()也將顯示PHP 5的對象的保護和私有屬性。但正如我在PDOStatement類的引用中看到的,queryString無論如何是唯一的屬性和其他方法。所以我得出結論,PDOStatement不包含結果(並且不是我在某處讀取的結果集)。當調用fetch()或fetchAll()時,結果集從數據庫中提取。 PDOStatement可能是這個過程的一種中介。 (我仍然想知道它的確切角色,但我無法弄清楚)。你怎麼看? –