PDOStatement::setFetchMode

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

PDOStatement::setFetchMode Legt den standardmäßigen Abrufmodus eine Anweisung fest

Beschreibung

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

Parameter-Liste

mode

Der Abrufmodus muss eine der PDO::FETCH_*-Konstanten sein.

colno

Die Nummer der Spalte

class

Der Name der Klasse

constructorArgs

Konstruktorargumente

object

Das Objekt

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben.

Beispiele

Beispiel #1 Festlegen des Abrufmodus

Das folgende Beispiel zeigt, wie PDOStatement::setFetchMode() den standardmäßigen Abrufmodus für ein PDOStatement-Objekt ändert.

<?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";
}

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

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

add a note add a note

User Contributed Notes 5 notes

up
34
Dormilich at netscape dot net
14 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
}
?>
up
8
Kats
7 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);
?>
up
0
stein_AT_rhrk.uni-kl.de
17 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`.
up
-5
Dariusz Kielar
18 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.
up
-6
matt at kynx dot org
18 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
?>
To Top