PDOStatement::setFetchMode
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)
PDOStatement::setFetchMode — 为语句设置默认的获取模式。
说明
PDOStatement::setFetchMode(int
$mode
): boolPDOStatement::setFetchMode(int
$PDO::FETCH_COLUMN
, int $colno
): boolPDOStatement::setFetchMode(int
$PDO::FETCH_CLASS
, string $classname
, array $ctorargs
): boolPDOStatement::setFetchMode(int
$PDO::FETCH_INTO
, object $object
): bool参数
-
mode
-
获取模式必须是
PDO::FETCH_*
系列常量中的一个。 -
colno
-
列号。
-
classname
-
类名。
-
ctorargs
-
构造函数参数。
-
object
-
对象。
返回值
成功时返回 true
, 或者在失败时返回 false
。
范例
示例 #1 设置获取模式
The following example demonstrates how PDOStatement::setFetchMode() changes the default fetch mode for a PDOStatement object.下面的例子示范如何用 PDOStatement::setFetchMode() 来为一个 PDOStatement 对象更改默认的获取模式。
<?php
$sql = 'SELECT name, colour, calories FROM fruit';
try {
$stmt = $dbh->query($sql);
$result = $stmt->setFetchMode(PDO::FETCH_NUM);
while ($row = $stmt->fetch()) {
print $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
}
}
catch (PDOException $e) {
print $e->getMessage();
}
?>
以上例程会输出:
apple red 150 banana yellow 250 orange orange 300 kiwi brown 75 lemon yellow 25 pear green 150 watermelon pink 90

User Contributed Notes 5 notes
Dormilich at netscape dot net ¶
11 years ago
if you want to fetch your result into a class (by using PDO::FETCH_CLASS) and want the constructor to be executed *before* PDO assings the object properties, you need to use the PDO::FETCH_PROPS_LATE constant:
<?php
$stmt = $pdo->prepare("your query");
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "className", $constructorArguments);
# pass parameters, if required by the query
$stmt->execute($parameters);
foreach ($stmt as $row)
{
// do something with (each of) your object
}
?>
Kats ¶
4 years ago
Something very helpful is knowing how to access namespaces from the function. It took me a minute (and Google) to figure out. The ::class property is going to be your best friend in this case.
<?php
$stmt->setFetchMode(PDO::FETCH_CLASS, Name\Space\Class::class);
?>
stein_AT_rhrk.uni-kl.de ¶
14 years ago
Some note on PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE
It took me some time, to realize, that you can not use this fetch-mode in $stm->setFetchMode(), when you want to retrieve objects from the database whereas the type is defined by the first column in the resultset.
You have to define this mode directly in the $stm->fetch() method.
To make it clearer:
$stm = $pdo->query("SELECT * FROM `foo`);
$stm->setFetchMode(FETCH_CLASS | PDO :: FETCH_CLASSTYPE);
$object = $stm->fetch();
Will not return the expected object, whereas
$stm = $pdo->query("SELECT * FROM `foo`");
$object = $stm->fetch(FETCH_CLASS | PDO :: FETCH_CLASSTYPE);
will give you the object of the class, defined in the first column of `foo`.
matt at kynx dot org ¶
16 years ago
To fetch the rows into an existing instance of a class, use PDO::FETCH_INTO and pass the object as the second parameter.
The class _must_ have the column names declared as public members, or the script will die. But overloading with __set() and __get() lets it handle any column your query throws at it.
Set the fetch mode right after you call prepare(). It appears you _must_ use execute() - fetch() won't work. A small example, adapted from 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
?>
Dariusz Kielar ¶
16 years ago
PDO::FETCH_CLASS may be used only with this method and it takes up to three parameters then:
- int mode
- string className
- array constructorArgs (optional)
<?php
$stmt = $pdo -> query('your query');
$stmt -> setFetchMode(PDO::FETCH_CLASS, 'yourClass', array(0 => false));
while($row = $stmt -> fetch())
{
// $row is an object of "yourClass" class
}
$stmt -> closeCursor();
?>
Note also that the constructor is called AFTER the data is set on the object.
备份地址:http://www.lvesu.com/blog/php/pdostatement.setfetchmode.php