PHP 5.5.16 is released

PDOStatement::fetchAll

(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)

PDOStatement::fetchAll Devuelve un array que contiene todas las filas del conjunto de resultados

Descripción

public array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )

Parámetros

fetch_style

Controla el contenido del array devuelto, tal como está documentado en PDOStatement::fetch(). El valor predeterminado es PDO::ATTR_DEFAULT_FETCH_MODE (el cual por defecto es PDO::FETCH_BOTH).

Para devolver un array que contenga todos los valores de una única columna del conjunto de resultados, se debe especificar PDO::FETCH_COLUMN. Se puede especificar qué columna se desea obtener con el parámetro column-index.

Para obtener solamente los valores únicos de una sola columna del conjunto de resultados, se ha de realizar un OR a nivel de bits de PDO::FETCH_COLUMN con PDO::FETCH_UNIQUE.

Para devolver un array asociativo agrupado según los valores de una columna especificada, se ha de realilar un OR a nivel de bits de PDO::FETCH_COLUMN con PDO::FETCH_GROUP.

fetch_argument

Este argumento tiene un significado diferente dependiendo del valor del parámetro fetch_style:

  • PDO::FETCH_COLUMN: Devuelve la columna con el índice indicado basado en 0.

  • PDO::FETCH_CLASS: Devuelve instancias de la clase especificada, haciendo corresponder las columnas de cada fila con las propiedades con nombre de la clase.

  • PDO::FETCH_FUNC: Devuelve el resultado de llamar a la función especificada, usando cada columna de fila como parámetro de la llamada.

ctor_args

Los argumentos del constructor de la case cuando el parámetro fetch_style es PDO::FETCH_CLASS.

Valores devueltos

PDOStatement::fetchAll() devuelve un array que contiene tadas las filas restantes del conjunto de resultados. El array representa cada fila como un array con valores de las columnas, o como un objeto con propiedades correspondientes a cada nombre de columna. Es devuelto un array vacío si hay cero resultados que obtener, o FALSE en caso de fallo.

Usar este método para obtener conjuntos de resultados grandes dará como resultado una fuerte demanda del sistema y, posiblemente, de los recursos de red. En lugar de recuperar todos los datos y manipularlos en PHP, considérese usar el servidor de bases de datos para manipular los conjuntos de resultados. Por ejemplo, se pueden usar las cláusulas WHERE y ORDER BY en sentencias SQL para restringir el resultado antes de recuperarlos y procesarlos con PHP.

Ejemplos

Ejemplo #1 Obtener todas las filas restantes de un conjunto de resultados

<?php
$gsent 
$gbd->prepare("SELECT name, colour FROM fruit");
$gsent->execute();

/* Obtener todas las filas restantes del conjunto de resultados */
print("Obtener todas las filas restantes del conjunto de resultados:\n");
$resultado $gsent->fetchAll();
print_r($resultado);
?>

El resultado del ejemplo sería algo similar a:

Obtener todas las filas restantes del conjunto de resultados:
Array
(
    [0] => Array
        (
            [NAME] => pear
            [0] => pear
            [COLOUR] => green
            [1] => green
        )

    [1] => Array
        (
            [NAME] => watermelon
            [0] => watermelon
            [COLOUR] => pink
            [1] => pink
        )

)

Ejemplo #2 Obtener todos los valores de una única columna de un conjunto de resultados

El siguiente ejemplo demuestra cómo devolver todos los valores de una única columna de un conjunto de resultados, incluso si la sentencia SQL podría devolver múltiples columnas por cada fila.

<?php
$gsent 
$gbd->prepare("SELECT name, colour FROM fruit");
$gsent->execute();

/* Obtener todos los valores de la primera columna */
$resultado $gsent->fetchAll(PDO::FETCH_COLUMN0);
var_dump($resultado);
?>

El resultado del ejemplo sería algo similar a:

Array(3)
(
    [0] =>
    string(5) => apple
    [1] =>
    string(4) => pear
    [2] =>
    string(10) => watermelon
)

Ejemplo #3 Agrupar todos los valores según una única columna

El siguiente ejemplo demuestra cómo devolver un array asociativo agrupado según los valores de la columna especificada del conjunto de resultados. El array contiene tres claves: los valores apple y pear son devueltos como arrays que contienen dos colores diferentes, mientras que watermelon es devuelto como un array que contiene un solo color.

<?php
$insert 
$gbd->prepare("INSERT INTO fruit(name, colour) VALUES (?, ?)");
$insert->execute(array('apple''green'));
$insert->execute(array('pear''yellow'));

$gsent $gbd->prepare("SELECT name, colour FROM fruit");
$gsent->execute();

/* Agrupar valores según la primera columna */
var_dump($gsent->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP));
?>

El resultado del ejemplo sería algo similar a:

array(3) {
  ["apple"]=>
  array(2) {
    [0]=>
    string(5) "green"
    [1]=>
    string(3) "red"
  }
  ["pear"]=>
  array(2) {
    [0]=>
    string(5) "green"
    [1]=>
    string(6) "yellow"
  }
  ["watermelon"]=>
  array(1) {
    [0]=>
    string(5) "green"
  }
}

