Conjuntos de resultados
Una consulta Select siempre devolverá un objeto conjunto de resultados que contiene cero o más registros. Hay varias maneras de obtener datos de este conjunto de resultados dependiendo del caso de uso. Por defecto, los registros se extraen como objetos, a menos que cambie el modo de extracción (ver: setFetchMode).
El caso más común es iterar sobre el conjunto de resultados usando un ciclo foreach().
// Consulta estática:
$result = $connection->query("SELECT field1, field2 FROM {mytable}");
foreach ($result as $record) {
// Hacer algo con cada $record
}
// Consulta dinámica
$result = $query->execute();
foreach ($result as $record) {
// Hacer algo con cada $record.
}
Sin embargo, dependiendo del uso que se le dé a los resultados, existen varias otras formas de obtener registros.
Para obtener explícitamente el siguiente registro, use:
$record = $result->fetch(); // Usa el modo de extracción por defecto.
$record = $result->fetchObject(); // Extrae como un objeto stdClass.
$record = $result->fetchAssoc(); // Extrae como un arreglo asociativo.
Si no hay un siguiente registro, se devuelve FALSE. Normalmente se recomienda evitar fetch() en favor de fetchObject() y fetchAssoc(), ya que estos últimos son más autodescriptivos. Si necesita usar cualquier otro modo de extracción soportado por PDO, use fetch().
Para obtener solo un campo del conjunto de resultados, use:
$record = $result->fetchField($column_index);
El valor por defecto de $column_index es 0, es decir, el primer campo.
Para contar la cantidad de filas afectadas por una sentencia DELETE, INSERT o UPDATE, use:
$number_of_rows = $result->rowCount();
Para contar la cantidad de filas devueltas por una sentencia SELECT, use:
$number_of_rows = $connection->select('mytable')->countQuery()->execute()->fetchField();
Para extraer todos los registros de una vez en un solo arreglo, use uno de los siguientes:
// Recuperar todos los registros en un arreglo indexado de objetos stdClass.
$result->fetchAll();
// Recuperar todos los registros en un arreglo asociativo con claves del campo especificado.
$result->fetchAllAssoc($field);
// Recuperar un conjunto de resultados de 2 columnas como un arreglo asociativo campo0 => campo1.
$result->fetchAllKeyed();
// También puede especificar qué dos campos usar indicando sus números de columna
$result->fetchAllKeyed(0,2); // sería campo 0 => campo 2
$result->fetchAllKeyed(1,0); // sería campo 1 => campo 0
// Si necesita un arreglo donde las claves y valores contienen el mismo campo (por ejemplo, para crear un elemento de formulario 'checkboxes'), el siguiente método es perfectamente válido:
$result->fetchAllKeyed(0,0); // sería campo 0 => campo 0, por ejemplo [article] => [article]
// Recuperar un conjunto de resultados de 1 columna como un arreglo simple.
$result->fetchCol();
// Se puede especificar el número de columna, si no se especifica, por defecto es la primera columna
$result->fetchCol($column_index);
Tenga en cuenta que fetchAll() y fetchAllAssoc() por defecto extraerán usando cualquier modo de extracción establecido en la consulta (arreglo numérico, arreglo asociativo u objeto). Esto puede cambiarse pasando una nueva constante de modo de extracción. Para fetchAll() es el primer parámetro. Para fetchAllAssoc() es el segundo parámetro. Ejemplos:
// Obtener un arreglo de arreglos con claves basadas en el campo 'id'.
$result->fetchAllAssoc('id', PDO::FETCH_ASSOC);
// Obtener un arreglo de arreglos con claves numéricas y asociativas.
$result->fetchAll(PDO::FETCH_BOTH);
Dado que PHP soporta llamadas en cadena de métodos sobre objetos retornados, a menudo la variable $result se omite completamente, por ejemplo:
// Obtener un arreglo asociativo de ids a títulos.
$examples = $connection->query("SELECT id, title FROM {mytable}")->fetchAllKeyed();
// Obtener un solo registro de la base de datos.
$myobj = $connection->query("SELECT * FROM {mytable} WHERE example = :example", [':example' => $example])->fetchObject();
// Obtener un solo valor de la base de datos.
$myval = $connection->query("SELECT example FROM {mytable} WHERE id = :id", [':id' => $id])->fetchField();
Si necesita un arreglo simple como [1, 2, 3, 4, 5], tendrá que conformarse con algo más parecido a [1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5]. Puede obtener esto con:
$ids = $connection->query("SELECT id FROM {example}")->fetchAllKeyed(0,0);