|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [2010-03-16 18:24 UTC] kenaniah at gmail dot com
 Description:
------------
Currently, PDO::FETCH_FUNC can only be used in the PDOStatement::fetchAll() method. This fetch mode, however, is essentially useless since it can not be set using setFetchMode() or fetch(), and thus can not be used in iteration. 
Test script:
---------------
<?php
$db = new PDO(...);
$stmt = $db->execute("SELECT * FROM foobar");
$stmt->setFetchMode(PDO::FETCH_FUNC, 'var_dump');
foreach($stmt as $row):
    ...
endforeach;
?>
Expected result:
----------------
PDO should set the fetch mode to FETCH_FUNC, and should call var_dump() when $stmt is iterated. Because no additional fetch modes were passed to setFetchMode(), var_dump() should receive an argument representing the row in PDO::FETCH_BOTH format. $row should be set to the return of var_dump(), and control should now be passed to the foreach codeblock.
IMHO, FETCH_FUNC should allow one to provide a callback function that allows full manipulation of the row before being passed into the iteration codeblock. For example, in an active record implementation, one would have to set the FETCH_CLASS method and suffer a very costly object instantiation. A callback function would allow me to clone an existing (and fully loaded) object, set my properties, and return it -- saving me upwards of 90% in execution costs for heavy objects.
Actual result:
--------------
Warning: PDOStatement::setFetchMode() [pdostatement.setfetchmode]: SQLSTATE[HY000]: General error: PDO::FETCH_FUNC is only allowed in PDOStatement::fetchAll()
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Fri Oct 31 01:00:01 2025 UTC | 
you can use call_user_func_array : $db = new PDO(...); $stmt = $db->execute("SELECT * FROM foobar"); $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach($stmt as $row): call_user_func_array('var_dump', $row); endforeach;