PDO获取模式 - 查询之前/之后

cla*_*rkk 1 php pdo

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

这意味着PDO从数据库服务器检索查询结果为numeric和assoc?嗯...

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

这两个示例返回完全相同的结果.如果我遗漏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>';
Run Code Online (Sandbox Code Playgroud)

执行后

$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>';
Run Code Online (Sandbox Code Playgroud)

Dut*_*tow 5

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

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

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

编辑:

这意味着PDO从数据库服务器检索查询结果为numeric和assoc?嗯...

PDO不会以一种或两种方式从DB中获取记录,它将始终以相同的方式执行 - 不同之处在于它将如何向您呈现结果.如果指定了获取模式,PDO将为您构建所请求的结构.如果使用默认值,或指定FETCH_BOTH,它将构建两个不同的表示形式,但来自相同的结果集.此参数不会对发送到SQL Server的命令产生影响.