Además de métodos convenientes como fetchAll() e
insert() documentados en Zend_Db_Adapter, puede usar un objeto de sentencia para
obtener más opciones a la hora de ejecutar consultas y recuperar conjuntos de resultados.
Esta sección describe cómo obtener una instancia de un objeto de sentencia y cómo usar sus
métodos.
Zend_Db_Statement se basa en el objeto PDOStatement de la
extensión PHP Data Objects.
Normalmente, un objeto de sentencia se devuelve mediante el método
query() de la clase Adapter de la base de datos.
Este método es una forma general de preparar cualquier sentencia
SQL. El primer argumento es una cadena que contiene una
sentencia SQL. El segundo argumento, opcional, es un
array de valores a enlazar con los marcadores de posición de parámetros en la cadena
SQL.
Ejemplo 27.36. Creación de un objeto de sentencia SQL con query()
$stmt = $db->query(
'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?',
array('goofy', 'FIXED')
);
El objeto de sentencia corresponde a una sentencia SQL que ha sido preparada, y ejecutada una vez con los valores de enlace especificados. Si la sentencia era una consulta SELECT u otro tipo de sentencia que devuelve un conjunto de resultados, ya está lista para recuperar resultados.
Puede crear una sentencia con su constructor, pero este es un uso menos habitual. No existe un método de fábrica para crear este objeto, por lo que necesita cargar la clase de sentencia específica y llamar a su constructor. Pase el objeto Adapter como primer argumento, y una cadena que contenga una sentencia SQL como segundo argumento. La sentencia se prepara, pero no se ejecuta.
Ejemplo 27.37. Uso de un constructor de sentencia SQL
$sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?'; $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
Necesita ejecutar un objeto de sentencia si lo crea usando su constructor, o si desea
ejecutar la misma sentencia varias veces. Use el método
execute() del objeto de sentencia. El único argumento es un
array de valores a enlazar con los marcadores de posición de parámetros en la
sentencia.
Si utiliza parámetros posicionales, o aquellos que se marcan con un símbolo de interrogación ('?'), pase los valores de enlace en un array simple.
Ejemplo 27.38. Ejecución de una sentencia con parámetros posicionales
$sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
$stmt = new Zend_Db_Statement_Mysqli($db, $sql);
$stmt->execute(array('goofy', 'FIXED'));
Si utiliza parámetros con nombre, o aquellos que se indican mediante un identificador de cadena precedido por un carácter de dos puntos (':'), pase los valores de enlace en un array asociativo. Las claves de este array deben coincidir con los nombres de los parámetros.
Ejemplo 27.39. Ejecución de una sentencia con parámetros con nombre
$sql = 'SELECT * FROM bugs WHERE ' .
'reported_by = :reporter AND bug_status = :status';
$stmt = new Zend_Db_Statement_Mysqli($db, $sql);
$stmt->execute(array(':reporter' => 'goofy', ':status' => 'FIXED'));
Las sentencias PDO admiten tanto parámetros posicionales
como parámetros con nombre, pero no ambos tipos en una misma sentencia
SQL. Algunas de las clases
Zend_Db_Statement para extensiones que no son PDO pueden
admitir solo un tipo de parámetro u otro.
Puede llamar a métodos del objeto de sentencia para recuperar filas de sentencias
SQL que producen un conjunto de resultados.
SELECT, SHOW,
DESCRIBE y EXPLAIN son
ejemplos de sentencias que producen un conjunto de resultados. INSERT,
UPDATE y DELETE son ejemplos de
sentencias que no producen un conjunto de resultados. Puede ejecutar estas últimas
sentencias SQL usando Zend_Db_Statement,
pero no puede llamar a métodos para recuperar filas de resultados de ellas.
Para recuperar una fila del conjunto de resultados, use el método
fetch() del objeto de sentencia.
Los tres argumentos de este método son opcionales:
El estilo de recuperación (fetch style) es el primer argumento. Controla la estructura en la que se devuelve la fila. Vea este capítulo para una descripción de los valores válidos y los formatos de datos correspondientes.
La orientación del cursor es el segundo argumento. El valor predeterminado es
Zend_Db::FETCH_ORI_NEXT, que simplemente significa que cada llamada afetch()devuelve la siguiente fila del conjunto de resultados, en el orden devuelto por el RDBMS.El desplazamiento (offset) es el tercer argumento. Si la orientación del cursor es
Zend_Db::FETCH_ORI_ABS, entonces el número de desplazamiento es el número ordinal de la fila a devolver. Si la orientación del cursor esZend_Db::FETCH_ORI_REL, entonces el número de desplazamiento es relativo a la posición del cursor antes de que se llamara afetch().
fetch() devuelve FALSE si ya se han
recuperado todas las filas del conjunto de resultados.
Ejemplo 27.40. Uso de fetch() en un bucle
$stmt = $db->query('SELECT * FROM bugs');
while ($row = $stmt->fetch()) {
echo $row['bug_description'];
}
Vea también PDOStatement::fetch().
Para recuperar todas las filas del conjunto de resultados en un solo paso, use el
método fetchAll(). Esto equivale a llamar
al método fetch() en un bucle y devolver todas
las filas en un array. El método fetchAll() acepta
dos argumentos. El primero es el estilo de recuperación, como se describió
anteriormente, y el segundo indica el número de la columna a devolver,
cuando el estilo de recuperación es Zend_Db::FETCH_COLUMN.
Ejemplo 27.41. Uso de fetchAll()
$stmt = $db->query('SELECT * FROM bugs');
$rows = $stmt->fetchAll();
echo $rows[0]['bug_description'];
Vea también PDOStatement::fetchAll().
Por defecto, el objeto de sentencia devuelve las filas del conjunto de resultados
como arrays asociativos, asignando los nombres de columna a los valores de columna.
Puede especificar un formato diferente para que la clase de sentencia
devuelva las filas, tal como puede hacerlo en la clase Adapter. Puede usar
el método setFetchMode() del objeto de sentencia
para especificar el modo de recuperación. Especifique el modo de recuperación usando
las constantes de la clase Zend_Db: FETCH_ASSOC,
FETCH_NUM, FETCH_BOTH,
FETCH_COLUMN y FETCH_OBJ.
Vea este capítulo
para más información sobre estos modos. Las siguientes llamadas a los métodos de
sentencia fetch() o fetchAll() usan el
modo de recuperación que especifique.
Ejemplo 27.42. Establecimiento del modo de recuperación
$stmt = $db->query('SELECT * FROM bugs');
$stmt->setFetchMode(Zend_Db::FETCH_NUM);
$rows = $stmt->fetchAll();
echo $rows[0][0];
Vea también PDOStatement::setFetchMode().
Para devolver una única columna de la siguiente fila del conjunto de resultados,
use fetchColumn(). El argumento opcional es el
índice entero de la columna, y su valor predeterminado es 0. Este método
devuelve un valor escalar, o FALSE si ya se han
recuperado todas las filas del conjunto de resultados.
Observe que este método se comporta de forma diferente al método
fetchCol() de la clase Adapter.
El método fetchColumn() de una sentencia devuelve un
único valor de una fila.
El método fetchCol() de un adaptador devuelve un
array de valores, tomados de la primera columna de todas las filas del
conjunto de resultados.
Ejemplo 27.43. Uso de fetchColumn()
$stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
$bug_status = $stmt->fetchColumn(2);
Vea también PDOStatement::fetchColumn().
Para recuperar una fila del conjunto de resultados estructurada como un objeto,
use fetchObject(). Este método admite dos
argumentos opcionales. El primer argumento es una cadena que indica el
nombre de la clase del objeto a devolver; el valor predeterminado es
'stdClass'. El segundo argumento es un array de valores que
se pasarán al constructor de esa clase.
Ejemplo 27.44. Uso de fetchObject()
$stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
$obj = $stmt->fetchObject();
echo $obj->bug_description;
Vea también PDOStatement::fetchObject().