1

我想知道为什么您可以在执行查询之前和之后设置提取模式,结果仍然使用给定的提取模式......?

这意味着 PDO 从数据库服务器检索查询结果作为数字和关联?唔...

是否只能检索一个..?数字结果还是关联结果?

这两个示例返回完全相同的结果。如果我setFetchMode省略了数字和 assoc 结果被打印

执行前

$sth = $dbh->prepare("SELECT REFERENCED_TABLE_NAME table_name, REFERENCED_COLUMN_NAME column_name\n"
    ."FROM KEY_COLUMN_USAGE\n"
    ."WHERE REFERENCED_TABLE_NAME IS NOT NULL && REFERENCED_COLUMN_NAME IS NOT NULL\n"
    ."GROUP BY REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME");
$sth->setFetchMode(PDO::FETCH_ASSOC);
$sth->execute();

echo '<pre>';
foreach($sth as $row){
    print_r($row);
}
echo '</pre>';

执行后

$sth = $dbh->prepare("SELECT REFERENCED_TABLE_NAME table_name, REFERENCED_COLUMN_NAME column_name\n"
    ."FROM KEY_COLUMN_USAGE\n"
    ."WHERE REFERENCED_TABLE_NAME IS NOT NULL && REFERENCED_COLUMN_NAME IS NOT NULL\n"
    ."GROUP BY REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME");
$sth->execute();
$sth->setFetchMode(PDO::FETCH_ASSOC);

echo '<pre>';
foreach($sth as $row){
    print_r($row);
}
echo '</pre>';
4

1 回答 1

5

您的示例使用了简化:在执行之后,但在您可以使用记录之前,您还需要获取它们。这些是PDOStatement 类中的 fetch 和 fetchAll 方法。

但是当使用 foreach 构造时,您使用的是 PDOStatement 的 Traversable 接口,它在 foreach 循环的开始调用 fetchAll 方法而不是您。

因此,在这两个示例中,fetchAll 在您设置获取模式后都会被调用。

编辑:

这意味着 PDO 从数据库服务器检索查询结果作为数字和关联?唔...

PDO 不会以一种或两种方式从数据库中获取记录,它总是以相同的方式进行 - 不同之处在于它将如何向您呈现结果。如果您指定获取模式,PDO 将为您构建请求的结构。如果您使用默认值或指定 FETCH_BOTH,它将为您构建两个不同的表示,但来自相同的结果集。此参数不会对发送到 SQL 服务器的命令产生影响。

于 2013-01-17T21:27:59.073 回答