4

我无法理解 1) PDOStatement 对象内部是什么,以及 2) 为什么我需要 fetch() 或 fetchAll() 方法。

我的数据库:一个名为“动物”的简单表格,包含 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 中的信息?

4

1 回答 1

4

因为这就是 API 的设计方式,并考虑到了灵活性。

您的对象不包含所有数据集。而是PDOStatement实现Iterator/Traversable接口,隐式调用->fetch每个foreach操作。

然而,有些人更喜欢->fetch手动使用,或者->fetchAll一次拉出所有行。

于 2013-11-03T01:49:11.587 回答