TigerZF
🌐Español

27.2. Zend_Db_Statement

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.

27.2.1. Creación de una sentencia

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);

27.2.2. Ejecución de una sentencia

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.

27.2.3. Recuperación de resultados de una sentencia SELECT

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.

27.2.3.1. Recuperación de una única fila de un conjunto de resultados

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 a fetch() 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 es Zend_Db::FETCH_ORI_REL, entonces el número de desplazamiento es relativo a la posición del cursor antes de que se llamara a fetch().

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().

27.2.3.2. Recuperación de un conjunto de resultados completo

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().

27.2.3.3. Cambio del modo de recuperación

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().

27.2.3.4. Recuperación de una única columna de un conjunto de resultados

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().

27.2.3.5. Recuperación de una fila como un objeto

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().