PDOStatement::setFetchMode

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::setFetchMode 设置此语句的默认获取模式

说明

public PDOStatement::setFetchMode(int $mode): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_COLUMN, int $colno): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs = null): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_INTO, object $object): bool

参数

mode

获取模式必须是 PDO::FETCH_* 常量之一。

colno

列号。

class

类名。

constructorArgs

构造函数参数。

object

对象。

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 设置获取模式

以下示例演示了 PDOStatement::setFetchMode() 如何更改 PDOStatement 对象的默认获取模式。

<?php
$stmt
= $dbh->query('SELECT name, colour, calories FROM fruit');
$stmt->setFetchMode(PDO::FETCH_NUM);
foreach (
$stmt as $row) {
print
$row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
}

上面的示例将输出类似于

apple   red     150
banana  yellow  250
orange  orange  300
kiwi    brown   75
lemon   yellow  25
pear    green   150

添加说明

用户贡献说明 5 说明

Dormilich at netscape dot net
14 年前
如果您想将结果获取到一个类中(通过使用 PDO::FETCH_CLASS),并且希望在 PDO 分配对象属性之前执行构造函数,则需要使用 PDO::FETCH_PROPS_LATE 常量

<?php
$stmt
= $pdo->prepare("your query");

$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "className", $constructorArguments);

# 传递参数,如果查询需要
$stmt->execute($parameters);

foreach (
$stmt as $row)
{
// 对(每个)对象执行某些操作
}
?>
Kats
6 年前
了解如何在函数中访问命名空间非常有帮助。我花了一分钟(和谷歌)才弄清楚。在这种情况下,::class 属性将是您最好的朋友。

<?php
$stmt
->setFetchMode(PDO::FETCH_CLASS, Name\Space\Class::class);
?>
stein_AT_rhrk.uni-kl.de
16 年前
关于 PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE 的一些说明

我花了一些时间才意识到,当您想从数据库中检索对象而类型由结果集中的第一列定义时,您不能在 $stm->setFetchMode() 中使用此获取模式。
您必须直接在 $stm->fetch() 方法中定义此模式。

为了更清楚

$stm = $pdo->query("SELECT * FROM `foo`);
$stm->setFetchMode(FETCH_CLASS | PDO :: FETCH_CLASSTYPE);

$object = $stm->fetch();

不会返回预期的对象,而

$stm = $pdo->query("SELECT * FROM `foo`");

$object = $stm->fetch(FETCH_CLASS | PDO :: FETCH_CLASSTYPE);

将为您提供 `foo` 第一列中定义的类的对象。
Dariusz Kielar
18 年前
PDO::FETCH_CLASS 只能与此方法一起使用,并且它最多需要三个参数
- int mode
- string className
- array constructorArgs (可选)

<?php
$stmt
= $pdo -> query('your query');
$stmt -> setFetchMode(PDO::FETCH_CLASS, 'yourClass', array(0 => false));

while(
$row = $stmt -> fetch())
{
// $row 是 "yourClass" 类的对象
}
$stmt -> closeCursor();
?>

还要注意,构造函数是在数据设置到对象上之后调用的。
matt at kynx dot org
18 年前
要将行获取到类的现有实例中,请使用 PDO::FETCH_INTO 并将对象作为第二个参数传递。

该类_必须_将列名声明为公共成员,否则脚本将终止。但使用 __set() 和 __get() 进行重载可以让它处理查询中遇到的任何列。

在调用 prepare() 后立即设置获取模式。您_必须_使用 execute() - fetch() 不起作用。一个小的示例,改编自 ext/pdo/tests/pdo_025.phpt

<?php
class Test
{
protected
$cols;

function
__set($name, $value) {
$this->cols[$name] = $value;
}

function
__get($name) {
return
$this->cols[$name];
}
}

$obj = new Test();
$db = PDOTest::factory();
$stmt = $db->prepare("select * from test");
$stmt->setFetchMode(PDO::FETCH_INTO, $obj);
$stmt->execute();

foreach (
$stmt as $a) {
print_r($a);
}

print_r($obj); // contains the same values as the last iteration above
?>
To Top