PDOStatement包含什么以及fetch / fetchAll的用途是什么?

时间:2013-11-03 01:44:58

标签: php mysql

我无法理解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中?

1 个答案:

答案 0 :(得分:4)

因为这就是API的设计方式,需要考虑灵活性。

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

但有些人更喜欢手动使用->fetch,或者->fetchAll一次性提取所有行。