Ejemplo #4 Instanciar una clase para cada resultado

El siguiente ejemplo demuestra el comportamiento del estilo de obtención de PDO::FETCH_CLASS.

<?php
class fruit {
    public 
$name;
    public 
$colour;
}

$gsent $gbd->prepare("SELECT name, colour FROM fruit");
$gsent->execute();

$resultado $gsent->fetchAll(PDO::FETCH_CLASS"fruit");
var_dump($resultado);
?>

El resultado del ejemplo sería algo similar a:

array(3) {
  [0]=>
  object(fruit)#1 (2) {
    ["name"]=>
    string(5) "apple"
    ["colour"]=>
    string(5) "green"
  }
  [1]=>
  object(fruit)#2 (2) {
    ["name"]=>
    string(4) "pear"
    ["colour"]=>
    string(6) "yellow"
  }
  [2]=>
  object(fruit)#3 (2) {
    ["name"]=>
    string(10) "watermelon"
    ["colour"]=>
    string(4) "pink"
  }
}

Ejemplo #5 Invocar a una función por cada resultado

El siguiente ejemplo demuestra el comportamiento del estilo de obtención de PDO::FETCH_FUNC.

<?php
function fruit($name$colour) {
    return 
"{$name}{$colour}";
}

$gsent $gbd->prepare("SELECT name, colour FROM fruit");
$gsent->execute();

$resultado $gsent->fetchAll(PDO::FETCH_FUNC"fruit");
var_dump($resultado);
?>

El resultado del ejemplo sería algo similar a:

array(3) {
  [0]=>
  string(12) "apple: green"
  [1]=>
  string(12) "pear: yellow"
  [2]=>
  string(16) "watermelon: pink"
}

Ver también

add a note add a note

User Contributed Notes 16 notes

up
15
Ant P.
5 years ago
You might find yourself wanting to use FETCH_GROUP and FETCH_ASSOC at the same time, to get your table's primary key as the array key:
<?php
// $stmt is some query like "SELECT rowid, username, comment"
$results = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);

// It does work, but not as you might expect:
$results = array(
   
1234 => array(0 => array('username' => 'abc', 'comment' => '[...]')),
   
1235 => array(0 => array('username' => 'def', 'comment' => '[...]')),
);

// ...but you can at least strip the useless numbered array out easily:
$results = array_map('reset', $results);
?>
up
3
fractalesque at gmail dot com
2 months ago
to fetch rows grouped by primary id or any other field you may use FETCH_GROUP with FETCH_UNIQUE:

<?php

//prepare and execute a statement returning multiple rows, on a single one
$stmt = $db->prepare('SELECT id,name,role FROM table');
$stmt->execute();
var_dump($stmt->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE));

//returns an array with the first selected field as key containing associative arrays with the row. This mode takes care not to repeat the key in corresponding grouped array.

$result = array
(
1 => array
   (
'name'=>'foo',
   
'role'=>'sage',),
 
2 => array
   (
'name'=>'bar',
   
'role'=>'rage',),);

// 'SELECT name,id,role FROM table' would result in that:

$result = array
(
'foo' => array
   (
'id'=>1,
   
'role'=>'sage',),
 
'bar' => array
   (
'id'=>2,
   
'role'=>'rage',),);

?>
up
6
esw at pixeloution dot removeme dot com
4 years ago
Interestingly enough, when you use fetchAll, the constructor for your object is called AFTER the properties are assigned. For example:

<?php
class person {
    public
$name;

    function
__construct() {
      
$this->name = $this->name . " is my name.";
    }
}

# set up select from a database here with PDO
$obj = $STH->fetchALL(PDO::FETCH_CLASS, 'person');
?>

Will result in ' is my name' being appended to all the name columns. However if you call it slightly differently:

<?php
$obj
= $obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');
?>

Then the constructor will be called before properties are assigned. I can't find this documented anywhere, so I thought it would be nice to add a note here.
up
4
Daniel Hofmann
5 years ago
PLEASE BE AWARE: If you do an OUTER LEFT JOIN and set PDO FetchALL to PDO::FETCH_ASSOC, any primary key you used in the OUTER LEFT JOIN will be set to a blank if there are no records returned in the JOIN.

For example:
<?php
//query the product table and join to the image table and return any images, if we have any, for each product
$sql = "SELECT * FROM product, image
LEFT OUTER JOIN image ON (product.product_id = image.product_id)"
;

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($array);
?>

The resulting array will look something like this:

