PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

PDOStatement->fetchAll> <PDOStatement->execute
Last updated: Fri, 03 Oct 2008

view this page in

PDOStatement->fetch

(No version information available, might be only in CVS)

PDOStatement->fetch Récupère la ligne suivante d'un jeu de résultat PDO

Description

mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation [, int $cursor_offset ]]] )

Récupère une ligne depuis un jeu de résultats associé à l'objet PDOStatement. Le paramètre fetch_style détermine la façon dont PDO retourne la ligne.

Liste de paramètres

fetch_style

Contrôle comment la prochaine ligne sera retournée à l'appelant. Cette valeur doit être une des constantes PDO::FETCH_*, et par défaut, vaut PDO::FETCH_BOTH.

  • PDO::FETCH_ASSOC: retourne un tableau indexé par le nom de la colonne comme retourné dans le jeu de résultats

  • PDO_FETCH_BOTH (défaut): retourne un tableau indexé par les noms de colonnes mais aussi par les numéros de colonnes (commençant à l'indice 0), comme retournés dans le jeu de résultats

  • PDO::FETCH_BOUND: retourne TRUE et assigne les valeurs des colonnes de votre jeu de résultats dans les variables PHP à laquelle elles sont liées avec la méthode PDOStatement::bindParam()

  • PDO::FETCH_CLASS: retourne une nouvelle instance de la classe demandée, liant les colonnes du jeu de résultats aux noms des propriétés de la classe. Si fetch_style inclut PDO::FETCH_CLASS (c'est-à-dire PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE), alors le nom de la classe est déterminé à partir d'une valeur de la première colonne.

  • PDO::FETCH_INTO: met à jour une instance existante de la classe demandée, liant les colonnes du jeu de résultats aux noms des propriétés de la classe

  • PDO::FETCH_LAZY: combine PDO::FETCH_BOTH et PDO::FETCH_OBJ, créant ainsi les noms des variables de l'objet, comme elles sont accédées

  • PDO::FETCH_NUM: retourne un tableau indexé par le numéro de la colonne comme elle est retourné dans votre jeu de résultat, commençant à 0

  • PDO_FETCH_OBJ: retourne un objet anonyme avec les noms de propriétés qui correspondent aux noms des colonnes retournés dans le jeu de résultats

cursor_orientation

Pour un objet PDOStatement représentant un curseur scrollable, cette valeur détermine quelle ligne sera retournée à l'appelant. Cette valeur doit être une des constantes PDO::FETCH_ORI_*, et par défaut, vaut PDO::FETCH_ORI_NEXT. Pour demander un curseur scrollable pour votre objet PDOStatement, vous devez définir l'attribut PDO::ATTR_CURSOR à PDO::CURSOR_SCROLL lorsque vous préparez la requête SQL avec la fonction PDO::prepare().

offset

Pour un objet PDOStatement représentant un curseur scrollable pour lequel le paramètre cursor_orientation est défini à PDO::FETCH_ORI_ABS, cette valeur spécifie le numéro absolu de la ligne dans le jeu de résultats qui doit être récupérée.

Pour un objet PDOStatement représentant un curseur scrollable pour lequel le paramètre cursor_orientation est défini à PDO::FETCH_ORI_REL, cette valeur spécifie la ligne à récupérer relativement à la position du curseur avant l'appel à la fonction PDOStatement::fetch().

Valeurs de retour

La valeur retournée par cette fonction en cas de succès dépend du type récupéré. Dans tous les cas, FALSE est retourné si une erreur survient.

Exemples

Exemple #1 Récupération de lignes en utilisant différentes méthodes

<?php
$sth 
$dbh->prepare("SELECT nom, couleur FROM fruit");
$sth->execute();

/* styles PDOStatement::fetch */
print("PDO::FETCH_ASSOC: ");
print(
"Retourne la ligne suivante en tant qu'un tableau indexé par le nom des colonnes\n");
$result $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);
print(
"\n");

print(
"PDO::FETCH_BOTH: ");
print(
"Retourne la ligne suivante en tant qu'un tableau indexé par le nom et le numéro de la colonne\n");
$result $sth->fetch(PDO::FETCH_BOTH);
print_r($result);
print(
"\n");

print(
"PDO::FETCH_LAZY: ");
print(
"Retourne la ligne suivante en tant qu'objet anonyme ayant les noms de colonnes comme propriétés\n");
$result $sth->fetch(PDO::FETCH_LAZY);
print_r($result);
print(
"\n");

print(
"PDO::FETCH_OBJ: ");
print(
"Retourne la ligne suivante en tant qu'objet anonyme ayant les noms de colonnes comme propriétés\n");
$result $sth->fetch(PDO::FETCH_OBJ);
print 
$result->NAME;
print(
"\n");
?>

L'exemple ci-dessus va afficher :

PDO::FETCH_ASSOC: Retourne la ligne suivante en tant qu'un tableau indexé par le nom des colonnes
Array
(
    [NOM] => apple
    [COULEUR] => red
)

PDO::FETCH_BOTH: Retourne la ligne suivante en tant qu'un tableau indexé par le nom et le numéro de la colonne
Array
(
    [NOM] => banana
    [0] => banana
    [COULEUR] => yellow
    [1] => yellow
)

PDO::FETCH_LAZY: Retourne la ligne suivante en tant qu'objet anonyme ayant les noms de colonnes comme propriétés PDORow Object
(
    [NOM] => orange
    [COULEUR] => orange
)

PDO::FETCH_OBJ: Retourne la ligne suivante en tant qu'objet anonyme ayant les noms de colonnes comme propriétés kiwi

Exemple #2 Récupération des lignes avec un curseur scrollable

<?php
function readDataForwards($dbh) {
  
$sql 'SELECT hand, won, bet FROM mynumbers ORDER BY BET';
  try {
    
$stmt $dbh->prepare($sql, array(PDO::ATTR_CURSORPDO::CURSOR_SCROLL));
    
$stmt->execute();
    while (
$row $stmt->fetch(PDO::FETCH_NUMPDO::FETCH_ORI_NEXT)) {
      
$data $row[0] . "\t" $row[1] . "\t" $row[2] . "\n";
      print 
$data;
    }
    
$stmt null;
  }
  catch (
PDOException $e) {
    print 
$e->getMessage();
  }
}
function 
readDataBackwards($dbh) {
  
$sql 'SELECT hand, won, bet FROM mynumbers ORDER BY bet';
  try {
    
$stmt $dbh->prepare($sql, array(PDO::ATTR_CURSORPDO::CURSOR_SCROLL));
    
$stmt->execute();
    
$row $stmt->fetch(PDO::FETCH_NUMPDO::FETCH_ORI_LAST);
    do {
      
$data $row[0] . "\t" $row[1] . "\t" $row[2] . "\n";
      print 
$data;
    } while (
$row $stmt->fetch(PDO::FETCH_NUMPDO::FETCH_ORI_PRIOR));
    
$stmt null;
  }
  catch (
PDOException $e) {
    print 
$e->getMessage();
  }
}

print 
"Lecture en avant :\n";
readDataForwards($conn);

print 
"Lecture en arrière :\n";
readDataBackwards($conn);
?>

L'exemple ci-dessus va afficher :

Lecture en avant :
21    10    5
16    0     5
19    20    10

Lecture en arrière :
19    20    10
16    0     5
21    10    5



PDOStatement->fetchAll> <PDOStatement->execute
Last updated: Fri, 03 Oct 2008
 
add a note add a note User Contributed Notes
PDOStatement->fetch
lod
16-Jul-2008 06:33
A quick one liner to get the first entry returned.  This is nice for very basic queries.

<?php
$count
= current($db->query("select count(*) from table")->fetch());
?>php
lozitskiys at gmail dot com
09-Jul-2008 02:21
I spent some hours trying to find out how to manipulate with BLOB fields using PDO.

Remember that you can't retreive BLOB data using something like this :

<?php
$sql
= 'SELECT * FROM sometable LIMIT 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$stmt->setAttribute(PDO::FETCH_ASSOC);
$row = $stmt->fetch();

$myFile = $row['file'];
?>

Instead of this you should try following approach:

<?php
$sql
= "SELECT mime, file FROM sometable LIMIT 1";
$stmt = $dbh->prepare($sql);
$stmt->execute();

$stmt->bindColumn(1, $mime,);
$stmt->bindColumn(2, $file, PDO::PARAM_LOB);

$stmt->fetch();

header('Content-type: '.$mime);
print
$file;

?>
josh
29-Apr-2008 09:02
Note that PDO::ATTR_STRINGIFY_FETCHES will NOT work for the MySQL driver. MySQL will always return strings because that is the behaviour of the core mysql PHP extension. See http://bugs.php.net/bug.php?id=44341
daltenho at yahoo dot com
28-Jan-2008 06:17
As an alternative to marcini's suggestion:

You can use:

        $dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

...on your PDO connection object to allow query buffering in MySQL. This will eliminate the problem of re-preparing an unclosed statement object.
Gerard van Beek
28-Oct-2007 10:42
If you to use a new instance of a class for a record you can use:

<?php
include_once("user.class");
$sth = $db->prepare("SELECT * FROM user WHERE id = 1");

/* create instance automatically */
$sth->setFetchMode( PDO::FETCH_CLASS, 'user');
$sth->execute();
$user = $sth->fetch( PDO::FETCH_CLASS );
$sth->closeCursor();
print (
$user->id);

/* or create an instance yourself and use it */
$user= new user();
$sth->setFetchMode( PDO::FETCH_INTO, $user);
$sth->execute();
$user= $sth->fetch( PDO::FETCH_INTO );
$sth->closeCursor();
print (
$user->id);
?>
BaBna
16-Aug-2007 09:52
When you do a SELECT query for one row, and want to check if it's there, you don't need to count the fetchAll() result, you can just check if $result->fetch() is true:
<?php
$bbnq
= sprintf("SELECT login
FROM users
WHERE id = %u"
,27);
try
    {
$req = $db_bbn->query($bbnq); }
catch (
Exception $e)
    {
bbnf_pdo_error($e,__FILE__,__LINE__); }
if (
$r = $req->fetch() )
    { echo
"This query has a row result"; }
else
    { echo
"This query has an empty result"; }
?>
jdriddle_producer at yahoo dot com
09-Aug-2007 02:33
Oops...

The constants are no longer PDO_FETCH_*

They are now class contants PDO::FETCH_*

The documentation above need to be changed appropriately.
jdriddle_producer at yahoo dot com
09-Aug-2007 02:28
>> note that fetch constants are not included in the PDO class for PHP versions prior to 5.1

They appear to not exist in 5.2.3 either, as I am getting the following error:

Notice: Use of undefined constant PDO_FETCH_ASSOC - assumed 'PDO_FETCH_ASSOC' in C:\Documents and Settings\driddle.AUTISMSPEAKS.000\My Documents\ascentral\sqlite_test.php on line 36

Warning: PDOStatement::fetchAll() expects parameter 1 to be long, string given in C:\Documents and Settings\driddle.AUTISMSPEAKS.000\My Documents\ascentral\sqlite_test.php on line 36'

Code to reproduce:

// retrieve and output info from db
$sqlGetEvent = 'SELECT * from calendarItem';
$result = $dbHandle->query($sqlGetEvent);
$data = $result->fetchAll(PDO_FETCH_ASSOC);
dennis at inmarket dot lviv dot ua
07-Apr-2007 03:18
Regarding the two previous notes - I downloaded the "latest CVS" a week ago for Windows and was surprised to notice that this issue is gone there, ie you don't have to close cursor before doing next query.
redcube
05-Apr-2007 11:53
as an alternative for marcini's note:

just clear the statement variable before you issue another query:

<?php

$stmt
= $db->prepare('SELECT * FROM test');

// fetch only the first row
$row = $stmt->fetch(PDO::FETCH_ASSOC);

// clear the variable so its contents are destroyed (including the other rows in the result)
$stmt = null;

// now you can issue another query
$stmt = $db->prepare('SELECT * FROM test2');
?>
marcini
02-Apr-2007 01:41
Be careful with fetch() when you use prepared statements and MySQL (I don`t know how it is with other databases). Fetch won`t close cursor and won`t let you send any other query, even if your result set has only one row, .
If you use $statement->fetch(), you will also have to use $statement->closeCursor() afterwards, to be albe to execute another query.
Alternatively you can use $statement->fetchAll() without $statement->closeCursor().
terry at bitsoup dot com
02-Mar-2006 09:46
WARNING:
fetch() does NOT adhere to SQL-92 SQLSTATE standard when dealing with empty datasets.

Instead of setting the errorcode class to 20 to indicate "no data found", it returns a class of 00 indicating success, and returns NULL to the caller.

This also prevents the exception mechainsm from firing.

Programmers will need to explicitly code tests for empty resultsets after any fetch*() instead of relying on the default behavior of the RDBMS.

I tried logging this as a bug, but it was dismissed as "working as intended". Just a head's up.
avinoamr at gmail dot com
19-Jan-2006 11:48
Note that using the FETCH_CLASS mechanism does NOT trigger the class's constructor! You must explicity instantiate the class to use it's constructor behavior.
fh at ez dot no
25-Nov-2005 09:13
I can also add that the constructor is run _after_ the data is set on the object if yo use PDO::FETCH_CLASS.
fh at ez dot no
25-Nov-2005 08:58
If you want to use PDO::FETCH_CLASS you need to set it up with setFetchMode first like so:
        $stmt->setFetchMode( PDO::FETCH_CLASS, 'classType', array( 'parameters to constructor' );
        $object = $stmt->fetch( PDO::FETCH_CLASS );
If you ommit this PHP will segfault.
aledmb at gmail dot com
21-Oct-2005 07:22
note that fetch constants are not included in the PDO class for PHP versions prior to 5.1

PDOStatement->fetchAll> <PDOStatement->execute
Last updated: Fri, 03 Oct 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites