我无法理解1)PDOStatement对象中的内容和2)为什么我需要fetch()或fetchAll()方法。
我的数据库:一个名为'animals'的简单表,有3列(id,name,species)。
我的代码:
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()
来获取我已经从数据库中获取的信息并且在结果集$ results中?
答案 0 :(得分:4)
因为这就是API的设计方式,需要考虑灵活性。
您的对象不包含所有数据集。相反,PDOStatement
实现了Iterator
/ Traversable
接口,为每个->fetch
操作隐式调用foreach
。
但有些人更喜欢手动使用->fetch
,或者->fetchAll
一次性提取所有行。