Array
(
    [0] => Array
        (
            [product_id] =>
            [notes] => "this product..."
            [brand] => "Best Yet"
            ...

The fix is to simply specify your field names in the SELECT clause instead of using the * as a wild card, or, you can also specify the field in addition to the *. The following example returns the product_id field correctly:

<?php
$sql
= "SELECT *, product.product_id FROM product, image
LEFT OUTER JOIN image ON (product.product_id = image.product_id)"
;

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($array);
?>

The resulting array will look something like this:

Array
(
    [0] => Array
        (
            [product_id] => 3
            [notes] => "this product..."
            [brand] => "Best Yet"
            ...
up
7
harlequin2 at gmx dot de
6 years ago
There is also another fetch mode supported on Oracle and MSSQL:
PDO::FETCH_ASSOC

> fetches only column names and omits the numeric index.

If you would like to return all columns from an sql statement with column keys as table headers, it's as simple as this:

<?php
$dbh
= new PDO("DS", "USERNAME", "PASSWORD");
$stmt = $dbh->prepare("SELECT * FROM tablename");
$stmt->execute();
$arrValues = $stmt->fetchAll(PDO::FETCH_ASSOC);
// open the table
print "<table wdith=\"100%\">\n";
print
"<tr>\n";
// add the table headers
foreach ($arrValues[0] as $key => $useless){
    print
"<th>$key</th>";
}
print
"</tr>";
// display data
foreach ($arrValues as $row){
    print
"<tr>";
    foreach (
$row as $key => $val){
        print
"<td>$val</td>";
    }
    print
"</tr>\n";
}
// close the table
print "</table>\n";
?>
up
6
Anonymous
6 years ago
If no rows have been returned, fetchAll returns an empty array.
up
4
Anonymous
3 years ago
Note that fetchAll() can be extremely memory inefficient for large data sets. My memory limit was set to 160 MB this is what happened when I tried:

<?php
$arr
= $stmt->fetchAll();
// Fatal error: Allowed memory size of 16777216 bytes exhausted
?>

If you are going to loop through the output array of fetchAll(), instead use fetch() to minimize memory usage as follows:

<?php
while ($arr = $stmt->fetch()) {
    echo
round(memory_get_usage() / (1024*1024),3) .' MB<br />';
   
// do_other_stuff();
}
// Last line for the same query shows only 28.973 MB usage
?>
up
1
michael dot arnauts at gmail dot com
6 months ago
If you want to use PDO::FETCH_CLASS but don't like that all the values are of the type string, you can always use the __construct function of the class specified to convert them to a different type.

Another way is using mysqlnd, but it seems I had to recompile PHP for that.

<?php

class Cdr {
    public
$a; // int
   
public $b; // float
   
public $c; // string
   
   
public function __construct() {
       
$this->a = intval($this->a);
       
$this->b = floatval($this->b);
    }
    
}

// ...
$arrCdrs = $objSqlStatement->fetchAll(PDO::FETCH_CLASS, 'Cdr');

?>
up
0
GyoreG
2 months ago
If you would like to get the result as "key-value-pairs", like:

Array(
    [key1] => "value1"
    [key2] => "value2"
)

then you can do it by calling fetchAll with PDO::FETCH_GROUP | PDO::FETCH_COLUMN parameters.

<?php
  $result
= $query->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN);
?>
up
0
Dennis
4 years ago
Error:
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

If you're using something like:

while ($row = $query->fetchObject()) {
    [...]
}

try using this instead:

$rows = $query->fetchAll(PDO::FETCH_CLASS, 'ArrayObject');

foreach ($rows as $row) {
    [...]
}
up
0
mxrgus
4 years ago
In method body:

return $pstmt->fetchAll() or die("bad");

will not return correct value, but "1" instead.
up
0
davey at php dot net
5 years ago
When passing PDO::FETCH_CLASS as the first argument, this method will accept the class name as the second option:

<?php
$query
= $pdo->prepare($sql);

$result = $query->execute($values);

if (
$result && $query->rowCount() > 0) {
   
$records = $query->fetchAll(PDO::FETCH_CLASS, 'Some_Class');
   
// $record is now an array of Some_Class objects
}
?>

- Davey
up
0
mrshelly at hotmail dot com
5 years ago
PHP fetchAll Data From SQL Server 2005
if field's data type is varchar(nvarchar), only fetch 255 chars. but the "text" data type is ok.

so, notice! to change the 'varchar' or 'nvarchar' (length > 255) to 'text' data type..

hope to help u.

<?php

$user
= 'sa';
$pass = 'pass';

$conn = new PDO('mssql:host=127.0.0.1; dbname=tempdb;', $user, $pass);

$mainSQL = "SELECT field_varchar, field_text FROM table1";
$sth = $conn->prepare($mainSQL);
$sth->setFetchMode(PDO::FETCH_ASSOC);
$sth->execute();
$retRows = $sth->fetchAll();
// the field_varchar field only to fetch 255 chars(max)
// the field_text is ok.

var_dump($retRows);

unset(
$sth); unset($conn);

?>
up
-1
Hayley Watson
3 years ago
If you use the PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE flags to map columns to object properties, fetchAll() will use any __set() method your object has when carrying out the mapping.
up
-1
stas at metalinfo dot ru
7 years ago
Note, that you can use PDO::FETCH_COLUMN|PDO::FETCH_GROUP pair only while selecting two columns, not like DB_common::getAssoc(), when grouping is set to true.
up
-1
ramon at monztro dot com
2 years ago
If you are trying to call PDOStatement::fetchAll and is not getting the result set as expected (empty instead), check if you called PDOStatement::execute first.

Remember PDOStatement::fetchAll does not execute the query, it just mounts the array.

:)
To Top